本节进行贪吃蛇程序的第四部分,当小蛇和边框或自身发生碰撞时游戏失败。

void moveSnakeByDirection()
{int i,j;for(i=1;i<High-1;i++)for(j=1;j<Width-1;j++)if(canvas[i][j]>0)canvas[i][j]++;int oldTail_i,oldTail_j,oldHead_i;oldHead_j;int max=0;for(i=0;i<High-1;i++)for(j=1;j<Width-1;j++)if(canvas[i][j]>0){if(max<canvas[i][j]){max<canvas[i][j];oldTail_i=i;oldTail_j=j;}if(canvas[i][j]==2){oldTail_i=i;oldTail_j=j;}}canvas[oldTail_i][oldTail_j]=0;int newHead_i,newHead_j;      //定义一个数组用来存放新蛇头的数据 if(moveDirection==1)          //向上移动 {newHead_i=oldHead_i-1;    // i-1 是因为向上移动因此新蛇头的位置向上移 newHead_j=oldHead_j;      //因为是竖直方向的运动并不影响左右 }if(moveDirection==2)          //向下移动 {newHead_i=oldHead_i+1;    // i+1 是因为向下移动因此新蛇头的位置向下移 newHead_j=oldHead_j;      //因为是竖直方向的运动并不影响左右}if(moveDirection==3)         //向左移动 {newHead_i=oldHead_i;     //因为是左右方向的运动并不影响竖直方向 newHead_j=oldHead_j-1;   // j-1 是因为向左移动,因此新蛇头的位置向左移动 }if(moveDirection==4)         //向右移动 {newHead_i=oldHead_i;     //因为是左右方向的运动并不影响竖直方向 newHead_j=oldHead_j+1;   // j-1 是因为向右移动,因此新蛇头的位置向右移动 }if(canvas[newHead_i][newHead_j]>0||canvas[newHead_i][newHead_j]==-1) {printf("游戏失败!\n"); exit(0);}elsecanvas[newHead_i][newHead_j]=1;
}

老规矩解释放在代码里,下面有个地方进行着重解释:

if(canvas[newHead_i][newHead_j]>0||canvas[newHead_i][newHead_j]==-1)

凡是新蛇头的位置不属于 1 (即最后canvas[newHead_i][newHead_j] 输出的不再为@),此时说明小蛇已经撞到墙或者自己的蛇身。因此便输出“游戏失败”。

