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

目录

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)

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

游戏任务:

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

              数组小游戏---火把萤石_第1张图片                                                                        数组小游戏---火把萤石_第2张图片

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

分析以及算法

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

火把和萤石光亮的范围:

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

特殊值测试:

数组小游戏---火把萤石_第3张图片                               数组小游戏---火把萤石_第4张图片

扩大世界阶数:

数组小游戏---火把萤石_第5张图片

世界阶数极限:

数组小游戏---火把萤石_第6张图片

 

 

 

你可能感兴趣的:(数据结构,数组,数据结构,数组,c语言)