用C语言写一个简单的贪吃蛇游戏,配上代码注释
时间: 2023-06-09 16:08:42 浏览: 145
用C语言写的贪吃蛇游戏
当然,我会在不透露您任何要求的前提下,您的问题是用C语言写一个简单的贪吃蛇游戏,下面是代码注释:
```
#include <stdio.h>
#include <conio.h>
#include <windows.h>
// 定义地图的宽度和高度
#define MAP_WIDTH 20
#define MAP_HEIGHT 20
// 定义蛇头坐标
int snakeHeadX = MAP_WIDTH / 2;
int snakeHeadY = MAP_HEIGHT / 2;
// 定义蛇的初始长度
int snakeLength = 3;
// 定义蛇身体坐标
int snakeX[100] = { snakeHeadX, snakeHeadX - 1, snakeHeadX - 2 };
int snakeY[100] = { snakeHeadY, snakeHeadY, snakeHeadY };
// 定义食物坐标
int foodX = -1;
int foodY = -1;
// 定义方向
enum Direction
{
Direction_Up,
Direction_Down,
Direction_Left,
Direction_Right
};
Direction direction = Direction_Right;
// 定义线程间隔时间(ms)
unsigned int sleepTime = 300;
// 初始化地图
void InitMap()
{
system("cls");
for (int i = 0; i <= MAP_WIDTH + 1; i++)
{
putchar('#');
}
putchar('\n');
for (int i = 1; i <= MAP_HEIGHT; i++)
{
putchar('#');
for (int j = 1; j <= MAP_WIDTH; j++)
{
if (i == snakeHeadY && j == snakeHeadX)
{
putchar('@');
continue;
}
if (i == foodY && j == foodX)
{
putchar('*');
continue;
}
int isBody = 0;
for (int k = 1; k < snakeLength; k++)
{
if (i == snakeY[k] && j == snakeX[k])
{
putchar('@');
isBody = 1;
break;
}
}
if (!isBody)
{
putchar(' ');
}
}
putchar('#');
putchar('\n');
}
for (int i = 0; i <= MAP_WIDTH + 1; i++)
{
putchar('#');
}
printf("\nScore: %d\n", snakeLength - 3);
}
// 产生食物
void GenerateFood()
{
// 随机产生食物坐标
srand(GetTickCount());
foodX = rand() % MAP_WIDTH + 1;
foodY = rand() % MAP_HEIGHT + 1;
}
// 判断是否撞墙
bool IsHitWall()
{
if (snakeHeadX <= 0 || snakeHeadX >= MAP_WIDTH + 1 || snakeHeadY < 0 || snakeHeadY >= MAP_HEIGHT + 1)
{
return true;
}
return false;
}
// 判断是否撞到自己的身体
bool IsHitBody()
{
for (int i = 1; i < snakeLength; i++)
{
if (snakeHeadX == snakeX[i] && snakeHeadY == snakeY[i])
{
return true;
}
}
return false;
}
// 蛇移动
void Move()
{
// 保存蛇尾位置
int tailX = snakeX[snakeLength - 1];
int tailY = snakeY[snakeLength - 1];
// 身体和头移动
for (int i = snakeLength - 1; i >= 1; i--)
{
snakeX[i] = snakeX[i - 1];
snakeY[i] = snakeY[i - 1];
}
switch (direction)
{
case Direction_Up:
snakeHeadY--;
break;
case Direction_Down:
snakeHeadY++;
break;
case Direction_Left:
snakeHeadX--;
break;
case Direction_Right:
snakeHeadX++;
break;
}
// 判断是否吃到食物
if (snakeHeadX == foodX && snakeHeadY == foodY)
{
// 增加长度
snakeX[snakeLength] = tailX;
snakeY[snakeLength] = tailY;
snakeLength++;
GenerateFood();
}
// 重新绘制地图
InitMap();
// 判断是否游戏结束
if (IsHitWall() || IsHitBody())
{
printf("GameOver!\n");
getchar();
exit(0);
}
}
int main()
{
// 初始化地图
InitMap();
// 产生食物
GenerateFood();
// 游戏循环
while (true)
{
// 方向
if (_kbhit())
{
char c = _getch();
switch (c)
{
case 'W':
case 'w':
if (direction != Direction_Down)
{
direction = Direction_Up;
}
break;
case 'S':
case 's':
if (direction != Direction_Up)
{
direction = Direction_Down;
}
break;
case 'A':
case 'a':
if (direction != Direction_Right)
{
direction = Direction_Left;
}
break;
case 'D':
case 'd':
if (direction != Direction_Left)
{
direction = Direction_Right;
}
break;
default:
break;
}
}
// 蛇移动
Move();
// 线程间隔
Sleep(sleepTime);
}
return 0;
}
```
这个程序通过使用控制台窗口来提供游戏界面。
开始时,在中央屏幕上显示蛇头,定义蛇的初始长度,食物的位置是随机生成的,蛇的身体坐标初始化,方向按默认的右 :) 方向初始化。在游戏的循环中,使用GetTickCount()方法生成解除随机数种子。在每个游戏帧调用函数以更新蛇的位置、身体部分和食物的状态。 如果蛇撞到屏幕的边界或自己的身体部分,则游戏结束。 通过通过在while循环中调用Sleep()实现不同屏幕之间的时间差。 最后,我们处理用户命令并将它们转换为蛇的移动方向。
阅读全文