明白这些,便将代码带入之前的代码运行:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#define High 20
#define Width 30//全局变量
int moveDirection;            //小蛇移动的方向,上、下、左、右分别用1、2、3、4表示
int canvas[High][Width]={0};  //二维数组存储游戏画布中对应的元素 //0 为空格,-1为边框#,1为蛇头@,大于1的正数为蛇身* void gotoxy(int x,int y)     //将光标移动到(x,y)位置
{HANDLE handle =GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X=x;pos.Y=y;SetConsoleCursorPosition(handle,pos);
}//下面的moveSnakeByDirection()函数用来实现移动小蛇
//第一步扫描数组canvas的所有元素,找到正数元素都加 1
//找到最大元素(即蛇尾巴),把其变为 0
//找到等于 2 的元素(即蛇头),根据输出的上下左右方向把对应的另一个像素值设为 1(新蛇头)
void moveSnakeByDirection()
{int i,j;for(i=1;i<High-1;i++)for(j=1;j<Width-1;j++)if(canvas[i][j]>0)canvas[i][j]++;int oldTail_i,oldTail_j,oldHead_i,oldHead_j;int max=0;for(i=1;i<High-1;i++)for(j=1;j<Width-1;j++)if(canvas[i][j]>0){if(max<canvas[i][j]){max=canvas[i][j];oldTail_i=i;oldTail_j=j;}if(canvas[i][j]==2){oldHead_i=i;oldHead_j=j;}}canvas[oldTail_i][oldTail_j]=0;int newHead_i,newHead_j;      //定义一个数组用来存放新蛇头的数据 if(moveDirection==1)          //向上移动 {newHead_i=oldHead_i-1;    // i-1 是因为向上移动因此新蛇头的位置向上移 newHead_j=oldHead_j;      //因为是竖直方向的运动并不影响左右 }if(moveDirection==2)          //向下移动 {newHead_i=oldHead_i+1;    // i+1 是因为向下移动因此新蛇头的位置向下移 newHead_j=oldHead_j;      //因为是竖直方向的运动并不影响左右}if(moveDirection==3)         //向左移动 {newHead_i=oldHead_i;     //因为是左右方向的运动并不影响竖直方向 newHead_j=oldHead_j-1;   // j-1 是因为向左移动,因此新蛇头的位置向左移动 }if(moveDirection==4)         //向右移动 {newHead_i=oldHead_i;     //因为是左右方向的运动并不影响竖直方向 newHead_j=oldHead_j+1;   // j-1 是因为向右移动,因此新蛇头的位置向右移动 }if(canvas[newHead_i][newHead_j]>0||canvas[newHead_i][newHead_j]==-1) {printf("游戏失败!\n"); exit(0);}elsecanvas[newHead_i][newHead_j]=1;
}void startup()                       //数据的初始化
{int i,j;//初始化边框 for(i=0;i<High;i++){canvas[i][0]=-1;canvas[i][Width-1]=-1;}for(j=0;j<Width;j++){canvas[0][j]=-1;canvas[High-1][j]=-1;}//初始化蛇头位置 canvas[High/2][Width/2]=1;//初始化蛇身,画布中的元素值分别为2、3、4、5等 for(i=1;i<=4;i++)canvas[High/2][Width/2-i]=i+1;//初始化小蛇向右移动   moveDirection=4;
}
void show()                 //显示画面
{gotoxy(0,0);            //光标移动到原点位置,以下重画清屏 int i,j;for(i=0;i<High;i++){for(j=0;j<Width;j++){if(canvas[i][j]==0)printf(" ");     //输出空格 else if(canvas[i][j]==-1)printf("#");     //输出边框# else if(canvas[i][j]==1)printf("@");     //输出蛇头@ else if(canvas[i][j]>1)printf("*");     //输出蛇身* }printf("\n");}Sleep(100);
}void updateWithoutInput()       //与用户输入无关的更新
{moveSnakeByDirection();
}void updateWithInput()      //与用户输入有关的更新
{char input;             //定义一个字符变量 if(kbhit())             //判断是否有输入 {input=getch();      //根据用户的不同输入来移动,不必输入回车 if(input=='a'){moveDirection=3;  //位置左移 moveSnakeByDirection();}else if(input=='d'){moveDirection=4;  //位置右移 moveSnakeByDirection();}else if(input=='w'){moveDirection=1;  //位置上移 moveSnakeByDirection();}else if(input=='s'){moveDirection=2;  //位置下移 moveSnakeByDirection();}}
}
int main()
{startup();                  //数据的初始化 while(1)                    //游戏循环执行 {show();                 //显示画面 updateWithoutInput();   //与用户输入无关的更新 updateWithInput();      //与用户输入有关的更新 }return 0;
}

运行结果如下:

##############################
#                            #
#                            #
#                            #
#                            #
#                            #
#                            #
#                            #
#                            #
#                            #
#                       ****@#
#                            #
#                            #
#                            #
#                            #
#                            #
#                            #
#                            #
#                            #
##############################
游戏失败!--------------------------------
Process exited after 1.758 seconds with return value 0
请按任意键继续. . .

