zoukankan      html  css  js  c++  java
  • c语言贪吃蛇详解5.GameOver功能与显示成绩

    c语言贪吃蛇详解5.GameOver功能与显示成绩

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

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

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

    bool gameOver()
    {
        bool isGameOver=false;
        int sX=s[0][0],sY=s[0][1];      //蛇头的x坐标和y坐标
        if(sX==0||sX==H-1||sY==0||sY==W-1)
            isGameOver=true;
        for(int i=1; i<sLength; i++)    //判断有没有吃到自己
        {
            if(s[i][0]==sX&&s[i][1]==sY)
                isGameOver=true;
        }
        return isGameOver;
    }

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

     if(gameOver())
            {
                system("cls");          //清除屏幕内容
                printf("Game Over
    ");  
                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][2];      //蛇身坐标数组
    int sLength;        //蛇的长度
    int direction;      //蛇的方向
    bool eated=false;   //标记是否吃到食物
    
    void init()         //程序开始时的初始化操作
    {
        srand((unsigned)time(NULL));            //设置随机数种子为现在的时间
        CONSOLE_CURSOR_INFO cursor_info = {1, 0};
        SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);    //隐藏关标
        int i,j;
        for(i=0; i<H; i++)
        {
            a[i][0]=1;          //让第一列为1
            a[i][W-1]=1;        //让最后一列为1
        }
        for(j=0; j<W; j++)
        {
            a[0][j]=1;      //让第一行为1
            a[H-1][j]=1;    //让最后一行为1
        }
        sLength=4;          //让蛇的最初长度为4
        s[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;
    }
    
    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]==1)        //如果有障碍物,返回0
            return 0;
        int i;
        for(i=0; i<sLength; i++)
        {
            if(ii==s[i][0]&&jj==s[i][1])      //如果和其中一个蛇身重合,就返回0
                return 0;
        }
        if(ii==0||ii==H-1||jj==0||jj==W-1)      //如果在边界上面,返回0
            return 0;
        return 1;                       //最后筛选 过后的是符合条件的点
    }
    
    void food()
    {
        int i,j;
        do
        {
            i=rand()%H;                 //生成0~H-1之间的一个数
            j=rand()%W;
        }
        while(check(i,j)==0);           //生成点直到满足条件
        a[i][j]=-1;                     //标记为食物
        gotoxy(i,j);
        printf("$");                    //画出食物
    }
    
    void drawMap()                  //画地图
    {
        gotoxy(0,0);
        int i,j;
        for(i=0; i<H; i++)
        {
            for(j=0; j<W; j++)          //两重for循环遍历数组
            {
                if(a[i][j]==0)          //为0输出空格
                    printf(" ");
                else                    //为1输出#
                    printf("#");
            }
            printf("
    ");               //别忘了换行
        }
    }
    
    void move()
    {
        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;
        }
    
    }
    
    void drawSnake()                //画蛇
    {
        int i;
        for(i=0; i<sLength; i++)
        {
            gotoxy(s[i][0],s[i][1]);        //移动关标到蛇的坐标
            printf("@");                    //在这个位置画蛇
        }
    }
    
    void key()
    {
        if(kbhit()!=0)          //如果有键盘输入
        {
            char in;
            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;
            }
        }
    }
    
    bool gameOver()
    {
        bool isGameOver=false;
        int sX=s[0][0],sY=s[0][1];      //蛇头的x坐标和y坐标
        if(sX==0||sX==H-1||sY==0||sY==W-1)
            isGameOver=true;
        for(int i=1; i<sLength; i++)    //判断有没有吃到自己
        {
            if(s[i][0]==sX&&s[i][1]==sY)
                isGameOver=true;
        }
        return isGameOver;
    }
    
    int main()
    {
        init();                     //程序开始时的初始化操作
        drawMap();                  //画地图
        food();
        while(1)
        {
            drawSnake();                //画蛇
            Sleep(WAIT_TIME);           //等待一段时间
            key();
            move();                     //移动蛇(主要是修改蛇身数组的数据)
            if(gameOver())
            {
                system("cls");          //清除屏幕内容
                printf("Game Over
    ");
                system("pause");
                break;
            }
            if(a[s[0][0]][s[0][1]]==-1) //如果蛇头碰到食物,就重新投放食物,并且把食物点重置为0
            {
                eated=true;             //标记已经吃到食物
                food();
                a[s[0][0]][s[0][1]]=0;  //去掉食物
            }
    
        }
        return 0;
    }

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

    声明一个变量来记录分数

    int score=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里面调用啊。看看效果:

     完整代码:

    #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][2];      //蛇身坐标数组
    int sLength;        //蛇的长度
    int direction;      //蛇的方向
    bool eated=false;   //标记是否吃到食物
    int score=0;        //得分
    
    void init()         //程序开始时的初始化操作
    {
        srand((unsigned)time(NULL));            //设置随机数种子为现在的时间
        CONSOLE_CURSOR_INFO cursor_info = {1, 0};
        SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);    //隐藏关标
        int i,j;
        for(i=0; i<H; i++)
        {
            a[i][0]=1;          //让第一列为1
            a[i][W-1]=1;        //让最后一列为1
        }
        for(j=0; j<W; j++)
        {
            a[0][j]=1;      //让第一行为1
            a[H-1][j]=1;    //让最后一行为1
        }
        sLength=4;          //让蛇的最初长度为4
        s[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;
    }
    
    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]==1)        //如果有障碍物,返回0
            return 0;
        int i;
        for(i=0; i<sLength; i++)
        {
            if(ii==s[i][0]&&jj==s[i][1])      //如果和其中一个蛇身重合,就返回0
                return 0;
        }
        if(ii==0||ii==H-1||jj==0||jj==W-1)      //如果在边界上面,返回0
            return 0;
        return 1;                       //最后筛选 过后的是符合条件的点
    }
    
    void food()
    {
        int i,j;
        do
        {
            i=rand()%H;                 //生成0~H-1之间的一个数
            j=rand()%W;
        }
        while(check(i,j)==0);           //生成点直到满足条件
        a[i][j]=-1;                     //标记为食物
        gotoxy(i,j);
        printf("$");                    //画出食物
    }
    
    void drawMap()                  //画地图
    {
        gotoxy(0,0);
        int i,j;
        for(i=0; i<H; i++)
        {
            for(j=0; j<W; j++)          //两重for循环遍历数组
            {
                if(a[i][j]==0)          //为0输出空格
                    printf(" ");
                else                    //为1输出#
                    printf("#");
            }
            printf("
    ");               //别忘了换行
        }
    }
    
    void move()
    {
        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;
        }
    
    }
    
    void drawSnake()                //画蛇
    {
        int i;
        for(i=0; i<sLength; i++)
        {
            gotoxy(s[i][0],s[i][1]);        //移动关标到蛇的坐标
            printf("@");                    //在这个位置画蛇
        }
    }
    
    void key()
    {
        if(kbhit()!=0)          //如果有键盘输入
        {
            char in;
            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;
            }
        }
    }
    
    bool gameOver()
    {
        bool isGameOver=false;
        int sX=s[0][0],sY=s[0][1];      //蛇头的x坐标和y坐标
        if(sX==0||sX==H-1||sY==0||sY==W-1)
            isGameOver=true;
        for(int i=1; i<sLength; i++)    //判断有没有吃到自己
        {
            if(s[i][0]==sX&&s[i][1]==sY)
                isGameOver=true;
        }
        return isGameOver;
    }
    
    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
    ");
                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;  //去掉食物
            }
    
        }
        return 0;
    }

    更多精彩:http://www.cnblogs.com/hjw1/

  • 相关阅读:
    Java 基础
    Java 数据类型
    Spring 拦截器实现事物
    SSH 配置日记
    Hibernate 知识提高
    Jsp、Servlet
    leetcode 97. Interleaving String
    leetcode 750. Number Of Corner Rectangles
    leetcode 748. Shortest Completing Word
    leetcode 746. Min Cost Climbing Stairs
  • 原文地址:https://www.cnblogs.com/hjw1/p/8270367.html
Copyright © 2011-2022 走看看