用C语言写个最简单的贪吃蛇

本文介绍了使用C语言编写贪吃蛇游戏的基本思路,包括定义游戏窗口、元素符号,初始化蛇头、蛇尾和食物,通过用户输入控制蛇的移动,判断游戏状态,并展示游戏效果。提供了详细的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、思路

  1. 定义二维数组window表示窗口;
  2. 定义BLANK、BORDER、SNAKE、FOOD 分别表示:空白、边框、蛇身、食物;
  3. 定义并初始化: 蛇头,蛇尾,食物;
  4. 显示初始窗口;
  5. 循环getchar,确定move方向,并使用fifo保存move方向,用于移动蛇尾;
  6. 计算新的蛇头,判断新蛇头为空白则移动蛇尾;为食物则不移动蛇尾,并重新生成食物;其他情况则直接结束游戏;
  7. 显示蛇头;
  8. 显示窗口。

二、最终效果

lim@TIM:~/code/game$ ./main 
OOOOOOOOOOOOOOOO
O          *   O
O    DDD       O
O      D       O
O      D       O
O      D  D    O
O      DDDD    O
O              O
O              O
O              O
O              O
O              O
O              O
O              O
O              O
OOOOOOOOOOOOOOOO

三、代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <memory.h>

#define XLEN 16
#define YLEN 16

enum {
    BLANK = ' ',    // 空白
    BORDER = 'O',   // 边框
    SNAKE = 'D',    // 蛇身
    FOOD = '*',     // 食物
};

typedef struct point {
    int x;
    int y;
}point;

typedef struct queue
{
    char buf[256];
    char in;
    char out;
}queue;

void queue_init(queue *q)
{
    q->in = 0;
    q->out = 0;
}

void queue_push(queue *q, char c)
{
    q->buf[q->in++] = c;
}

char queue_pop(queue *q)
{
    return q->buf[q->out++];
}

static char window[XLEN][YLEN] = {0};
static point head;
static point tail;
static point food;
static queue action_queue;


point get_rand_point() {
    struct point node;
    do
    {
        node.x = rand() % (XLEN - 2) + 1;
        node.y = rand() % (YLEN - 2) + 1;
    } while (window[node.x][node.y] != BLANK);
    
    return node;
}

void window_init()
{
    memset(window, BLANK, sizeof(window));

    for (int x = 0; x < XLEN; ++x) {
        window[x][0] = BORDER;
        window[x][YLEN - 1] = BORDER;
    }

    for (int y = 0; y < YLEN; ++y) {
        window[0][y] = BORDER;
        window[XLEN - 1][y] = BORDER;
    }

    head = get_rand_point();
    tail = head;
    food = get_rand_point();
    window[head.x][head.y] = SNAKE;
    window[food.x][food.y] = FOOD;
}

void window_show()
{
    for (int y = 0; y < YLEN; ++y) {
        for (int x = 0; x < XLEN; ++x) {
            printf("%c", window[x][y]);
        }        
        printf("\n");
    }    
}

int move(point *node, char c) 
{
    switch (c) {
    case 'a':
        node->x -= 1;
        break;
    case 'd':
        node->x += 1;
        break;
    case 'w':
        node->y -= 1;
        break;
    case 's':
        node->y += 1;
        break;

    default:
        return -1;
    }

    return 0; 
}

int main(int argc, char *argv[])
{
    srand((unsigned int)time(0));
    window_init();
    window_show(window, XLEN, YLEN);

    queue_init(&action_queue);
    char c = 0;
    while ((c = getchar()) != EOF) {
        if (move(&head, c))
            continue;  
        
        queue_push(&action_queue, c);

        switch (window[head.x][head.y]) {
        case BORDER:
        case SNAKE:
            goto gameover;
        case FOOD:
            food = get_rand_point();
            window[food.x][food.y] = FOOD;
            break;
         case BLANK:
            window[tail.x][tail.y]= BLANK;
            move(&tail, queue_pop(&action_queue));
            break;
        }
        
        window[head.x][head.y]= SNAKE;

        printf("\r\033[%dA", YLEN + 1);
        window_show((int **)window, XLEN, YLEN); 
    }

gameover:
    printf("game over\n");
}
好的,下面给出一个简单贪吃蛇小游戏的 C 语言代码,仅供参考: ```c #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <time.h> #define ROW 15 // 地图行数 #define COL 20 // 地图列数 // 定义方向 #define UP 1 #define DOWN 2 #define LEFT 3 #define RIGHT 4 int map[ROW][COL]; // 地图 int snake[ROW * COL][2]; // 蛇身 int fx, fy; // 食物坐标 int len; // 蛇长度 int dir; // 当前方向 // 初始化地图 void init_map(void) { int i, j; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { if (i == 0 || j == 0 || i == ROW - 1 || j == COL - 1) { map[i][j] = 1; } else { map[i][j] = 0; } } } } // 初始化蛇 void init_snake(void) { len = 3; dir = RIGHT; snake[0][0] = ROW / 2; snake[0][1] = COL / 2 - 1; snake[1][0] = ROW / 2; snake[1][1] = COL / 2; snake[2][0] = ROW / 2; snake[2][1] = COL / 2 + 1; } // 画地图 void draw_map(void) { int i, j; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { if (map[i][j] == 1) { printf("#"); } else if (map[i][j] == 2) { printf("*"); } else if (map[i][j] == 3) { printf("O"); } else { printf(" "); } } printf("\n"); } } // 画蛇 void draw_snake(void) { int i; for (i = 0; i < len; i++) { map[snake[i][0]][snake[i][1]] = 3; } } // 生成食物 void gen_food(void) { srand((unsigned)time(NULL)); do { fx = rand() % (ROW - 2) + 1; fy = rand() % (COL - 2) + 1; } while (map[fx][fy] != 0); map[fx][fy] = 2; } // 移动蛇 void move_snake(void) { int i; for (i = len - 1; i > 0; i--) { snake[i][0] = snake[i - 1][0]; snake[i][1] = snake[i - 1][1]; } switch (dir) { case UP: snake[0][0]--; break; case DOWN: snake[0][0]++; break; case LEFT: snake[0][1]--; break; case RIGHT: snake[0][1]++; break; } } // 判断游戏是否结束 int is_game_over(void) { int i; if (map[snake[0][0]][snake[0][1]] == 1) { return 1; } for (i = 1; i < len; i++) { if (snake[0][0] == snake[i][0] && snake[0][1] == snake[i][1]) { return 1; } } return 0; } // 判断是否吃到食物 int is_eat_food(void) { if (snake[0][0] == fx && snake[0][1] == fy) { return 1; } return 0; } // 游戏主循环 void game_loop(void) { while (1) { system("cls"); // 清屏 draw_map(); // 画地图 draw_snake(); // 画蛇 gen_food(); // 生成食物 if (kbhit()) { // 检测键盘输入 switch (getch()) { case 'w': case 'W': if (dir != DOWN) { dir = UP; } break; case 's': case 'S': if (dir != UP) { dir = DOWN; } break; case 'a': case 'A': if (dir != RIGHT) { dir = LEFT; } break; case 'd': case 'D': if (dir != LEFT) { dir = RIGHT; } break; } } move_snake(); // 移动蛇 if (is_game_over()) { // 判断游戏是否结束 printf("Game over!\n"); break; } if (is_eat_food()) { // 判断是否吃到食物 len++; } Sleep(200); // 延时 } } int main(void) { init_map(); // 初始化地图 init_snake(); // 初始化蛇 game_loop(); // 游戏主循环 return 0; } ``` 注意:上述代码中使用了一些 Windows 系统下的头文件和函数,如果在其他系统下可能需要做出相应的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值