C语言编程学习,贪吃蛇详解5.GameOver功能与显示成绩

C语言是面向过程的,而C++是面向对象的。C和C++的区别:

C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。

C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”。

C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。

以前我们已经做出来了一个能吃东西变长的蛇。不过它好像不会死。。。

现在就来实现一下game over的功能吧。

写个函数判断蛇是否撞到自己或者撞到墙:

boolgameOver(){

boolisGameOver=false;

intsX=s[0][0],sY=s[0][1];//蛇头的x坐标和y坐标if(sX==0||sX==H-1||sY==0||sY==W-1)

       isGameOver=true;

for(inti=1; i

{

if(s[i][0]==sX&&s[i][1]==sY)

           isGameOver=true;    }

return isGameOver;

}

然后在main里面加这个实现gameOver

if(gameOver())

       {

           system("cls");//清除屏幕内容printf("Game Over\n");  

           system("pause");

break;

       }

看看效果


小编推荐一个学C语言/C++的学习裙【 二六三,六八八,二七六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

到现在为止的代码:

#include

#include

#include

#include

#include

#defineH 23

#defineW 75

#defineWAIT_TIME 500//定义direction的每个值代表的方向

#defineUP 0

#defineDOWN 1

#defineLEFT 2

#defineRIGHT 3

inta[H][W];//地图数组

ints[H*W][2];//蛇身坐标数组

intsLength;//蛇的长度

intdirection;//蛇的方向

booleated=false;//标记是否吃到食物

voidinit()//程序开始时的初始化操作

{

   srand((unsigned)time(NULL));            //设置随机数种子为现在的时间CONSOLE_CURSOR_INFO cursor_info = {1,0};

   SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);//隐藏关标

inti,j;

for(i=0; i

   {

       a[i][0]=1;//让第一列为1a[i][W-1]=1;//让最后一列为1

}

for(j=0; j

   {

       a[0][j]=1;//让第一行为1a[H-1][j]=1;//让最后一行为1

   }

   sLength=4;//让蛇的最初长度为4s[0][0]=H/2;

   s[0][1]=W/2;//给蛇头坐标赋值for(i=1; i<4; i++)

   {

       s[i][0]=s[0][0]+i;

       s[i][1]=s[0][1];//给刚开始的蛇身几个初始坐标

   }

   direction=UP;}

voidgotoxy(inti,intj)//移动光标

{

   COORD position={j,i};    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),position);}

intcheck(intii,intjj)//判断这个点能不能放食物,可以放返回1,不能放返回0

