目錄
1>前言
2>游戲背景
3>游戲任務
4>分析以及演算法
5>思路
6>代碼實作
前言:
自己平時練習所寫,主要是使用了陣列去存盤和for回圈去完成該小游戲,代碼經驗有限比較粗糙,如果有錯誤的地方請多多包涵我會改正,最后感謝閱讀~.
游戲背景:
在一個平坦世界(可看作是NxN的矩陣),現在有m個火把和n個螢石,現在分別放在
火把位置:(x1,y1) (x2,y2) (x3 y3)----(xm ym)
螢石位置:(p1,q1) (p2,q2) (p3,q3)----(pn,qn)
同時火把和螢石都具有照亮一定范圍的能力,則沒有光的地方就會有小怪
游戲任務:
火把的照亮范圍 螢石的照亮范圍

則火把的范圍是十字形,而螢石的范圍是一個矩形,現在需要我們去計算有多少個地方有怪物
分析以及演算法
對于城市的范圍定義:和轟炸游戲一樣可以直接輸入階數即可
火把和螢石光亮的范圍:
火把:以火把位置為中心(x,y),除了四個頂點的位置首先是一個矩形,可以利用位置計算出,頂點位置單獨計算即可,
(x-2,y)
(x-1,y-1) (x-1,y) (x-1,y+1)
(x,y-2) (x,y-1) (x,y) (x,y+1) (x,y+2)
(x+1,y-1) (x+1,y) (x+1,y+1)
(x+2,y)
上下左右一行標記,上下(x+/-2)標記
螢石:
(x-2,y-2) (x-2,y-1) (x-2,y) (x-2,y+1) (x-2,y+2)
(x-1,y-2) (x-1,y-1) (x-1,y) (x-1,y+1) (x-1,y+2)
(x,y-2) (x,y-1) (x,y) (x,y+1) (x,y+2)
(x+1,y-2) (x+1,y-1) (x+1,y) (x+1,y+1) (x+1,y+2)
(x+2,y-2) (x+2,y-1) (x+2,y) (x+2,y+1) (x+2,y+2)
上下左右兩行標記
由此可知火把和螢石的照亮范圍相差為定值,為了減少計算可以定義一個函式通過不同引數去呼叫即可,避免重復定義函式,
初始化二維陣列時可以置零,如果點在火把或者螢石的范圍內即可置1,這樣最后相減可以得到怪物的數量
思路
首先定義陣列存盤世界的面積,同時定義一個統計變數------>輸入火把和螢石的個數并分別輸入對應的坐標------>處理火把和螢石的范圍坐標------->輸出統計數量
螢石回圈是上下左右五行,火把是回圈小正方形+四個頂點
代碼實作
#include<stdio.h>
#define maxsize 500
int world[maxsize][maxsize];
int m,n, k;//m=火把數量 n=螢石數量 k=世界面積階數
int x, y;
//定義一個通用函式
void light(int x,int y,int t)
{
for (int i = x - t; i < x + t; i++)
{
for (int j = y - t; j < y + t; j++)
{
if (i > k || i<1 || j>k || j < 1)
continue;//如果輸入點坐標過大超過了時間范圍該點跳過,不納入統計
else
world[i][j] = 1;
}
}
}
//螢石呼叫函式,因為是正方形上下左右無行則t=2
void ys(int x, int y)
{
light(x, y, 2);
}
//火把呼叫函式,去掉四個頂點是正方形則四個頂點單獨判斷即可
void hb(int x,int y)
{
light(x,y,1);
if (x + 2 <=k)
world[x + 2][y] = 1;//標記上方
if (x - 2 <=k)
world[x-2][y] = 1;//標記下方
if (x, y - 2 <=k)
world[x][y-2] = 1;//標記左方
if (x, y + 2 <= k)
world[x][y+2] = 1;//標記右方
}
//定義一個統計函式
int count()
{
int number = 0;//計數單位
for (int i = 0; i<k;i++)
{
for (int j = 0; j <k;j++)
{
if (world[i][j] ==0)
number++;
}
}
return number;
}
void main()
{
printf("輸入平坦時間的階數:");
scanf("%d",&k);
printf("輸入火把的個數:");
scanf("%d",&m);
for (int i = 1; i <= m; i++)
{
printf("第%d個火把的坐標:",i);
scanf("%d %d",&x,&y);
hb(x,y);
}
printf("輸入螢石的個數:");
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
printf("第%d個螢石的坐標:", i);
scanf("%d %d", &x, &y);
ys(x, y);
}
printf("該平坦世界中有怪物的數量為:%d",count());
}
特殊值測驗:

擴大世界階數:

世界階數極限:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/255300.html
標籤:其他
