C++ 貪吃蛇代碼實現


//1.蛇的生成
//2.食物的生成
//3.邊界的生成
//4.開始游戲
//5.控制蛇的移動方向
//    a>若蛇吃到食物,身體+1,食物重新生成
//    b>若蛇碰到牆壁或碰到自己身體,死亡
//  c>蛇死亡之后打印分數
//6.游戲結束
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <windows.h>
#include <conio.h>
#include<time.h>
#define HIGH 20
#define WIDTH 50

struct BODY {
    int x;
    int y;
};

struct SNAKE {
    BODY body[WIDTH*HIGH];//身體
    int size;//記錄蛇的長度
    int score;//記錄獲得的分數
    COORD coord;//光標的位置信息
    //定義蛇的方向
    int dx;//dx為正則向右,為負則向左
    int dy;//dy為正則向下,為負則向上
    BODY tial; //記錄蛇的尾巴
    BODY food;//定義食物
};

void _init_snake(SNAKE* snake) {
    //初始化蛇頭
    snake->body[0].x = WIDTH / 2;
    snake->body[0].y = HIGH / 2;
    //初始化蛇尾坐標
    snake->body[1].x = WIDTH / 2 - 1;
    snake->body[1].y = HIGH / 2;
    snake->size = 2;
    snake->score = 0;

    snake->dx = 1;//初始化蛇向右移動
    snake->dy = 0;

    snake->tial.x = snake->body[snake->size - 1].x;
    snake->tial.y = snake->body[snake->size - 1].y;
}
void hide_cur()
{
    //隱藏控制台光標
    CONSOLE_CURSOR_INFO  cci;
    cci.dwSize = sizeof(cci);
    cci.bVisible = FALSE;
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
}
void _init_food(SNAKE * snake) {
    srand(time(NULL));//設置隨機數種子
    snake->food.x = rand() % WIDTH;
    snake->food.y = rand() % HIGH;
}
void _init_well() {
    for (int i = 0; i <= HIGH; i++) {
        for (int j = 0; j <= WIDTH; j++) {
            if (i == HIGH || j == WIDTH) {
                printf("+");
            }
            else {
                printf(" ");
            }
        }
        printf("\n");
    }
}
void show_snake(SNAKE *snake) {
    //顯示蛇 注意: 每次顯示蛇或食物,都要設置顯示的位置,(光標的位置)
    for (int i = 0; i < snake->size; i++) {
        snake->coord.X = snake->body[i].x;
        snake->coord.Y = snake->body[i].y;
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), snake->coord);
        if (i == 0) {
            printf("@");
        }
        else {
            printf("*");
        }
    }
    snake->coord.X = snake->tial.x;
    snake->coord.Y = snake->tial.y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), snake->coord);
    printf(" ");

}
void show_food(SNAKE * snake) {
    snake->coord.X = snake->food.x;
    snake->coord.Y = snake->food.y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),snake->coord);
    printf("#");
    hide_cur();
}
void control_snake(SNAKE *snake,int &sleepTime) {
    char  key = 0;
    while (_kbhit()) //判斷是否按下按鍵,按下不等於0 
    {
        key = _getch();
    }
    if (key == 'a') {
        if (snake->dx == -1) {
            sleepTime = 50;
        }
        else {
            snake->dx = -1;
            snake->dy = 0;
        }
    }
    if (key == 'w') {
        if (snake->dy == -1) {
            sleepTime = 50;
        }
        else {
            snake->dx = 0;
            snake->dy = -1;
        }
    }
    if (key == 's') {
        if (snake->dy == 1) {
            sleepTime = 50;
        }
        else {
            snake->dx = 0;
            snake->dy = 1;
        }

    }
    if (key == 'd') {
        if (snake->dx == 1) {
            sleepTime = 50;
        }
        else {
            snake->dx = 1;
            snake->dy = 0;
        }
    }
}

void show_ui(SNAKE *snake) {
    //顯示蛇的位置
    show_snake(snake);
    //顯示食物的位置
    show_food(snake);
}
void game_end(SNAKE *snake) {
    //結束游戲
    COORD coord;
    coord.X = 5;
    coord.Y = 23;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
    printf("游戲結束,您的得分是:%d\n", snake->score);
    Sleep(3000);
    exit(0);//退出進程
}
void snake_eat_body(SNAKE *snake) {
    //校驗蛇碰到自己
    for (int i = 1; i < snake->size - 1; i++) {
        if (snake->body[0].x ==snake->body[i].x && snake->body[0].y == snake->body[i].y) {
            game_end(snake);
        }
    }
}

void snake_move(SNAKE *snake) {
    //蛇的尾部改變
    snake->tial.x = snake->body[snake->size - 1].x;
    snake->tial.y = snake->body[snake->size - 1].y;

    //蛇頭后面的身體每一節為前一節位置
    for (int i = snake->size - 1; i > 0; i--) {
        snake->body[i].x = snake->body[i - 1].x;
        snake->body[i].y = snake->body[i - 1].y;
    }
    //蛇頭因方向而改變
    snake->body[0].x += snake->dx;
    snake->body[0].y += snake->dy;
}
void snake_eat_food(SNAKE * snake) {
    //判斷蛇吃食物
    if (snake->body[0].x == snake->food.x&&snake->body[0].y == snake->food.y) {
        snake->size +=1;
        snake->score += 10;
        _init_food(snake);
    }
}

void _game_start(SNAKE *snake,int sleepTime) {
    //初始化食物
    _init_food(snake);
    _init_snake(snake);
    while (snake->body[0].x<WIDTH&& snake->body[0].x>0 && snake->body[0].y<HIGH&&snake->body[0].y>0) {

        //控制蛇的身體
        control_snake(snake,sleepTime);
        //蛇的移動
        snake_move(snake);
        //蛇是否碰到自己
        snake_eat_body(snake);
        //判斷蛇吃食物
        snake_eat_food(snake);
        //顯示
        show_ui(snake);
        Sleep(sleepTime);//延時0.3s
        
        //重置移動速度
        sleepTime = 300;
    }
    //游戲結束
    game_end(snake);
}

int main() {
    //申請蛇的空間
    SNAKE *snake = (SNAKE *)malloc(sizeof(SNAKE));
    //初始化牆
    _init_well();
    //初始化休眠時間(便於設置加速)
    int sleepTime = 300;
    _game_start(snake,sleepTime);
    system("pause");
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM