c语言贪吃蛇详解5.GameOver功能与显示成绩
c语言贪吃蛇详解5.GameOver功能与显示成绩
以前我们已经做出来了一个能吃东西变长的蛇。不过它好像不会死。。。
现在就来实现一下game over的功能吧。
写个函数判断蛇是否撞到自己或者撞到墙:
bool gameOver()
{
bool isGameOver=false;
int sX=s[][],sY=s[][]; //蛇头的x坐标和y坐标
if(sX==||sX==H-||sY==||sY==W-)
isGameOver=true;
for(int i=; i<sLength; i++) //判断有没有吃到自己
{
if(s[i][]==sX&&s[i][]==sY)
isGameOver=true;
}
return isGameOver;
}
然后在main里面加这个实现gameOver
if(gameOver())
{
system("cls"); //清除屏幕内容
printf("Game Over\n");
system("pause");
break;
}
看看效果



到现在为止的代码:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include<time.h>
#include<windows.h> #define H 23
#define W 75
#define WAIT_TIME 500 //定义direction的每个值代表的方向
#define UP 0
#define DOWN 1
#define LEFT 2
#define RIGHT 3 int a[H][W]; //地图数组
int s[H*W][]; //蛇身坐标数组
int sLength; //蛇的长度
int direction; //蛇的方向
bool eated=false; //标记是否吃到食物 void init() //程序开始时的初始化操作
{
srand((unsigned)time(NULL)); //设置随机数种子为现在的时间
CONSOLE_CURSOR_INFO cursor_info = {, };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); //隐藏关标
int i,j;
for(i=; i<H; i++)
{
a[i][]=; //让第一列为1
a[i][W-]=; //让最后一列为1
}
for(j=; j<W; j++)
{
a[][j]=; //让第一行为1
a[H-][j]=; //让最后一行为1
}
sLength=; //让蛇的最初长度为4
s[][]=H/;
s[][]=W/; //给蛇头坐标赋值
for(i=; i<; i++)
{
s[i][]=s[][]+i;
s[i][]=s[][]; //给刚开始的蛇身几个初始坐标
}
direction=UP;
} void gotoxy(int i,int j) //移动光标
{
COORD position= {j,i};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),position);
} int check(int ii,int jj) //判断这个点能不能放食物,可以放返回1,不能放返回0
{
if(a[ii][jj]==) //如果有障碍物,返回0
return ;
int i;
for(i=; i<sLength; i++)
{
if(ii==s[i][]&&jj==s[i][]) //如果和其中一个蛇身重合,就返回0
return ;
}
if(ii==||ii==H-||jj==||jj==W-) //如果在边界上面,返回0
return ;
return ; //最后筛选 过后的是符合条件的点
} void food()
{
int i,j;
do
{
i=rand()%H; //生成0~H-1之间的一个数
j=rand()%W;
}
while(check(i,j)==); //生成点直到满足条件
a[i][j]=-; //标记为食物
gotoxy(i,j);
printf("$"); //画出食物
} void drawMap() //画地图
{
gotoxy(,);
int i,j;
for(i=; i<H; i++)
{
for(j=; j<W; j++) //两重for循环遍历数组
{
if(a[i][j]==) //为0输出空格
printf(" ");
else //为1输出#
printf("#");
}
printf("\n"); //别忘了换行
}
} void move()
{
int i;
gotoxy(s[sLength-][],s[sLength-][]);
printf(" "); //在尾巴上面画空格以擦除尾巴
if(eated) //如果吃到了食物
{
sLength++;
eated=false; //设置为false,不然无限变长
}
for(i=sLength-; i>; i--) //从尾巴开始,每一个点的位置等于它前面一个点的位置
{
s[i][]=s[i-][];
s[i][]=s[i-][];
}
switch(direction)
{
case UP:
s[][]--;
break;
case DOWN:
s[][]++;
break;
case LEFT:
s[][]--;
break;
case RIGHT:
s[][]++;
break;
} } void drawSnake() //画蛇
{
int i;
for(i=; i<sLength; i++)
{
gotoxy(s[i][],s[i][]); //移动关标到蛇的坐标
printf("@"); //在这个位置画蛇
}
} void key()
{
if(kbhit()!=) //如果有键盘输入
{
char in;
while(!kbhit()==) //如果玩家输入了多个按键,以最后一个按键为准
in=getch();
switch(in)
{
case 'w':
case 'W':
if(direction!=DOWN) //不能缩头吧。。。。
direction=UP;
break;
case 's':
case 'S':
if(direction!=UP)
direction=DOWN;
break;
case 'a':
case 'A':
if(direction!=RIGHT)
direction=LEFT;
break;
case 'd':
case 'D':
if(direction!=LEFT)
direction=RIGHT;
break;
case 'p':
case 'P':
gotoxy(H,); //将光标移动到下面
system("pause");
gotoxy(H,);
printf(" "); //消去下面的按任意键继续
break;
}
}
} bool gameOver()
{
bool isGameOver=false;
int sX=s[][],sY=s[][]; //蛇头的x坐标和y坐标
if(sX==||sX==H-||sY==||sY==W-)
isGameOver=true;
for(int i=; i<sLength; i++) //判断有没有吃到自己
{
if(s[i][]==sX&&s[i][]==sY)
isGameOver=true;
}
return isGameOver;
} int main()
{
init(); //程序开始时的初始化操作
drawMap(); //画地图
food();
while()
{
drawSnake(); //画蛇
Sleep(WAIT_TIME); //等待一段时间
key();
move(); //移动蛇(主要是修改蛇身数组的数据)
if(gameOver())
{
system("cls"); //清除屏幕内容
printf("Game Over\n");
system("pause");
break;
}
if(a[s[][]][s[][]]==-) //如果蛇头碰到食物,就重新投放食物,并且把食物点重置为0
{
eated=true; //标记已经吃到食物
food();
a[s[][]][s[][]]=; //去掉食物
} }
return ;
}
接下来,我们来显示一下成绩。
声明一个变量来记录分数
int score=; //得分
然后当吃到食物时分数增加(main里面)
if(a[s[][]][s[][]]==-) //如果蛇头碰到食物,就重新投放食物,并且把食物点重置为0
{
eated=true; //标记已经吃到食物
score+=;
food();
a[s[][]][s[][]]=; //去掉食物
}
然后写一个printScore函数来写分数
void printScore()
{
gotoxy(,W+);
printf(" 贪吃蛇小游戏");
gotoxy(,W+);
printf(" 环家伟制作");
gotoxy(,W+);
printf(" 得分:%d",score);
}
记得在main里面调用啊。看看效果:

完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include<time.h>
#include<windows.h> #define H 23
#define W 75
#define WAIT_TIME 500 //定义direction的每个值代表的方向
#define UP 0
#define DOWN 1
#define LEFT 2
#define RIGHT 3 int a[H][W]; //地图数组
int s[H*W][]; //蛇身坐标数组
int sLength; //蛇的长度
int direction; //蛇的方向
bool eated=false; //标记是否吃到食物
int score=; //得分 void init() //程序开始时的初始化操作
{
srand((unsigned)time(NULL)); //设置随机数种子为现在的时间
CONSOLE_CURSOR_INFO cursor_info = {, };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); //隐藏关标
int i,j;
for(i=; i<H; i++)
{
a[i][]=; //让第一列为1
a[i][W-]=; //让最后一列为1
}
for(j=; j<W; j++)
{
a[][j]=; //让第一行为1
a[H-][j]=; //让最后一行为1
}
sLength=; //让蛇的最初长度为4
s[][]=H/;
s[][]=W/; //给蛇头坐标赋值
for(i=; i<; i++)
{
s[i][]=s[][]+i;
s[i][]=s[][]; //给刚开始的蛇身几个初始坐标
}
direction=UP;
} void gotoxy(int i,int j) //移动光标
{
COORD position= {j,i};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),position);
} int check(int ii,int jj) //判断这个点能不能放食物,可以放返回1,不能放返回0
{
if(a[ii][jj]==) //如果有障碍物,返回0
return ;
int i;
for(i=; i<sLength; i++)
{
if(ii==s[i][]&&jj==s[i][]) //如果和其中一个蛇身重合,就返回0
return ;
}
if(ii==||ii==H-||jj==||jj==W-) //如果在边界上面,返回0
return ;
return ; //最后筛选 过后的是符合条件的点
} void food()
{
int i,j;
do
{
i=rand()%H; //生成0~H-1之间的一个数
j=rand()%W;
}
while(check(i,j)==); //生成点直到满足条件
a[i][j]=-; //标记为食物
gotoxy(i,j);
printf("$"); //画出食物
} void drawMap() //画地图
{
gotoxy(,);
int i,j;
for(i=; i<H; i++)
{
for(j=; j<W; j++) //两重for循环遍历数组
{
if(a[i][j]==) //为0输出空格
printf(" ");
else //为1输出#
printf("#");
}
printf("\n"); //别忘了换行
}
} void move()
{
int i;
gotoxy(s[sLength-][],s[sLength-][]);
printf(" "); //在尾巴上面画空格以擦除尾巴
if(eated) //如果吃到了食物
{
sLength++;
eated=false; //设置为false,不然无限变长
}
for(i=sLength-; i>; i--) //从尾巴开始,每一个点的位置等于它前面一个点的位置
{
s[i][]=s[i-][];
s[i][]=s[i-][];
}
switch(direction)
{
case UP:
s[][]--;
break;
case DOWN:
s[][]++;
break;
case LEFT:
s[][]--;
break;
case RIGHT:
s[][]++;
break;
} } void drawSnake() //画蛇
{
int i;
for(i=; i<sLength; i++)
{
gotoxy(s[i][],s[i][]); //移动关标到蛇的坐标
printf("@"); //在这个位置画蛇
}
} void key()
{
if(kbhit()!=) //如果有键盘输入
{
char in;
while(!kbhit()==) //如果玩家输入了多个按键,以最后一个按键为准
in=getch();
switch(in)
{
case 'w':
case 'W':
if(direction!=DOWN) //不能缩头吧。。。。
direction=UP;
break;
case 's':
case 'S':
if(direction!=UP)
direction=DOWN;
break;
case 'a':
case 'A':
if(direction!=RIGHT)
direction=LEFT;
break;
case 'd':
case 'D':
if(direction!=LEFT)
direction=RIGHT;
break;
case 'p':
case 'P':
gotoxy(H,); //将光标移动到下面
system("pause");
gotoxy(H,);
printf(" "); //消去下面的按任意键继续
break;
}
}
} bool gameOver()
{
bool isGameOver=false;
int sX=s[][],sY=s[][]; //蛇头的x坐标和y坐标
if(sX==||sX==H-||sY==||sY==W-)
isGameOver=true;
for(int i=; i<sLength; i++) //判断有没有吃到自己
{
if(s[i][]==sX&&s[i][]==sY)
isGameOver=true;
}
return isGameOver;
} void printScore()
{
gotoxy(,W+);
printf(" 贪吃蛇小游戏");
gotoxy(,W+);
printf(" 环家伟制作");
gotoxy(,W+);
printf(" 得分:%d",score);
} int main()
{
init(); //程序开始时的初始化操作
drawMap(); //画地图
food();
while()
{
drawSnake(); //画蛇
printScore();
Sleep(WAIT_TIME); //等待一段时间
key();
move(); //移动蛇(主要是修改蛇身数组的数据)
if(gameOver())
{
system("cls"); //清除屏幕内容
printf("Game Over\n");
system("pause");
break;
}
if(a[s[][]][s[][]]==-) //如果蛇头碰到食物,就重新投放食物,并且把食物点重置为0
{
eated=true; //标记已经吃到食物
score+=;
food();
a[s[][]][s[][]]=; //去掉食物
} }
return ;
}
更多精彩:http://www.cnblogs.com/hjw1/
c语言贪吃蛇详解5.GameOver功能与显示成绩的更多相关文章
- c语言贪吃蛇详解3.让蛇动起来
c语言贪吃蛇详解3.让蛇动起来 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 上次 ...
- c语言贪吃蛇详解-2.画出蛇
c语言贪吃蛇详解-2.画出蛇 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 蛇的身 ...
- c语言贪吃蛇详解1.画出地图
c语言贪吃蛇详解-1.画出地图 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 首先 ...
- c语言贪吃蛇详解4.食物的投放与蛇的变长
c语言贪吃蛇详解4.食物的投放与蛇的变长 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识 ...
- C/C++编程笔记:C语言贪吃蛇源代码控制台(二),分数和食物!
接上文<C/C++编程笔记:C语言贪吃蛇源代码控制台(一),会动的那种哦!>如果你在学习C语言开发贪吃蛇的话,零基础建议从上一篇开始哦!接下来正式开始吧! 三.蛇的运动 上次我已经教大家画 ...
- C语言内存对齐详解(2)
接上一篇:C语言内存对齐详解(1) VC对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式.VC 中提供了#pr ...
- C语言内存对齐详解(3)
接上一篇:C语言内存对齐详解(2) 在minix的stdarg.h文件中,定义了如下一个宏: /* Amount of space required in an argument list for a ...
- 一个简单的C语言程序(详解)
C Primer Plus之一个简单的C语言程序(详解) #include <stdio.h> int main(void) //一个简单的 C程序 { int num; //定义一个名为 ...
- 程序游戏推荐(C语言贪吃蛇,python天天酷跑(需要安装pygame),js是狠人就坚持30s)
下面是下载位置,我把他们上传到我的文件下了. C语言贪吃蛇:https://files.cnblogs.com/files/ITXiaoAng/%E8%B4%AA%E5%90%83%E8%9B%87. ...
随机推荐
- Linux上跑两个版本的php,5.4.45和5.3.24
首先,装的实在艰难,所以容我吐槽两句: PHP好个P,两个小版本都不兼容,把这个php5.3.24放在5.4.45环境下都跑不了.对于我这种用多了向下兼容的java的人来说,简直无法想象! 网上有装俩 ...
- 载入DLL中的图片资源生成Skia中的SkBitmap对象
PPAPI Plugin在Windows下是DLL,能够嵌入图片文件.使用Skia画图时须要依据DLL里的图片文件生成SkBitmap对象. 以下是代码: #include "utils.h ...
- Codeforces 29D Ant on the Tree 树的遍历 dfs序
题目链接:点击打开链接 题意: 给定n个节点的树 1为根 则此时叶子节点已经确定 最后一行给出叶子节点的顺序 目标: 遍历树并输出路径.要求遍历叶子节点时依照给定叶子节点的先后顺序訪问. 思路: 给每 ...
- TextMesh Pro SpriteAsset Load From Assetbundle
遇到问题 我们项目分两个Unity的工程,Art(美术资源工程),Client(代码工程) 在Art工程中的TextMeshProUGUI Text中使用Emoji,打包成AB之后,在Client运行 ...
- (转)解决jdk1.8中发送邮件失败(handshake_failure)问题
解决jdk1.8中发送邮件失败(handshake_failure)问题 作者 zhisheng_tian 2016.08.12 22:44* 字数 1573 阅读 2818评论 6喜欢 9 暑假在家 ...
- Springboot 之 解决IDEA读取properties配置文件的中文乱码问题
问题描述 当在.properties的配置文件中有中文时,读取出来的总是乱码.比如我的application.properties配置文件的内容如下: server.port=9090 test.ms ...
- Laravel学习笔记(三)--在CentOS上配置Laravel
在Laravel框架上开发了几天,不得不说,确实比较优雅,处理问题逻辑比较清楚. 今天打算在CentOS 7上配置一个Laravel,之前都是在本机上开发,打算实际配置一下. 1)系统 ...
- 基于 HTML5 WebGL 的 3D 服务器与客户端的通信
这个例子的初衷是模拟服务器与客户端的通信,我把整个需求简化变成了今天的这个例子.3D 机房方面的模拟一般都是需要鹰眼来辅助的,这样找产品以及整个空间的概括会比较明确,在这个例子中我也加了,这篇文章就算 ...
- springboot 入门四-时间类型处理
springboot 自带了jackson来处理时间,但不支持jdk8 LocalDate.LocalDateTime的转换. 对于Calendar.Date二种日期,转换方式有二种: 一.统一app ...
- 开源一个上架 App Store 的相机 App
Osho 相机是我独立开发上架的一个相机 App,App Store地址:https://itunes.apple.com/cn/app/osho/id1203312279?mt=8.它支持1:1,4 ...