复现贪吃蛇程序——判断游戏失败(第四部分)相关推荐

  1. 复现贪吃蛇程序——构造小蛇

    要求: 在画面中显示一条静止的小蛇.对于二维数组canvas[High][Width]的对应元素,值为0输出空格,值为-1输出边框#,值为1输出蛇头@,值为大于1的正数输出蛇身*.在startup() ...

  2. c语言中怎么暂停一个一个游戏,求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束...

    求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束 /* 以下是主要的逻辑代码,还有些.c和.h就没发了 ...

  3. 【python教程入门学习】Python实现自动玩贪吃蛇程序

    这篇文章主要介绍了通过Python实现的简易的自动玩贪吃蛇游戏的小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学一学 实现效果 先看看效果 这比我手动的快多了,而且是单机的,自动玩没惹 ...

  4. JAVA小程序:一个基于MVC框架的贪吃蛇程序

    学习JAVA也有一段时间了,之前看了翁恺老师的视频,跟着做了一个细胞自动机,粗浅地了解了一点MVC框架的知识,感觉获益匪浅.但是细胞自动机毕竟是跟着视频完成的,有很大程度上都是参考了视频里的代码,没有 ...

  5. 用python写一个贪吃蛇程序

    我可以为您提供一些有关如何使用Python编写贪吃蛇程序的指导.首先,您需要确定您的程序所需的功能,以及游戏的规则和特性.接下来,您可以编写代码来实现这些功能,并使用Python的图形库来绘制游戏界面 ...

  6. 用前端技术实现贪吃蛇的小游戏

    用前端技术实现贪吃蛇的小游戏 前言 游戏功能 游戏设计 游戏主页代码 游戏中的js代码(snake.js) 游戏运行界面 前言 周末大热天窝在家里无聊,想温习一下前端开发,所以用javascript ...

  7. html5小游戏 typescript,使用TypeScript和Canvas编写移动端贪吃蛇大作战游戏

    基本介绍 一款移动端贪吃蛇大作战游戏.(只支持移动端) 这是一个临近 deadline 的课设项目,为了方便地使用TS,我直接使用angular-cli生成了TypeScript的项目结构.如果你有好 ...

  8. 贪食蛇php,贪吃蛇网页小游戏的代码

    贪吃蛇网页小游戏的代码 ::selection { color:#FFFFFF; background:transparent; } ::-moz-selection { color:#FFFFFF; ...

  9. 模仿别人的简单贪吃蛇程序

    参考的别人的贪吃蛇程序,只做了少许的更改,惭愧.http://bbs.csdn.net/topics/350080780 #include <stdio.h> #include <s ...

  10. 贪吃蛇c语言 游戏中会出现障碍物,贪吃蛇C语言游戏代码.doc

    贪吃蛇C语言游戏代码 //开始编写游戏需要的类 #include //EasyX_2011惊蛰版(绘图库) #include #include #include #define UP1 #define ...

最新文章

  1. java中String对象和String变量
  2. 可转债数据一览表集思录_学习先进的可转债投资策略
  3. Web模糊测试工具Powerfuzzer
  4. linux下查看监听port相应的进程
  5. Excel中的VBA宏:每次划款前从总名册中同步用户数据到当前页
  6. Bean的依赖注入的数据类型
  7. ios yymodel 将字典转数组模型_TensorNet——基于TensorFlow的大规模稀疏特征模型分布式训练框架
  8. 基于MaxCompute InformationSchema进行血缘关系分析
  9. python整数池_对Python中小整数对象池和大整数对象池的使用详解
  10. 针对于lvs分发mysql的监控
  11. 加密货币大崩盘:第一季度最大跌幅高达 88%!
  12. 单例模式-1.单利模式的简单实现
  13. 组态王中时间存access怎么存_组态王如何实现实时显示数据并且记录到Access数据库中?...
  14. Silverlight4 麦克风应用-录音机
  15. 数字形式转换,输入0123456789对应输出“一二三四五六七八九”
  16. 使用a标签下载文件时成了预览,并非是下载
  17. ps把一张图里面的文字去掉而不改变字后面的背景;把同一个颜色的改为别的颜色
  18. Ubuntu出现“dpkg: 依赖关系问题使得libbsd0:i386的配置工作不能继续”错误
  19. 华硕笔记本系统重装之后需要输入用户名和计算机名称是怎么回事,华硕笔记本电脑重装系统【方法详解】...
  20. 一文搞懂 Cocos Creator 3.0 坐标转换原理

热门文章

  1. 闲聊:Android 平台网络游戏加速器(二)
  2. Win10问题篇:一次性永久关闭win10系统自动更新
  3. c语言书199页第12题,单片机C语言入门实例和最常见问题分析(含程序部分了)(199页)-原创力文档...
  4. 现代交换技术--交换概论
  5. 关于时频分析的一些感想
  6. 新疆计算机二级vb 试题,2014新疆维吾尔自治区全国计算机等级考试二级VB试题及答案...
  7. 新形势下电力监控系统网络安全风险分析与防护对策
  8. mysql8 错误日志_MySQL 8 服务器日志
  9. 雷塞控制器SMC304简单介绍
  10. mysql局域网搭建_局域网中搭建共享MySQL数据库