美文网首页c++/c项目程序员我是程序员;您好程先生;叫我序员就好了
C语言编程学习,贪吃蛇详解5.GameOver功能与显示成绩

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

作者: 小辰带你看世界 | 来源:发表于2018-02-12 11:49 被阅读20次

    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++能做的

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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/rzurtftx.html