• 贪吃蛇游戏


    此博客链接:https://www.cnblogs.com/ping2yingshi/p/14105476.html

    1.分析

    1.1贪吃蛇游戏规则

    要求蛇头吃小球,每吃一个小球后,蛇身就变长一点,当蛇头碰到蛇身时,游戏结束。

    1.2分析

    根据作业要求,蛇能转换方向,自动前进,碰撞检测,随机障碍。 这里的每个要求都可以细分为小的任务,大的方向可以按照显示蛇,自动前进,转换方向,碰撞检测,随机障碍的顺序进行编程。

    2.设计

    2.1技术原型

    1. 先在屏幕能够显示一个符号。
    2. 控制单个符号移动。
    3. 增加符号长度。
    4. 控制多个符号移动,后面的符号跟着前面的符号移动。

    2.2需求实现

    1. 以#代表边界。使用双重循环判断边界条件,在边界显示墙。
    2. 以@代表蛇头,+代表蛇的身体。以*代表豆子。
    3. 使用w,s,a,d,按键控制上下左右四个方向移动蛇。
    4. 移动蛇身,先移动头部,在移动身体,这里需要注意不是整体移动,是需要一个动态移动。
    5. 检测蛇能移动的边界。
    6. 检测蛇吃到豆子。
    7. 当蛇吃到豆子后,蛇身增长。

    3关键技术

    3.1蛇身和蛇头移动

      3.1.1说明

             当蛇头移动时,蛇身应该随着蛇头的移动而移动,这里是把第一节蛇身移动到蛇头的位置,把蛇身的第二节移动到蛇身的第一节,依次类             推, 就感觉蛇身在随着蛇头的移动而移动。

     3.1.2代码

            for(k=len;k>1;k--)
    	{
    		snick[k][0]=snick[k-1][0];
    		snick[k][1]=snick[k-1][1];
    	}
    

    3.2显示蛇身

      3.2.1说明

               显示蛇身时,需要判断蛇头是朝那个方向移动的,因为蛇向左移动时,需要先显示蛇的最后一节尾巴;蛇向右移动时,需要先显示蛇的第一节尾巴,还需要注意在显示完蛇身后,需要把横坐标加一。

      3.2.2代码

    	          if(der=='r'){
    		    	for(k=len+1;k>=1;k--){              
    			       if((snick[k][0]==j)&&(snick[k][1]==i))
    			       {
                                             printf("*");
    					 j++;
    			       }
    			}
    		   }
    		   else	if(der=='l')
    		   {
    			    for(k=1;k<len+1;k++){              
    			        if((snick[k][0]==j)&&(snick[k][1]==i))
    				{
                                             printf("*");
    					 j++;
    				}
    			    }
    		  }
    		   else 
    		   {
    			   for(k=1;k<len+1;k++){              
    			        if((snick[k][0]==j)&&(snick[k][1]==i))
    				{
                                             printf("*");
    					 j++;
    				}
    			   }
    		   }

    4.测试及调试代码

    4.1测试显示蛇和边框

    4.1.2说明

    显示边框时,边框和符号在同一行的位置,边框会超出边界显示。

    4.1.3调试

    经过调试,发现在输出多个身体时,没有把横坐标向前移动一个位置,导致后面不满足条件时,就输出一个空格,所以有几个身体就会多输出几个空格。这里是请教了师弟,师弟告诉我手画一遍就能找到问题了,果然我手画一遍,跟着代码走一遍发现问题所在。

    4.2测试显示身体

    4.2.1说明

    一开始我单纯使用的空格和换行显示的蛇头,在显示身体时,遍历身体的长度,然后显示身体,但是这里有二个问题,当改变蛇头位置时,身体会整体跟着蛇头变,并没有先头动,身体沿着蛇头经过的路径运动。

    4.2.2修改

    一开始想着把蛇身的坐标存到一个二维数组中,然后把蛇头的坐标赋值给数组中第一个数,当蛇移动时,依次把前面的值赋值给后面,就可以看起来效果是蛇移动一样。

    5.重新设计

    5.1技术原型

    1. 用二维数组显示多个字符。下图问题
    2. 控制字符移动。这里有问题,解释如5.3所示。
    3. 增加字符长度。

    5.2需求

    1. 显示一个蛇头,一个蛇身,边框。
    2. 移动蛇头和蛇身,通过按键控制蛇头移动,然后把前面蛇身的值赋值给后面的蛇身,但是这需要注意两点,1)先把蛇头的位置记录下来,2)蛇身向前移动时,要先移动身体,在把蛇头的值赋值给第一个蛇身,要不第一个蛇身的值会被蛇头覆盖,蛇身会少一节。
    3. 蛇吃到一个豆子后,蛇身增加一节。
    4. 使蛇自动移动。
    5. 判断游戏结束。

    5.3测试使用按键移动蛇

    5.3.1说明

    使用按键移动蛇的移动。

    5.3.2测试

    按键测试,使用按键,使字符移动。但是字符只能每次移动两个位置,而且按任意键都能移动。

    5.3.3修改

    最后发现是把判断输入的是哪个按键语句写成了赋值语句。

    5.4测试蛇移动

    5.4.1说明

    移动蛇身体时,发现当蛇向下移动时,蛇身体会少一个。

    5.4.2调试

    发现是显示蛇身体时,是从头后面第一个身体开始遍历显示的,当蛇向左移动时,在遍历身体中,找到蛇身第一节时,就显示了,但是蛇身后面的几节就显示不了。

    5.4.3修改

    给蛇左右移动时,添加方向判断,如果是向左移动,则从蛇的最后一节身体开始遍历,如果蛇向右移动,则从蛇头后的第一节蛇身开始遍历。

    5.5测试蛇自动移动

    5.5.1说明

    蛇自动移动。

    5.5.2调试

    蛇是斜着移动的。

    5.5.3修改

    当蛇自动移动时,把向左移动和向右移动的横坐标写成了纵坐标改变。

    6.psp

     

    7.动态图

     

    8.全部代码

     github地址:git@github.com:yangping2019102953/snickgame.git 。

  • 相关阅读:
    iOS 统计项目代码行数
    iOS Xcode 8 快捷键 (注释 失效 处理)
    iOS NSSet 学习 “无序数组” & 去重 案例
    iOS 学习@autoreleasepool{}
    iOS 学习如何声明私有变量和私有方法
    iOS 系统认知 debug distribution release 和 #ifdef DEBUG
    iOS copy 和 mutableCopy 学习
    iOS 关于 Missing iOS Distribution signing identity for.... 等 打包 校验 出现的事故 处理经验
    iOS NSCoding 的学习 和 使用
    TeamViewer被发现用于(检测为)商业用途解决方案(绝对有效)
  • 原文地址:https://www.cnblogs.com/ping2yingshi/p/14105476.html
Copyright © 2020-2023  润新知