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

此文转载自:https://blog.csdn.net/qq_46861651/article/details/113483985#commentBox

目录

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());

}

特殊值测试:

                               

扩大世界阶数:

世界阶数极限:

   

更多内容详见微信公众号:Python测试和开发

Python测试和开发

原文地址:https://www.cnblogs.com/phyger/p/14357589.html