C语言实现彩色贪吃蛇

#include<stdio.h>
#include<time.h>
#include<Windows.h>
const int HEIGHT = 20;
const int WIDTH = 40;
struct Snakebody {
    int x, y;
    struct Snakebody* next;
};
struct Snakefood {
    int x;
    int y;
};
int sum = 0,JudgeSum = 0, Hard = 0;
int Pause = 200000000;
int JudgeDirection = 4;
Snakebody* Shead = NULL;
Snakebody* Shead_temp = NULL;
Snakebody* Sbody = NULL;
Snakebody* Send = NULL;
Snakefood* Food = NULL;
void Jfood();
void Jwall();
void Jsnake();
void MakeFood();
void ControlMove();
void MoveCursor(int x, int y);
void Move();
void Free();
inline void hide() {
    CONSOLE_CURSOR_INFO cursor_info = { 1,0 };
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void MoveCursor(int x, int y)//设置光标位置
{
    COORD pos = { x * 2,y };
    HANDLE output = GetStdHandle(STD_OUTPUT_HANDLE);   
    SetConsoleCursorPosition(output, pos); //设置控制台光标位置
}
inline void Score_HardLevel()
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
    MoveCursor(33, 5);
    printf("Score:%d", sum);
    MoveCursor(33, 7);
    printf("Hard :%d", Hard);
}
inline void printsnake()
{
    printf("                                                                                         \n");
    printf("                       __________                                                        \n");
    printf("                      /          \\                                                      \n");
    printf("                     /  ________  \\                                                     \n");
    printf("                     |  |      |__|                                                      \n");
    printf("                     |  |                                                                \n");
    printf("                     \\  \\_______                              ____                     \n");
    printf("                      \\         \\    ____ ____      ____   __ |  |  ___   ______       \n");
    printf("                       \\_______  \\   |  |/    \\    /    \\_/ / |  | /  /  /      \\   \n");
    printf("                               \\  \\  |    ___  \\  / ____   /  |  |/  /  /  ____  \\   \n");
    printf("                     __        |  |  |   /   \\  \\ | |  |  /   |     /  |  /____\\  |   \n");
    printf("                    \\  \\_______|  |  |  |    |  | | |__|  |   |     \\  |  ________/   \n");
    printf("                     \\            /  |  |    |  |  \\       \\  |  |\\  \\  \\  \\____  \n");
    printf("                      \\__________/   |__|    |__|   \\___/\\__\\ |__| \\__\\  \\______/ \n");
}
inline void Start_screen()
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
    MoveCursor(1, 1);
    printsnake();
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
    MoveCursor(18, 16);
    printf("Spike 2020.5.8");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE);
    MoveCursor(21, 18);
    printf("按回车键开始");
    getchar();
    system("cls");
}
inline void DrawMap() {
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
    for (int i = 0; i < WIDTH; i++) printf("■");
    printf("\n");
    for (int i = 1; i < HEIGHT - 1; i++)
        for (int j = 0; j < WIDTH; j++)
            if (j == 0 || j == WIDTH - 1 || j == WIDTH - 10) {
                printf("■");
                if (j == WIDTH - 1) printf("\n");
            }
            else printf("  ");
    for (int i = 0; i < WIDTH; i++) printf("■");
    Score_HardLevel();
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);
    MoveCursor(34, 10);
    printf("↑");
    MoveCursor(31, 11);
    printf("使用←↓→控制蛇");
    MoveCursor(31, 12);
    printf("移动,每获得五分");
    MoveCursor(31, 13);
    printf("难度加一,撞墙游");
    MoveCursor(31, 14);
    printf("戏结束");
}
inline void Initialization_Snake() {
    for (int i = 0; i < 5; i++) {
        Sbody = (Snakebody*)malloc(sizeof(Snakebody));
        Sbody->x = 5 - i;
        Sbody->y = 5;
        Sbody->next = NULL;
        if (Shead == NULL) Shead = Sbody;
        else Send->next = Sbody;
        Send = Sbody;
    }
    Shead_temp = Shead;
    while (Shead_temp->next != NULL) {
        MoveCursor(Shead_temp->x, Shead_temp->y);
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
        printf("■");
        Shead_temp = Shead_temp->next;
    }
}
inline void MakeFood() {
    srand((int)time(0));//随机种子
    int x = rand() % 27 + 2;
    int y = rand() % 17 + 2;
    Shead_temp = Shead;
    while (1) {
        if (Shead_temp->next == NULL) {
            if (Shead_temp->x == x && Shead_temp->y == y) {
                x = rand() % 27 + 2;
                y = rand() % 17 + 2;
            }
            break;
        }
        if (Shead_temp->x == x && Shead_temp->y == y) {
            x = rand() % 27 + 2;
            y = rand() % 17 + 2;
        }
        else Shead_temp = Shead_temp->next;
        if (Shead_temp->next == NULL) {
            if (Shead_temp->x == x && Shead_temp->y == y) {
                x = rand() % 27 + 2;
                y = rand() % 17 + 2;
            }
            break;
        }
    }
    MoveCursor(x, y);
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN);
    printf("★");
    Food = (Snakefood*)malloc(sizeof(Snakefood));
    Food->x = x;
    Food->y = y;
    Score_HardLevel();
    sum++;
}
inline void ControlMove() {
    if (GetAsyncKeyState(VK_UP) && 0x8000)
        if (JudgeDirection != 2) JudgeDirection = 1;
    if (GetAsyncKeyState(VK_DOWN) && 0x8000)
        if (JudgeDirection != 1) JudgeDirection = 2;
    if (GetAsyncKeyState(VK_RIGHT) && 0x8000)
        if (JudgeDirection != 3) JudgeDirection = 4;
    if (GetAsyncKeyState(VK_LEFT) && 0x8000)
        if (JudgeDirection != 4) JudgeDirection = 3;
    if (GetAsyncKeyState(VK_RETURN) && 0x0D)
        while (1)
            if (GetAsyncKeyState(VK_RETURN) && 0x0D) break;
}
inline void Jfood() {
    Shead_temp = Shead;
    if (Shead_temp->x == Food->x && Shead_temp->y == Food->y) {
        MakeFood();
        JudgeSum += 1;
        if (JudgeSum == 5) {
            JudgeSum = 0;
            Hard += 1;
            Pause -= 20000000;
        }
        while (Shead_temp->next != NULL)
            Shead_temp = Shead_temp->next;
        Snakebody* t = (Snakebody*)malloc(sizeof(Snakebody));
        t->x = Food->x;
        t->y = Food->y;
        t->next = NULL;
        Shead_temp->next = t;
        MoveCursor(Shead_temp->x, Shead_temp->y);
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
        printf("■");
    }
}
inline void Move() {
    while (1) {
        hide();
        Shead_temp = Shead;
        while (Shead_temp->next->next != NULL)
            Shead_temp = Shead_temp->next;
        Shead_temp->next = NULL;
        for (int i = 0; i < Pause; i++) {}
        ControlMove();
        MoveCursor(Shead_temp->x, Shead_temp->y);
        printf("  ");
        Snakebody* Shead_2 = (Snakebody*)malloc(sizeof(Snakebody));
        if (JudgeDirection == 1) {
            Shead_2->x = Shead->x;
            Shead_2->y = Shead->y - 1;
        }
        if (JudgeDirection == 2) {
            Shead_2->x = Shead->x;
            Shead_2->y = Shead->y + 1;
        }
        if (JudgeDirection == 3) {
            Shead_2->x = Shead->x - 1;
            Shead_2->y = Shead->y;
        }
        if (JudgeDirection == 4) {
            Shead_2->x = Shead->x + 1;
            Shead_2->y = Shead->y;
        }
        Shead_2->next = Shead;
        Shead = Shead_2;
        MoveCursor(Shead_2->x, Shead_2->y);
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
        printf("■");
        Jfood();
        Jwall();
        Jsnake();
    }
}
inline void Jwall() {
    if (Shead->x == 0 || Shead->x == 30 || Shead->y == 0 || Shead->y == 19) {
        MoveCursor(10, 20);
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
        printf("抱歉,你撞到了墙壁,游戏结束!");
        system("pause>nul");
        exit(0);
    }
}
inline void Jsnake() {
    Shead_temp = Shead->next;
    while (Shead_temp->next != NULL) {
        if ((Shead->x == Shead_temp->x) && (Shead->y == Shead_temp->y)) {
            MoveCursor(10, 20);
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
            printf("抱歉,你撞到了自己,游戏结束!");
            system("pause>nul");
            exit(0);
        }
        Shead_temp = Shead_temp->next;
    }
}
inline void Free() {
    while (Shead->next != NULL) {
        Shead = Shead->next;
        free(Shead);
    }
    free(Shead);
    while (Shead_temp->next != NULL) {
        Shead_temp = Shead_temp->next;
        free(Shead_temp);
    }
    free(Shead_temp);
    while (Sbody->next != NULL) {
        Sbody = Sbody->next;
        free(Sbody);
    }
    free(Sbody);
    while (Send->next != NULL) {
        Send = Send->next;
        free(Send);
    }
    free(Send);
    free(Food);
}
int main() {
    hide();
    Start_screen();
    DrawMap();
    Initialization_Snake();
    MakeFood();
    Move();
    Free();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值