C语言低配贪吃蛇小游戏

字符游戏——贪吃蛇


如何用C语言写出一个贪吃蛇小游戏呢?
首先是游戏的场景设定,首先初始化和相关预设定及变量声明:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>r BL_CHA ' ';
char WALL_CHAR = '*';
char SNAKE_HEAD_CHAR = 'H';
char SNAKE_BODY_CHAR = 'X';
char FOOD_CHAR = '$';
char map[12][13] = {
    "************",
    "*XXXXH     *",
    "*          *",
    "*          *",
    "*          *",
    "*          *",
    "*          *",
    "*          *",
    "*          *",
    "*          *",
    "*          *",
    "************",
};

int snakeBodyX[100] = { 1,1,1,1 }, snakeBodyY[100] = { 4,3,2,1 };
int snakeBodyLen = 4;
int snakeTailIndex = 3;
int willBeLonger = 0;

int foodX = 0, foodY = 0;

int gameRunning = 1;

然后要每输入符界面刷新一次:


void printMap() {
system("cls");
for (int i = 0; i < 12; ++i) {
printf("%s\n", map[i]);
}
}

随机创建食物:

void spaood() {
    // Random food position
    foodX = rand() % 10 + 1;
    foodY = rand() % 10 + 1;
    while (map[foodX][foodY] != BLANK_CHAR) {
        foodX = rand() % 10 + 1;
        foodY = rand() % 10 + 1;
    }
    map[foodX][foodY] = FOOD_CHAR;
}

输入字符移动蛇并产生相关事件,吃食物和判断是否游戏失败:

void snakeMove(char control) {
    map[snakeHeadX][snakeHeadY] = BLANK_CHAR;
    // record the previous snake head position
    int prevSnakeHeadX = snakeHeadX;
    int prevSnakeHeadY = snakeHeadY;
    switch (control) {
    case 'w':
        snakeHeadX--;
        break;
    case 'a':
        snakeHeadY--;
        break;
    case 's':
        snakeHeadX++;
        break;
    case 'd':
        snakeHeadY++;
        break;
    default:
        return;
    }
    if (map[snakeHeadX][snakeHeadY] != BLANK_CHAR && map[snakeHeadX][snakeHeadY] != FOOD_CHAR) {
        // DIED
        gameOver();
    }
    map[snakeHeadX][snakeHeadY] = SNAKE_HEAD_CHAR;

    int moved = 0;
    // If willBeLonger, then make it longer
    if (willBeLonger) {
        willBeLonger = 0;
        moved = 1;
        // make space
        for (int i = snakeBodyLen - 1; i > snakeTailIndex; --i) {
            snakeBodyX[i + 1] = snakeBodyX[i];
            snakeBodyY[i + 1] = snakeBodyY[i];
        }
        snakeBodyX[snakeTailIndex + 1] = prevSnakeHeadX;
        snakeBodyY[snakeTailIndex + 1] = prevSnakeHeadY;
        if (snakeTailIndex < 0) snakeTailIndex = 0;
        map[prevSnakeHeadX][prevSnakeHeadY] = SNAKE_BODY_CHAR;
        snakeBodyLen++;
    }

    // Check if ate food
    if (snakeHeadX == foodX && snakeHeadY == foodY) {
        willBeLonger = 1;
        spawnFood();
    }

    // Head has already moved, **Move the body**
    // if "no body" here or added tail just now, then it needn't move
    if ( moved) return;
    map[snakeBodyX[snakeTailIndex]][snakeBodyY[snakeTailIndex]] = BLANK_CHAR;
    snakeBodyX[snakeTailIndex] = prevSnakeHeadX;
    snakeBodyY[snakeTailIndex] = prevSnakeHeadY;
    map[prevSnakeHeadX][prevSnakeHeadY] = SNAKE_BODY_CHAR;
    // Move tail index
    snakeTailIndex = (snakeTailIndex - 1 + snakeBodyLen) % snakeBodyLen;
}

游戏结束界面:

void gameOver() {
    printf("GAME OVER!!\n");
    gameRunning = 0;
}

主程序:游戏的启动和运行:

int main() {
    // Initialize random seed
    srand(time(NULL));

    initGame();

    char control = 0;
    while (gameRunning) {
        scanf(" %c", &control); // " %c": the space is used to skip blank character, like '\n'
        snakeMove(control);
        printMap();
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值