用c语言写一个贪吃蛇的游戏
时间: 2023-11-17 19:04:51 浏览: 38
好的,以下是一个简单的贪吃蛇游戏的 C 语言代码示例:
```
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
// 定义地图大小
#define MAPWIDTH 50
#define MAPHEIGHT 20
// 定义蛇的方向
#define UP 1
#define DOWN 2
#define LEFT 3
#define RIGHT 4
// 定义蛇的结构体
typedef struct Snake
{
int x;
int y;
struct Snake *next;
} Snake;
// 定义食物的结构体
typedef struct Food
{
int x;
int y;
} Food;
// 定义全局变量
int score = 0; // 蛇吃到的食物数量
int direction = RIGHT; // 蛇的初始方向
Snake *snake; // 蛇
Food food; // 食物
// 初始化游戏
void initGame()
{
// 初始化蛇
snake = (Snake *)malloc(sizeof(Snake));
snake->x = MAPWIDTH / 2;
snake->y = MAPHEIGHT / 2;
snake->next = NULL;
// 初始化食物
food.x = rand() % MAPWIDTH;
food.y = rand() % MAPHEIGHT;
}
// 绘制游戏界面
void draw()
{
// 清空屏幕
system("cls");
// 绘制地图
int i, j;
for (i = 0; i < MAPHEIGHT; i++)
{
for (j = 0; j < MAPWIDTH; j++)
{
if (i == 0 || i == MAPHEIGHT - 1 || j == 0 || j == MAPWIDTH - 1)
printf("#");
else if (i == food.y && j == food.x)
printf("*");
else
{
Snake *p = snake;
while (p != NULL)
{
if (p->x == j && p->y == i)
{
printf("O");
break;
}
p = p->next;
}
if (p == NULL)
printf(" ");
}
}
printf("\n");
}
// 绘制分数
printf("Score: %d\n", score);
}
// 更新蛇的位置
void updateSnake()
{
// 记录蛇头的位置
int x = snake->x;
int y = snake->y;
// 根据方向移动蛇头
switch (direction)
{
case UP:
y--;
break;
case DOWN:
y++;
break;
case LEFT:
x--;
break;
case RIGHT:
x++;
break;
}
// 判断是否吃到食物
if (x == food.x && y == food.y)
{
// 增加分数
score++;
// 创建新的蛇头
Snake *newHead = (Snake *)malloc(sizeof(Snake));
newHead->x = x;
newHead->y = y;
newHead->next = snake;
// 将新的蛇头插入链表头部
snake = newHead;
// 生成新的食物
food.x = rand() % MAPWIDTH;
food.y = rand() % MAPHEIGHT;
}
else
{
// 将蛇尾移动到蛇头的位置
Snake *p = snake;
while (p->next->next != NULL)
p = p->next;
free(p->next);
p->next = NULL;
// 创建新的蛇头
Snake *newHead = (Snake *)malloc(sizeof(Snake));
newHead->x = x;
newHead->y = y;
newHead->next = snake;
// 将新的蛇头插入链表头部
snake = newHead;
}
}
// 处理键盘输入
void handleInput()
{
if (_kbhit())
{
switch (_getch())
{
case 'w':
case 'W':
if (direction != DOWN)
direction = UP;
break;
case 's':
case 'S':
if (direction != UP)
direction = DOWN;
break;
case 'a':
case 'A':
if (direction != RIGHT)
direction = LEFT;
break;
case 'd':
case 'D':
if (direction != LEFT)
direction = RIGHT;
break;
}
}
}
// 判断游戏是否结束
int isGameOver()
{
// 判断蛇是否碰到墙壁
if (snake->x == 0 || snake->x == MAPWIDTH - 1 || snake->y == 0 || snake->y == MAPHEIGHT - 1)
return 1;
// 判断蛇是否碰到自己的身体
Snake *p = snake->next;
while (p != NULL)
{
if (p->x == snake->x && p->y == snake->y)
return 1;
p = p->next;
}
return 0;
}
int main()
{
// 初始化游戏
initGame();
// 循环游戏
while (1)
{
// 绘制游戏界面
draw();
// 更新蛇的位置
updateSnake();
// 处理键盘输入
handleInput();
// 判断游戏是否结束
if (isGameOver())
{
printf("Game Over! Score: %d\n", score);
break;
}
// 等待一段时间
Sleep(100);
}
return 0;
}
```
注意:这只是一个简单的示例代码,还有很多可以优化的地方。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)