贪吃蛇游戏设计及算法

话不多说,上代码

先是头文件 然后就按照我们自顶向下逐步求精的理念来写

char BLANK_CHAR = ’ ‘;
char WALL_CHAR = ‘*’;
char SNAKE_HEAD_CHAR = ‘H’; 蛇头
char SNAKE_BODY_CHAR = ‘X’; 蛇身
char FOOD_CHAR = ‘$’; 食物

char map[10][10] = {
***“,
“* *”,
“* *”,
“* *”,
“* *”,
“* *”,
“* *”,
“* *”,
“* *”,
***“,
};

int snakeHeadX = 1, snakeHeadY = 1;
int snakeBodyX[100] = { 0 }, snakeBodyY[100] = { 0 };
int snakeBodyLen = 0;
int snakeTailIndex = -1;
int willBeLonger = 0;

int foodX = 0, foodY = 0;

int gameRunning = 1;
定义坐标
void printMap() {
system(“cls”);
for (int i = 0; i < 10; ++i) {
printf(“%s\n”, map[i]);
}
}
随机放食物
void spawnFood() {
// Random food position
foodX = rand() % 8 + 1;
foodY = rand() % 8 + 1;
while (map[foodX][foodY] != BLANK_CHAR) {
foodX = rand() % 8 + 1;
foodY = rand() % 8 + 1;
}
map[foodX][foodY] = FOOD_CHAR;
}
游戏主体
void initGame() {
// Initialize snake
snakeHeadX = snakeHeadY = 1;
map[snakeHeadX][snakeHeadY] = SNAKE_HEAD_CHAR;
snakeBodyLen = 0;
gameRunning = 1;
snakeTailIndex = -1;
willBeLonger = 0;
// Initialize food
spawnFood();
// Initialize game
gameRunning = 1;

printMap();

}
游戏结束条件
void gameOver() {
printf(“GAME OVER!!\n”);
gameRunning = 0;
}
蛇的移动
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 (snakeBodyLen <= 0 || 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;

}

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

initGame();

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

return 0;

}
总之,只要按照贪吃蛇游戏的规则,一点点根据我们学习过的知识由上而下地就可以完成这次的代码,需要注意的是因为涉及到的变量名比较多,所以之前设置成“a,b , c”的时候就比较混乱,在写比较复杂的代码的时候还是应该用有意义的名字,比如”FOOD“能是代码更加清晰直观。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值