目录
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());
}
特殊值测试:
扩大世界阶数:
世界阶数极限: