目录

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)

同时火把和萤石都具有照亮一定范围的能力,则没有光的地方就会有小怪

游戏任务:

                        ​火把的照亮范围    ​                                                                                                                                                          ​  萤石的照亮范围

              数组小游戏---火把萤石_代码实现                                                                        数组小游戏---火把萤石_i++_02

则火把的范围是十字形,而萤石的范围是一个矩形。现在需要我们去计算有多少个地方有怪物

分析以及算法

对于城市的范围定义:和轰炸游戏一样可以直接输入阶数即可

火把和萤石光亮的范围:

火把​:以火把位置为中心(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());

}

特殊值测试:

数组小游戏---火把萤石_数组_03                               数组小游戏---火把萤石_代码实现_04

扩大世界阶数:

数组小游戏---火把萤石_数组_05

世界阶数极限:

数组小游戏---火把萤石_代码实现_06






更多内容详见微信公众号:Python研究所

数组小游戏---火把萤石_数组_07