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


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

    目录

    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测试和开发

  • 相关阅读:
    搜索引擎常用技巧
    WinRaR去广告弹窗
    逆向破解之160个CrackMe —— 003
    逆向破解之160个CrackMe —— 002
    逆向破解之160个CrackMe —— 001(下)
    逆向破解之160个CrackMe —— 001(中)
    逆向破解之160个CrackMe —— 001(上)
    VMWare虚拟机无法开启,显示模块“Disk”启动失败解决办法
    uefi+gpt重装系统提示需要安装到gpt分区盘解决办法
    neg与sbb指令的结合使用
  • 原文地址:https://www.cnblogs.com/phyger/p/14357691.html
Copyright © 2020-2023  润新知