{

if(a[ii][jj]==1)//如果有障碍物,返回0return0;

inti;

for(i=0; i

if(ii==s[i][0]&&jj==s[i][1])//如果和其中一个蛇身重合,就返回0return0;    }

if(ii==0||ii==H-1||jj==0||jj==W-1)//如果在边界上面,返回0return0;

return1;//最后筛选 过后的是符合条件的点

}

voidfood(){

inti,j;

do    {

       i=rand()%H;//生成0~H-1之间的一个数j=rand()%W;

   }    while(check(i,j)==0);//生成点直到满足条件a[i][j]=-1;//标记为食物

   gotoxy(i,j);

   printf("$");//画出食物

}

voiddrawMap()//画地图

{

   gotoxy(0,0);

inti,j;

for(i=0; i

for(j=0; j

{

if(a[i][j]==0)//为0输出空格printf("");

else//为1输出#printf("#");

       }

       printf("\n");//别忘了换行

}}

voidmove(){

int i;

   gotoxy(s[sLength-1][0],s[sLength-1][1]);

   printf("");//在尾巴上面画空格以擦除尾巴if(eated)//如果吃到了食物

   {

       sLength++;

       eated=false;//设置为false,不然无限变长}

for(i=sLength-1; i>0; i--)//从尾巴开始,每一个点的位置等于它前面一个点的位置

   {

       s[i][0]=s[i-1][0];

       s[i][1]=s[i-1][1];    }

switch(direction)    {

case UP:

       s[0][0]--;        break;

case DOWN:

       s[0][0]++;        break;

case LEFT:

       s[0][1]--;        break;

case RIGHT:

       s[0][1]++;        break;    }}

voiddrawSnake()//画蛇

{

inti;

for(i=0; i

   {

       gotoxy(s[i][0],s[i][1]);//移动关标到蛇的坐标printf("@");//在这个位置画蛇}}

voidkey(){

if(kbhit()!=0)//如果有键盘输入

{

charin;

while(!kbhit()==0)//如果玩家输入了多个按键,以最后一个按键为准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,0);//将光标移动到下面system("pause");

           gotoxy(H,0);

           printf("");//消去下面的按任意键继续break;        }    }}

boolgameOver(){

boolisGameOver=false;

intsX=s[0][0],sY=s[0][1];//蛇头的x坐标和y坐标if(sX==0||sX==H-1||sY==0||sY==W-1)

       isGameOver=true;

for(inti=1; i

{

if(s[i][0]==sX&&s[i][1]==sY)

           isGameOver=true;    }

returnisGameOver;}

int main()

{

   init();                     //程序开始时的初始化操作drawMap();//画地图

food();

while(1)

   {

       drawSnake();                //画蛇Sleep(WAIT_TIME);//等待一段时间

       key();

       move();                     //移动蛇(主要是修改蛇身数组的数据)if(gameOver())

       {

           system("cls");//清除屏幕内容printf("Game Over\n");

           system("pause");            break;        }

if(a[s[0][0]][s[0][1]]==-1)//如果蛇头碰到食物,就重新投放食物,并且把食物点重置为0

       {

           eated=true;//标记已经吃到食物

           food();

           a[s[0][0]][s[0][1]]=0;//去掉食物

}    }

return0;

}

接下来,我们来显示一下成绩。

声明一个变量来记录分数

intscore=0;//得分

然后当吃到食物时分数增加(main里面)

if(a[s[0][0]][s[0][1]]==-1)//如果蛇头碰到食物,就重新投放食物,并且把食物点重置为0

       {

           eated=true;//标记已经吃到食物score+=10;

           food();

           a[s[0][0]][s[0][1]]=0;//去掉食物}

然后写一个printScore函数来写分数

void printScore()

{

   gotoxy(0,W+2);

   printf("  贪吃蛇小游戏");

   gotoxy(1,W+2);

   printf("  环家伟制作");

   gotoxy(4,W+2);

   printf("  得分:%d",score);

}

记得在main里面调用啊。看看效果:

小编推荐一个学C语言/C++的学习裙【 二六三,六八八,二七六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!


 完整代码:

#include

#include

#include

#include

#include

#defineH 23

#defineW 75

#defineWAIT_TIME 500//定义direction的每个值代表的方向

#defineUP 0

#defineDOWN 1

#defineLEFT 2

#defineRIGHT 3

inta[H][W];//地图数组

ints[H*W][2];//蛇身坐标数组

intsLength;//蛇的长度

intdirection;//蛇的方向

booleated=false;//标记是否吃到食物

intscore=0;//得分

voidinit()//程序开始时的初始化操作

{

   srand((unsigned)time(NULL));            //设置随机数种子为现在的时间CONSOLE_CURSOR_INFO cursor_info = {1,0};

   SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);//隐藏关标inti,j;

for(i=0; i

   {

       a[i][0]=1;//让第一列为1a[i][W-1]=1;//让最后一列为1

}

for(j=0; j

   {

       a[0][j]=1;//让第一行为1a[H-1][j]=1;//让最后一行为1

   }

   sLength=4;//让蛇的最初长度为4s[0][0]=H/2;

   s[0][1]=W/2;//给蛇头坐标赋值for(i=1; i<4; i++)

   {

       s[i][0]=s[0][0]+i;

       s[i][1]=s[0][1];//给刚开始的蛇身几个初始坐标

   }

   direction=UP;}

voidgotoxy(inti,intj)//移动光标

{

   COORD position={j,i};    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),position);}

intcheck(intii,intjj)//判断这个点能不能放食物,可以放返回1,不能放返回0

{

if(a[ii][jj]==1)//如果有障碍物,返回0return0;

inti;

for(i=0; i

if(ii==s[i][0]&&jj==s[i][1])//如果和其中一个蛇身重合,就返回0return0;    }

if(ii==0||ii==H-1||jj==0||jj==W-1)//如果在边界上面,返回0return0;

return1;//最后筛选 过后的是符合条件的点

}

voidfood(){

inti,j;

do    {

       i=rand()%H;//生成0~H-1之间的一个数j=rand()%W;

   }    while(check(i,j)==0);//生成点直到满足条件a[i][j]=-1;//标记为食物

   gotoxy(i,j);

   printf("$");//画出食物

}

voiddrawMap()//画地图

{

   gotoxy(0,0);

inti,j;

for(i=0; i

for(j=0; j

if(a[i][j]==0)//为0输出空格printf("");

else//为1输出#printf("#");

       }

       printf("\n");//别忘了换行

}}

voidmove(){

int i;

   gotoxy(s[sLength-1][0],s[sLength-1][1]);

   printf("");//在尾巴上面画空格以擦除尾巴if(eated)//如果吃到了食物

   {

       sLength++;

       eated=false;//设置为false,不然无限变长

}

for(i=sLength-1; i>0; i--)//从尾巴开始,每一个点的位置等于它前面一个点的位置

   {

       s[i][0]=s[i-1][0];

       s[i][1]=s[i-1][1];    }

switch(direction)    {

case UP:

       s[0][0]--;        break;

case DOWN:

       s[0][0]++;        break;

case LEFT:

       s[0][1]--;        break;

case RIGHT:

       s[0][1]++;        break;    }}

voiddrawSnake()//画蛇

{

inti;

for(i=0; i

   {

       gotoxy(s[i][0],s[i][1]);//移动关标到蛇的坐标printf("@");//在这个位置画蛇}}

voidkey(){

if(kbhit()!=0)//如果有键盘输入

{

charin;

while(!kbhit()==0)//如果玩家输入了多个按键,以最后一个按键为准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,0);//将光标移动到下面system("pause");

           gotoxy(H,0);

           printf("");//消去下面的按任意键继续break;        }    }}

boolgameOver(){

boolisGameOver=false;

intsX=s[0][0],sY=s[0][1];//蛇头的x坐标和y坐标if(sX==0||sX==H-1||sY==0||sY==W-1)

       isGameOver=true;

for(inti=1; i

{

if(s[i][0]==sX&&s[i][1]==sY)

           isGameOver=true;    }

returnisGameOver;}

void printScore()

{

   gotoxy(0,W+2);

   printf("  贪吃蛇小游戏");

   gotoxy(1,W+2);

   printf("  环家伟制作");

   gotoxy(4,W+2);

   printf("  得分:%d",score);}

int main()

{

   init();                     //程序开始时的初始化操作drawMap();//画地图

food();

while(1)

   {

       drawSnake();                //画蛇

       printScore();

       Sleep(WAIT_TIME);           //等待一段时间

       key();

       move();                     //移动蛇(主要是修改蛇身数组的数据)if(gameOver())

       {

           system("cls");//清除屏幕内容printf("Game Over\n");

           system("pause");

break;        }

if(a[s[0][0]][s[0][1]]==-1)//如果蛇头碰到食物,就重新投放食物,并且把食物点重置为0

       {

           eated=true;//标记已经吃到食物score+=10;

           food();

           a[s[0][0]][s[0][1]]=0;//去掉食物}    }

return0;

}

这些是C/C++能做的

服务器开发工程师、人工智能、云计算工程师、信息安全(黑客反黑客)、大数据 、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容