zoukankan      html  css  js  c++  java
  • 贪吃蛇游戏(附源码)

    #include <stdio.h>  
    #include <conio.h>  
    #include <stdlib.h>  
    #include <time.h>  
     
    const int maxn = 100; 
    const int n = 20; 
     
    struct node 

        int x, y; 
    }; 
     
    int map[maxn][maxn]; // 0表示空格,1表示蛇身,2表示食物,3表示撞死的位置, 4表示蛇头.  
    node food; 
    node squence[maxn]; // 蛇的身子的坐标.  
    int len; // 蛇的长度.  
    bool eat; // 判断当前事物是否被吃了.  
    bool gameover; // 游戏是否失败.  
    int direction; // 判断当前蛇头是朝哪个方向.  
     
    void Output(void); 
    void Move(int direction); 
    void Move_up(void); 
    void Move_down(void); 
    void Move_left(void); 
    void Move_right(void); 
     
    int main() 

        int i, j; 
        double start; 
        int gamespeed; // 游戏速度自己调整.  
        int timeover; 
        int game_times = 1; // 游戏的次数.  
        char c = 'x'; 
        printf("请输入游戏的级别(1到500,1最难,500最简单): "); 
        scanf("%d", &gamespeed); 
        gamespeed = gamespeed; 
        // 对图的初始化.  
        for (i = 0; i <= n + 1; i++) 
        { 
            for (j = 0; j <= n + 1; j++) 
            { 
                map[i][j] = 0; 
            } 
        } 
        // 对蛇的初始化.  
        for (i = 1; i <= n; i++) 
        { 
            squence[i].x = 0; 
            squence[i].y = 0; 
        } 
        len = 1; // 蛇的长度为1.  
        squence[len].x = 1; 
        squence[len].y = 1; // 初始位置在点(1, 1).  
        map[1][1] = 4; 
        direction = 4; // 默认开始时蛇向右走.  
        srand(time(0)); 
        while (game_times <= 20) 
        { 
            eat = 0; // 食物还没被吃.  
            while (true) 
            { // 随机生出食物的坐标,注意不能与蛇身重合,否则就重新随机产生.  
                food.x = rand() % 20 + 1; 
                food.y = rand() % 20 + 1; 
                if (map[food.x][food.y] == 0) 
                { 
                    break; 
                } 
            } 
            map[food.x][food.y] = 2; // 食物位置.  
            system("cls"); 
            Output(); 
            // 以下这段半秒钟不按键还取原方向继续前行.  
            while (!eat) 
            { 
                start = clock(); 
                timeover=1; 
                while(!kbhit()) 
                { // 说明没有按键.  
                    if (clock() - start <= gamespeed) 
                    { // 如果时间超过游戏时间.  
                        timeover = 1; 
                    } 
                    else 
                    { 
                        timeover = 0; 
                        break; 
                    } 
                } 
                if (timeover) 
                { // 说明有按键.  
                    // 按一次键,可以连取两个  
                    c = getch(); 
                    c = getch(); 
                    // 以下几行告诉怎样判断用户按的哪个方向键  
                    if(c==72) direction = 1; // printf("向上");  
                    if(c==80) direction = 2; // printf("向下");  
                    if(c==75) direction = 3; // printf("向左");  
                    if(c==77) direction = 4; // printf("向右");  
                } 
                Move(direction); 
                system("cls"); 
                if (gameover) 
                { 
                    Output(); 
                    printf("Game Over!!! "); 
                    return 0; 
                } 
                Output(); 
            } 
            game_times++; // 又成功吃到一次食物.  
        } 
        printf("You win!!! "); 
        return 0; 

     
    void Move(int direction) 

        switch (direction) 
        { 
        case 1 : Move_up(); break; 
        case 2 : Move_down(); break; 
        case 3 : Move_left(); break; 
        default : Move_right(); 
        } 

     
    void Output(void) 

        int i, j; 
        for (j = 0; j <= n + 1; j++) 
        { 
            printf("#"); 
        } 
        printf(" "); 
        for (i = 1; i <= n; i++) 
        { 
            for (j = 0; j <= n + 1; j++) 
            { 
                if (j == 0 || j == n + 1) 
                { 
                    if (map[i][j] == 3) 
                    { 
                        printf("!"); 
                    } 
                    else 
                    { 
                        printf("#"); 
                    } 
                } 
                else 
                { 
                    if (map[i][j] == 1) 
                    { 
                        printf("*"); 
                    } 
                    else if (map[i][j] == 2) 
                    { 
                        printf("@"); 
                    } 
                    else if (map[i][j] == 3) 
                    { 
                        printf("!"); 
                    } 
                    else if (map[i][j] == 4) 
                    { 
                        switch (direction) 
                        { 
                        case 1 : printf("%c", 30); break; 
                        case 2 : printf("%c", 31); break; 
                        case 3 : printf("%c", 17); break; 
                        default : printf("%c", 16); 
                        } 
                    } 
                    else 
                    { 
                        printf(" "); 
                    } 
                } 
            } 
            printf(" "); 
        } 
        for (j = 0; j <= n + 1; j++) 
        { 
            printf("#"); 
        } 
        printf(" "); 

     
    void Move_up(void) 

        int i; 
        int x, y; 
        if (len > 1 && squence[len].y == squence[len - 1].y && squence[len].x == squence[len - 1].x + 1) 
        { // 不能移动,则按原来的移动.  
            direction = 2; // 按原来的向下移动.  
            Move(direction); 
            return ; 
        } 
        // 开始移动.  
        x = squence[len].x - 1; 
        y = squence[len].y; 
        if (x == 0 || map[x][y] == 1) 
        { // 撞到边界或者自己撞到自己.  
            map[x][y] = 3; 
            gameover = 1; 
        } 
        if (map[x][y] == 2) 
        { // 说明已经吃到事物.  
            map[squence[len].x][squence[len].y] = 1; 
            len++; 
            squence[len].x = x; 
            squence[len].y = y; 
            map[x][y] = 4; 
            eat = 1; 
        } 
        else 
        { 
            map[squence[1].x][squence[1].y] = 0; 
            for (i = 1; i <= len - 1; i++) 
            { 
                squence[i].x = squence[i + 1].x; 
                squence[i].y = squence[i + 1].y; 
                map[squence[i + 1].x][squence[i + 1].y] = 1; 
            } 
            squence[len].x = squence[len].x - 1; 
            if (gameover) 
            { 
                map[squence[len].x][squence[len].y] = 3; 
            } 
            else 
            { 
                map[squence[len].x][squence[len].y] = 4; 
            } 
        } 

     
    void Move_down(void) 

        int i; 
        int x, y; 
        if (len > 1 && squence[len].y == squence[len - 1].y && squence[len].x == squence[len - 1].x - 1) 
        { // 不能移动,则按原来的移动.  
            direction = 1; // 按原来的向上移动.  
            Move(direction); 
            return ; 
        } 
        // 开始移动.  
        x = squence[len].x + 1; 
        y = squence[len].y; 
        if (x == n + 1 || map[x][y] == 1) 
        { // 撞到边界或者自己撞到自己.  
            map[x][y] = 3; 
            gameover = 1; 
        } 
        if (map[x][y] == 2) 
        { // 说明已经吃到事物.  
            map[squence[len].x][squence[len].y] = 1; 
            len++; 
            squence[len].x = x; 
            squence[len].y = y; 
            map[x][y] = 4; 
            eat = 1; 
        } 
        else 
        { 
            map[squence[1].x][squence[1].y] = 0; 
            for (i = 1; i <= len - 1; i++) 
            { 
                squence[i].x = squence[i + 1].x; 
                squence[i].y = squence[i + 1].y; 
                map[squence[i + 1].x][squence[i + 1].y] = 1; 
            } 
            squence[len].x = squence[len].x + 1; 
            if (gameover) 
            { 
                map[squence[len].x][squence[len].y] = 3; 
            } 
            else 
            { 
                map[squence[len].x][squence[len].y] = 4; 
            } 
        } 

     
    void Move_left(void) 

        int i; 
        int x, y; 
        if (len > 1 && squence[len].x == squence[len - 1].x && squence[len].y == squence[len - 1].y + 1) 
        { // 不能移动,则按原来的移动.  
            direction = 4; // 按原来的向右移动.  
            Move(direction); 
            return ; 
        } 
        // 开始移动.  
        x = squence[len].x; 
        y = squence[len].y - 1; 
        if (y == 0 || map[x][y] == 1) 
        { // 撞到边界或者自己撞到自己.  
            map[x][y] = 3; 
            gameover = 1; 
        } 
        if (map[x][y] == 2) 
        { // 说明已经吃到事物.  
            map[squence[len].x][squence[len].y] = 1; 
            len++; 
            squence[len].x = x; 
            squence[len].y = y; 
            map[x][y] = 4; 
            eat = 1; 
        } 
        else 
        { 
            map[squence[1].x][squence[1].y] = 0; 
            for (i = 1; i <= len - 1; i++) 
            { 
                squence[i].x = squence[i + 1].x; 
                squence[i].y = squence[i + 1].y; 
                map[squence[i + 1].x][squence[i + 1].y] = 1; 
            } 
            squence[len].y = squence[len].y - 1; 
            if (gameover) 
            { 
                map[squence[len].x][squence[len].y] = 3; 
            } 
            else 
            { 
                map[squence[len].x][squence[len].y] = 4; 
            } 
        } 

     
    void Move_right(void) 

        int i; 
        int x, y; 
        if (len > 1 && squence[len].x == squence[len - 1].x && squence[len].y == squence[len - 1].y - 1) 
        { // 不能移动,则按原来的移动.  
            direction = 3; // 按原来的向左移动.  
            Move(direction); 
            return ; 
        } 
        // 开始移动.  
        x = squence[len].x; 
        y = squence[len].y + 1; 
        if (y == n + 1 || map[x][y] == 1) 
        { // 撞到边界或者自己撞到自己.  
            map[x][y] = 3; 
            gameover = 1; 
        } 
        if (map[x][y] == 2) 
        { // 说明已经吃到事物.  
            map[squence[len].x][squence[len].y] = 1; 
            len++; 
            squence[len].x = x; 
            squence[len].y = y; 
            map[x][y] = 4; 
            eat = 1; 
        } 
        else 
        { 
            map[squence[1].x][squence[1].y] = 0; 
            for (i = 1; i <= len - 1; i++) 
            { 
                squence[i].x = squence[i + 1].x; 
                squence[i].y = squence[i + 1].y; 
                map[squence[i + 1].x][squence[i + 1].y] = 1; 
            } 
            squence[len].y = squence[len].y + 1; 
            if (gameover) 
            { 
                map[squence[len].x][squence[len].y] = 3; 
            } 
            else 
            { 
                map[squence[len].x][squence[len].y] = 4; 
            } 
        } 

  • 相关阅读:
    使用terraform管理Proxmox VE资源
    Terraform Aliyun 创建ecs, kubernetes 实例
    如何在cmd中启动redis
    图片二维码解析URL
    Python爬取百度图片
    Python 爬取b站专栏图片
    python之JS逆向—破解头条抖音登录协议
    python 连接 mongodb 获取部分字段数据并换行写入txt文件
    列表套字典三者匹配对应关系
    python线程池 ThreadPoolExecutor 的用法及实战
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410987.html
Copyright © 2011-2022 走看看