C++贪吃蛇小游戏

81 篇文章 0 订阅
15 篇文章 1 订阅


(注:此文章采用C++语言写法,并非C、C#、Python、Python3写法,请留意您的编程语言!!!)



#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<conio.h>
#include<time.h>

#define Map_long 20
#define Map_high 15

typedef struct snake {
    int goods_class;
    int direction;
} SNAKE;

/*-------------------------------------------------------*/
/*                    全局变量声明区                      */

/* 二维结构体数组里goods_class的值,0代表活动区域(空格),
* 1代表■(地图砖头),2代表★(食物),3代表●(蛇头)
* 3之后的数字代表◎(蛇身),3+蛇长度-1表示◎(蛇尾)*/
/*direction表示蛇移动的方向,↑8,↓2,←4,→6*/
SNAKE Snake[Map_high][Map_long] = { { 0 } };

unsigned die = 0;  //1表示游戏结束
unsigned snake_move = 0;  //移动成功,用来跳出三重循环
unsigned eat_food = 0;  //1表示碰到食物,2表示用来跳出循环
unsigned snake_long = 3;  //记录蛇的长度

void Move(int ch);  //蛇移动的函数

void HideCursor();  //隐藏光标函数

int main(void) {
    system("mode con:cols=43 lines=20");  //将控制台设置成长41,高18
    HideCursor();

    /*定义局部变量区域*/
    unsigned i, j;
    unsigned food = 0;  //食物存在的标志,1代表食物存在
    unsigned food_x, food_y;  //产生食物的临时坐标
    unsigned score = 0;  //统计分数
    char ch = '\0';  //用来获取↑↓←→

    /*播种子*/
    srand((unsigned)time(NULL));

    /*初始化地图*/
    for (i = 0; i < Map_long; i++) {
        Snake[0][i].goods_class = 1;
        Snake[Map_high - 1][i].goods_class = 1;
    }
    for (i = 0; i < Map_high; i++) {
        Snake[i][0].goods_class = 1;
        Snake[i][Map_long - 1].goods_class = 1;
    }

    /*初始化蛇的位置*/
    for (i = 0; i < snake_long; i++)
        Snake[Map_high / 2][Map_long / 2 + i].goods_class = snake_long + i;

    while (1) {
        while (!_kbhit()) {
            switch (ch) {
                case 72:
                    Move(8);
                    break;
                case 75:
                    Move(4);
                    break;
                case 77:
                    Move(6);
                    break;
                case 80:
                    Move(2);
                    break;
                default:
                    break;
            }

            if (eat_food == 2) { //2表示吃到食物,开始重置状态
                food = 0;  //食物没有了
                eat_food = 0;  //重新判定是否吃到食物
                snake_long++;  //蛇的长度加1
                score++;  //增加分数
            }

            /*产生食物*/
            do {
                if (food == 1)
                    break;
                food_x = rand() % Map_long;
                food_y = rand() % Map_high;
                if (Snake[food_y][food_x].goods_class == 0) {
                    Snake[food_y][food_x].goods_class = 2;
                    food++;
                    break;
                }
            } while (1);

            printf("Grade:%u\n", score);
            for (i = 0; i < Map_high; i++) {
                if (die == 1)
                    break;

                for (j = 0; j < Map_long; j++) {
                    switch (Snake[i][j].goods_class) {
                        case 0:
                            printf("  ");
                            break;
                        case 1:
                            printf("■");
                            break;
                        case 2:
                            printf("★");
                            break;
                        case 3:
                            printf("●");
                            break;
                        default:
                            printf("◎");
                            break;
                    }
                }
                putchar('\n');
            }
            printf("Up↑ Down↓ Left← Right→ Other Pause.");

            Sleep(200);
            system("cls");

            if (die == 1)
                break;
        }
        if (die == 1)
            break;

        do {
            ch = _getch();
        } while (ch != -32 && ch != 80 && ch != 72 && ch != 77 && ch != 75);
        ch = _getch();
    }
    system("cls");
    printf("Game Over,your grade is %u.\n", score);
    getchar();
    return 0;
}

void Move(int ch) {
    int i, j, n;
    int direction;  //临时存储方向

    for (n = 0; n < snake_long; n++)
        for (i = 0; i < Map_high; i++) {
            if (snake_move == 1) {
                snake_move = 0;
                break;
            }
            if (eat_food == 2)
                break;
            for (j = 0; j < Map_long; j++)
                if (Snake[i][j].goods_class == 3 + n) {
                    /*第一次获取按键,初始化蛇的运动状态*/
                    if (Snake[i][j].goods_class == 3 && Snake[i][j].direction == 0) {
                        Snake[i][j].direction = ch;
                        Snake[i][j + 1].direction = 4;
                        Snake[i][j + 2].direction = 4;
                    } else if (Snake[i][j].goods_class == 3) //重置蛇头的方向
                        Snake[i][j].direction = ch;

                    /*进行移动前,先判断蛇头是否碰到死亡因子*/
                    if (Snake[i][j].goods_class == 3) {
                        if (Snake[i][j].direction == 8 && Snake[i - 1][j].goods_class != 0 && Snake[i - 1][j].goods_class != 2)
                            die++;

                        else if (Snake[i][j].direction == 2 && Snake[i + 1][j].goods_class != 0 && Snake[i + 1][j].goods_class != 2)
                            die++;

                        else if (Snake[i][j].direction == 4 && Snake[i][j - 1].goods_class != 0 && Snake[i][j - 1].goods_class != 2)
                            die++;

                        else if (Snake[i][j].direction == 6 && Snake[i][j + 1].goods_class != 0 && Snake[i][j + 1].goods_class != 2)
                            die++;
                    }

                    /*进行移动前,先判断蛇头是否碰到食物*/
                    if (Snake[i][j].goods_class == 3) {
                        if (Snake[i][j].direction == 8 && Snake[i - 1][j].goods_class == 2)
                            eat_food++;

                        else if (Snake[i][j].direction == 2 && Snake[i + 1][j].goods_class == 2)
                            eat_food++;

                        else if (Snake[i][j].direction == 4 && Snake[i][j - 1].goods_class == 2)
                            eat_food++;

                        else if (Snake[i][j].direction == 6 && Snake[i][j + 1].goods_class == 2)
                            eat_food++;
                    }

                    if (die == 1)
                        break;

                    /*蛇尾的移动*/
                    if (Snake[i][j].goods_class == 3 + snake_long - 1) {
                        if (eat_food == 1) { //吃到食物就更新蛇尾
                            if (Snake[i][j].direction == 8) {
                                direction = Snake[i - 1][j].direction;
                                Snake[i - 1][j] = Snake[i][j];
                                Snake[i - 1][j].direction = direction;
                                Snake[i][j].goods_class = 3 + snake_long;
                            } else if (Snake[i][j].direction == 2) {
                                direction = Snake[i + 1][j].direction;
                                Snake[i + 1][j] = Snake[i][j];
                                Snake[i + 1][j].direction = direction;
                                Snake[i][j].goods_class = 3 + snake_long;
                            } else if (Snake[i][j].direction == 4) {
                                direction = Snake[i][j - 1].direction;
                                Snake[i][j - 1] = Snake[i][j];
                                Snake[i][j - 1].direction = direction;
                                Snake[i][j].goods_class = 3 + snake_long;
                            } else if (Snake[i][j].direction == 6) {
                                direction = Snake[i][j + 1].direction;
                                Snake[i][j + 1] = Snake[i][j];
                                Snake[i][j + 1].direction = direction;
                                Snake[i][j].goods_class = 3 + snake_long;
                            }
                            snake_move++;
                            eat_food++;
                            break;
                        } else {
                            if (Snake[i][j].direction == 8) {
                                Snake[i][j].direction = Snake[i - 1][j].direction;
                                Snake[i - 1][j] = Snake[i][j];
                                Snake[i][j].goods_class = 0;
                            } else if (Snake[i][j].direction == 2) {
                                Snake[i][j].direction = Snake[i + 1][j].direction;
                                Snake[i + 1][j] = Snake[i][j];
                                Snake[i][j].goods_class = 0;
                            } else if (Snake[i][j].direction == 4) {
                                Snake[i][j].direction = Snake[i][j - 1].direction;
                                Snake[i][j - 1] = Snake[i][j];
                                Snake[i][j].goods_class = 0;
                            } else if (Snake[i][j].direction == 6) {
                                Snake[i][j].direction = Snake[i][j + 1].direction;
                                Snake[i][j + 1] = Snake[i][j];
                                Snake[i][j].goods_class = 0;
                            }
                            snake_move++;
                            break;
                        }
                    }

                    /*蛇头的移动*/
                    if (Snake[i][j].goods_class == 3) {
                        if (Snake[i][j].direction == 8)
                            Snake[i - 1][j] = Snake[i][j];

                        else if (Snake[i][j].direction == 2)
                            Snake[i + 1][j] = Snake[i][j];

                        else if (Snake[i][j].direction == 4)
                            Snake[i][j - 1] = Snake[i][j];

                        else if (Snake[i][j].direction == 6)
                            Snake[i][j + 1] = Snake[i][j];
                        snake_move++;
                        break;
                    }

                    /*蛇身的移动*/
                    if (Snake[i][j].direction == 8) {
                        direction = Snake[i - 1][j].direction;
                        Snake[i - 1][j] = Snake[i][j];
                        Snake[i - 1][j].direction = direction;
                    } else if (Snake[i][j].direction == 2) {
                        direction = Snake[i + 1][j].direction;
                        Snake[i + 1][j] = Snake[i][j];
                        Snake[i + 1][j].direction = direction;
                    } else if (Snake[i][j].direction == 4) {
                        direction = Snake[i][j - 1].direction;
                        Snake[i][j - 1] = Snake[i][j];
                        Snake[i][j - 1].direction = direction;
                    } else if (Snake[i][j].direction == 6) {
                        direction = Snake[i][j + 1].direction;
                        Snake[i][j + 1] = Snake[i][j];
                        Snake[i][j + 1].direction = direction;
                    }
                    snake_move++;
                    break;
                }
        }
}

void HideCursor() { //隐藏光标函数
    CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值