如何在贪吃蛇里用c语言写穿墙模式代码
时间: 2023-06-17 11:04:46 浏览: 292
实现穿墙模式需要对贪吃蛇的碰撞检测部分进行修改。以下是一个简单的穿墙模式实现示例:
1. 在贪吃蛇的移动函数中,添加判断蛇头是否碰到了边界。
2. 如果蛇头碰到了边界,根据蛇头的位置判断出对应的穿墙位置,并将其作为蛇头下一步要移动到的位置。
3. 如果蛇头没有碰到边界,按照原来的逻辑继续移动。
以下是示例代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#define WIDTH 40
#define HEIGHT 20
#define MAX_LENGTH 100
int x, y, food_x, food_y, score, length;
int snake_x[MAX_LENGTH], snake_y[MAX_LENGTH];
int direction;
int wall_mode; // 穿墙模式开关
void init(); // 初始化函数
void draw_map(); // 绘制地图函数
void draw_snake(); // 绘制蛇函数
void generate_food(); // 生成食物函数
void move_snake(); // 移动蛇函数
void check_collision(); // 碰撞检测函数
void game_over(); // 游戏结束函数
int main() {
init();
while (1) {
if (_kbhit()) { // 检测是否有按键按下
switch (_getch()) {
case 'w': // 上
if (direction != 2) // 防止蛇倒退
direction = 0;
break;
case 'd': // 右
if (direction != 3)
direction = 1;
break;
case 's': // 下
if (direction != 0)
direction = 2;
break;
case 'a': // 左
if (direction != 1)
direction = 3;
break;
case 'q': // 切换穿墙模式
wall_mode = !wall_mode;
break;
}
}
move_snake();
check_collision();
if (score == WIDTH * HEIGHT) { // 游戏胜利
system("cls");
printf("Congratulations! You win!\n");
system("pause");
break;
}
Sleep(50); // 控制帧率
}
return 0;
}
void init() {
srand(time(NULL)); // 初始化随机种子
x = WIDTH / 2;
y = HEIGHT / 2;
food_x = rand() % WIDTH;
food_y = rand() % HEIGHT;
score = 0;
length = 1;
snake_x[0] = x;
snake_y[0] = y;
direction = 0; // 初始方向为上
wall_mode = 0; // 初始为非穿墙模式
}
void draw_map() {
system("cls");
printf("Score: %d\n", score);
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 if (i == food_y && j == food_x) {
printf("$"); // 绘制食物
} else {
int flag = 0;
for (int k = 0; k < length; k++) {
if (i == snake_y[k] && j == snake_x[k]) {
printf("*"); // 绘制蛇
flag = 1;
break;
}
}
if (!flag) {
printf(" "); // 绘制空格
}
}
}
printf("\n");
}
}
void draw_snake() {
for (int i = 0; i < length; i++) {
printf("(%d, %d) ", snake_x[i], snake_y[i]);
}
printf("\n");
}
void generate_food() {
food_x = rand() % WIDTH;
food_y = rand() % HEIGHT;
}
void move_snake() {
for (int i = length - 1; i > 0; i--) {
snake_x[i] = snake_x[i - 1];
snake_y[i] = snake_y[i - 1];
}
switch (direction) {
case 0: // 上
y--;
break;
case 1: // 右
x++;
break;
case 2: // 下
y++;
break;
case 3: // 左
x--;
break;
}
if (wall_mode) { // 穿墙模式
if (x < 0) x = WIDTH - 1;
if (x >= WIDTH) x = 0;
if (y < 0) y = HEIGHT - 1;
if (y >= HEIGHT) y = 0;
} else { // 非穿墙模式
if (x < 1) x = 1;
if (x >= WIDTH - 1) x = WIDTH - 2;
if (y < 1) y = 1;
if (y >= HEIGHT - 1) y = HEIGHT - 2;
}
snake_x[0] = x;
snake_y[0] = y;
draw_map();
}
void check_collision() {
if (x == food_x && y == food_y) { // 吃到食物
score++;
length++;
generate_food();
}
for (int i = 1; i < length; i++) { // 撞到自己
if (x == snake_x[i] && y == snake_y[i]) {
game_over();
return;
}
}
if (!wall_mode) { // 撞到边界
if (x == 0 || x == WIDTH - 1 || y == 0 || y == HEIGHT - 1) {
game_over();
return;
}
}
}
void game_over() {
system("cls");
printf("Game over! Your score is: %d\n", score);
system("pause");
init();
}
```
在上述代码中,我们新增了一个 `wall_mode` 变量来控制穿墙模式的开关,初始为非穿墙模式。在移动蛇时,如果开启了穿墙模式,则判断蛇头是否碰到了边界,如果碰到了,则根据蛇头位置判断出对应的穿墙位置,并将其作为蛇头下一步要移动到的位置。如果没有开启穿墙模式,则按照原来的逻辑继续移动。
阅读全文