代码实现贪吃蛇游戏

使用 C 语言实现贪吃蛇游戏的一般步骤:
1. 定义游戏区域的大小和相关常量,例如屏幕的宽度、高度,蛇的最大长度等。
2. 定义表示蛇、食物的数据结构。蛇可以使用链表来表示,每个节点包含坐标信息。食物可以用一个结构体包含坐标。
3. 初始化游戏,包括创建初始的蛇(通常在屏幕中间),生成初始的食物位置(在游戏区域内随机生成,但不能与蛇的位置重合)。
4. 实现控制蛇移动的逻辑。根据用户输入的方向(上、下、左、右)来改变蛇头的位置。
5. 判断蛇是否吃到食物,如果吃到,蛇身增长一节,并重新生成食物位置。
6. 判断蛇是否撞到边界或自己的身体,如果是,则游戏结束。
7. 绘制游戏界面,在屏幕上显示蛇、食物和边界。
8. 处理用户输入,获取用户按下的方向键,以控制蛇的移动方向。
9. 控制游戏的帧率,使用适当的延时来控制蛇的移动速度。
 

以下是一个简单的用 C 语言实现贪吃蛇游戏的示例代码,代码中包含了基本的游戏逻辑和界面显示:
 
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>

// 游戏区域的大小
#define WIDTH 60
#define HEIGHT 20

// 蛇的最大长度
#define MAX_LENGTH 100

// 方向枚举
typedef enum { UP, DOWN, LEFT, RIGHT } Direction;

// 食物结构体
typedef struct {
    int x;
    int y;
} Food;

// 蛇的节点结构体
typedef struct SnakeNode {
    int x;
    int y;
    struct SnakeNode *next;
} SnakeNode;

// 初始化蛇
SnakeNode *initSnake() {
    SnakeNode *head = (SnakeNode *)malloc(sizeof(SnakeNode));
    head->x = WIDTH / 2;
    head->y = HEIGHT / 2;
    head->next = NULL;
    return head;
}

// 生成食物
Food generateFood(SnakeNode *snake) {
    Food food;
    int flag = 1;
    while (flag) {
        food.x = rand() % WIDTH;
        food.y = rand() % HEIGHT;
        SnakeNode *p = snake;
        flag = 0;
        while (p) {
            if (p->x == food.x && p->y == food.y) {
                flag = 1;
                break;
            }
            p = p->next;
        }
    }
    return food;
}

// 移动蛇
void moveSnake(SnakeNode *snake, Direction direction, Food *food) {
    int x = snake->x;
    int y = snake->y;

    switch (direction) {
    case UP:
        y--;
        break;
    case DOWN:
        y++;
        break;
    case LEFT:
        x--;
        break;
    case RIGHT:
        x++;
        break;
    }

    // 判断是否吃到食物
    if (x == food->x && y == food->y) {
        SnakeNode *newNode = (SnakeNode *)malloc(sizeof(SnakeNode));
        newNode->x = x;
        newNode->y = y;
        newNode->next = snake;
        snake = newNode;
        *food = generateFood(snake);
    } else {
        SnakeNode *p = snake;
        while (p->next->next) {
            p = p->next;
        }
        p->next->x = x;
        p->next->y = y;
        SnakeNode *temp = p->next;
        p->next = NULL;
        free(temp);
    }
}

// 绘制游戏界面
void draw(SnakeNode *snake, Food food) {
    system("cls");
    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            if (i == 0 || i == HEIGHT - 1 || j == 0 || j == WIDTH - 1) {
                printf("#");
            } else {
                int flag = 0;
                SnakeNode *p = snake;
                while (p) {
                    if (p->x == j && p->y == i) {
                        printf("*");
                        flag = 1;
                        break;
                    }
                    p = p->next;
                }
                if (j == food.x && i == food.y) {
                    printf("@");
                    flag = 1;
                }
                if (!flag) {
                    printf(" ");
                }
            }
        }
        printf("\n");
    }
}

// 游戏主函数
int main() {
    SnakeNode *snake = initSnake();
    Direction direction = RIGHT;
    Food food = generateFood(snake);

    while (1) {
        if (_kbhit()) {
            char key = _getch();
            switch (key) {
            case 'w':
                if (direction!= DOWN) {
                    direction = UP;
                }
                break;
            case '':
                if (direction!= UP) {
                    direction = DOWN;
                }
                break;
            case 'a':
                if (direction!= RIGHT) {
                    direction = LEFT;
                }
                break;
            case 'd':
                if (direction!= LEFT) {
                    direction = RIGHT;
                }
                break;
            }
        }
        moveSnake(snake, direction, &food);
        draw(snake, food);
        Sleep(100);
    }

    return 0;
}
 
 
这段代码实现了一个简单的贪吃蛇游戏

  • 23
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的贪吃蛇游戏的C++代码实现,使用了Windows API进行图形界面的绘制。 ```c++ #include <iostream> #include <windows.h> using namespace std; const int Width = 30; // 地图宽度 const int Height = 20; // 地图高度 int map[Height][Width] = {0}; // 地图,0表示空,1表示食物,2表示蛇身 struct Snake { int x; int y; Snake *next; }; Snake *head, *tail; // 链表存储蛇身 int dir = 3; // 初始方向,1表示上,2表示左,3表示下,4表示右 void Init() { // 初始化蛇身 Snake *p = new Snake; p->x = Width / 2; p->y = Height / 2; p->next = NULL; head = tail = p; map[p->y][p->x] = 2; // 初始化食物 srand((unsigned)time(NULL)); int x = rand() % Width; int y = rand() % Height; while (map[y][x] != 0) { x = rand() % Width; y = rand() % Height; } map[y][x] = 1; } void DrawMap() { HANDLE hOut; hOut = GetStdHandle(STD_OUTPUT_HANDLE); COORD pos; pos.X = 0; pos.Y = 0; SetConsoleCursorPosition(hOut, pos); for (int i = 0; i < Height; i++) { for (int j = 0; j < Width; j++) { if (map[i][j] == 0) cout << " "; else if (map[i][j] == 1) cout << "@"; else cout << "#"; } cout << endl; } } void Move() { int newx, newy; newx = head->x; newy = head->y; if (dir == 1) newy--; else if (dir == 2) newx--; else if (dir == 3) newy++; else if (dir == 4) newx++; // 判断是否撞墙 if (newx < 0 || newx >= Width || newy < 0 || newy >= Height) { cout << "Game Over!" << endl; exit(0); } // 判断是否撞到自己 if (map[newy][newx] == 2) { cout << "Game Over!" << endl; exit(0); } // 判断是否吃到食物 if (map[newy][newx] == 1) { Snake *p = new Snake; p->x = newx; p->y = newy; p->next = NULL; tail->next = p; tail = p; map[newy][newx] = 2; int x = rand() % Width; int y = rand() % Height; while (map[y][x] != 0) { x = rand() % Width; y = rand() % Height; } map[y][x] = 1; } else { Snake *p = head; head = head->next; map[p->y][p->x] = 0; p->x = newx; p->y = newy; map[newy][newx] = 2; tail->next = p; tail = p; } } void Input() { if (_kbhit()) { int key = _getch(); if (key == 72 && dir != 3) dir = 1; else if (key == 75 && dir != 4) dir = 2; else if (key == 80 && dir != 1) dir = 3; else if (key == 77 && dir != 2) dir = 4; } } int main() { Init(); while (true) { DrawMap(); Move(); Input(); Sleep(200); } return 0; } ``` 该代码实现了基本的贪吃蛇游戏功能,但是由于使用了Windows API进行图形界面的绘制,因此只能在Windows系统下运行。如果需要在其他系统下运行,需要修改图形界面的绘制方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值