注册 登录
编程论坛 C语言论坛

分享一个贪食蛇游戏,供参考

我善治鬼 发布于 2025-02-24 00:32, 232 次点击

#include <stdio.h>
#include <windows.h>

int main()
{
    char strbuf[1000];
    int length = 1, gridSize = 20, mapW = 800, mapH = 600, lose = 0, eat;
    POINT snake[1000] = { 5, 10 }, food = { 15, 10 }, direction = { 1, 0 }, move;
    HWND hwnd = GetConsoleWindow();
    HDC dc = GetDC(hwnd);
    MoveWindow(hwnd, 100, 100, 1000, 800, FALSE);
    while (snake[0].x >= 0 && snake[0].y >= 0 && snake[0].x < mapW / gridSize && snake[0].y < mapH / gridSize && lose == 0) {
        PatBlt(dc, 0, 0, 1000, 800, WHITENESS);
        PatBlt(dc, 0, 0, mapW, mapH, BLACKNESS);
        if (GetAsyncKeyState(VK_LEFT)) (direction.x = -1, direction.y = 0);
        if (GetAsyncKeyState(VK_RIGHT)) (direction.x = 1, direction.y = 0);
        if (GetAsyncKeyState(VK_UP)) (direction.x = 0, direction.y = -1);
        if (GetAsyncKeyState(VK_DOWN)) (direction.x = 0, direction.y = 1);
        move.x = snake[0].x + direction.x;
        move.y = snake[0].y + direction.y;
        for (int i = length - 1; i >= 0; i -= 1) {
            if (snake[i].x == move.x && snake[i].y == move.y) lose = 1;
            snake[i] = (i == 0 ? move : snake[i - 1]);
            PatBlt(dc, snake[i].x * gridSize + 1, snake[i].y * gridSize + 1, gridSize - 2, gridSize - 2, WHITENESS);
        }
        if (snake[0].x == food.x && snake[0].y == food.y) {
            food.x = rand() % mapW / gridSize;
            food.y = rand() % mapH / gridSize;
            length += 1;
            eat = 1;
        }
        else eat = 0;
        PatBlt(dc, food.x * gridSize + gridSize / 4, food.y * gridSize + gridSize / 4, gridSize / 2, gridSize / 2, WHITENESS);
        TextOutA(dc, 0, 0, strbuf, sprintf_s(strbuf, "說明: 鍵盤上下左右鍵控制方向. 蛇長度: %d, 蛇頭位置X: %d, 蛇頭位置Y: %d, 食物位置X: %d, 食物位置Y: %d", length, snake[0].x, snake[0].y, food.x, food.y));
        if (eat) Beep(600, 200);
        else Beep(60, 200);
    }
    printf("吃到自己或撞墻, 遊戲失敗");
    return 0;
}

只有本站会员才能查看附件,请 登录
2 回复
#2
不会游泳的虾2025-02-24 10:27
#3
gbdesert2025-02-25 23:16
能写成这样也不错了。
1