贪吃蛇撞墙改变方向C语言代码
时间: 2023-07-09 13:28:22 浏览: 88
下面是一个简单的贪吃蛇撞墙改变方向的 C 语言代码示例:
```c
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 20
#define COL 30
int snake[ROW*COL][2], food[2];
int length = 1, score = 0;
char map[ROW][COL];
void draw_map();
void create_food();
void init_snake();
void move_snake(int dir);
int is_eat_food();
int is_hit_wall();
int is_hit_self();
int main()
{
int dir = 'd'; // 初始方向向右
srand((unsigned)time(NULL)); // 初始化随机数种子
draw_map(); // 绘制地图
create_food(); // 生成食物
init_snake(); // 初始化蛇
while (1)
{
if (_kbhit()) // 判断是否按下键盘
dir = _getch(); // 获取键盘输入
move_snake(dir); // 移动蛇
if (is_eat_food()) // 判断是否吃到食物
{
create_food(); // 生成新的食物
score += 10; // 增加分数
length++; // 增加蛇身长度
}
if (is_hit_wall() || is_hit_self()) // 判断是否撞墙或者撞到自己
break;
system("cls"); // 清屏
draw_map(); // 绘制地图
printf("Score: %d\n", score); // 显示分数
Sleep(200); // 延时200ms
}
printf("Game Over!\n");
printf("Your Score: %d\n", score);
system("pause");
return 0;
}
void draw_map()
{
int i, j;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
if (i == 0 || i == ROW - 1 || j == 0 || j == COL - 1) // 绘制墙
map[i][j] = '#';
else if (i == food[0] && j == food[1]) // 绘制食物
map[i][j] = '@';
else // 绘制空格
map[i][j] = ' ';
}
}
}
void create_food()
{
int i, j;
while (1)
{
i = rand() % (ROW - 2) + 1; // 生成随机行坐标
j = rand() % (COL - 2) + 1; // 生成随机列坐标
if (map[i][j] == ' ') // 判断是否为空格
{
food[0] = i;
food[1] = j;
break;
}
}
}
void init_snake()
{
snake[0][0] = ROW / 2; // 初始行坐标
snake[0][1] = COL / 2; // 初始列坐标
}
void move_snake(int dir)
{
int i;
for (i = length - 1; i > 0; i--) // 蛇身移动
{
snake[i][0] = snake[i - 1][0];
snake[i][1] = snake[i - 1][1];
}
switch (dir) // 处理方向
{
case 'w': // 向上
snake[0][0]--;
break;
case 's': // 向下
snake[0][0]++;
break;
case 'a': // 向左
snake[0][1]--;
break;
case 'd': // 向右
snake[0][1]++;
break;
}
}
int is_eat_food()
{
if (snake[0][0] == food[0] && snake[0][1] == food[1])
return 1;
else
return 0;
}
int is_hit_wall()
{
if (snake[0][0] == 0 || snake[0][0] == ROW - 1 || snake[0][1] == 0 || snake[0][1] == COL - 1)
return 1;
else
return 0;
}
int is_hit_self()
{
int i;
for (i = 1; i < length; i++)
{
if (snake[0][0] == snake[i][0] && snake[0][1] == snake[i][1])
return 1;
}
return 0;
}
```
该示例中,使用了 `_kbhit()` 和 `_getch()` 函数来获取键盘输入,使用了 `Sleep()` 函数来延时,使用了 `system("cls")` 函数来清屏。在运行该示例时,需要在编译器中配置控制台窗口大小为 30 行 50 列。
阅读全文