用C语言写一个贪吃蛇游戏
时间: 2023-06-01 12:05:32 浏览: 42
很高兴能帮助你。贪吃蛇游戏使用C语言编写非常容易,因为C语言具有可读性,可扩展性,可移植性和可维护性,使它成为最适合编写游戏的编程语言之一。你可以使用C语言的绘图函数来绘制游戏的界面,并使用用户输入函数来控制蛇的移动。
相关问题
使用C语言写一个贪吃蛇游戏
好的,这里是一个简单的贪吃蛇游戏的代码,使用C语言编写。代码中使用了Windows API的一些函数,因此只能在Windows系统下运行。
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
#define WIDTH 50 // 游戏画面宽度
#define HEIGHT 20 // 游戏画面高度
#define MAXLEN WIDTH*HEIGHT // 蛇的最大长度
int snake[MAXLEN][2]; // 蛇的位置数组
int food[2]; // 食物的位置
int len = 3; // 蛇的长度
int dir = 1; // 蛇头的方向,0-上,1-右,2-下,3-左
int score = 0; // 得分
void setPos(int x, int y) // 设置光标位置函数
{
COORD pos = { x, y };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
void init() // 初始化函数
{
srand(time(NULL)); // 初始化随机数生成器
// 初始化蛇的位置
for (int i = 0; i < len; i++)
{
snake[i][0] = WIDTH / 2 - i;
snake[i][1] = HEIGHT / 2;
}
// 随机生成食物的位置
food[0] = rand() % (WIDTH - 2) + 1;
food[1] = rand() % (HEIGHT - 2) + 1;
}
void draw() // 绘制游戏画面函数
{
setPos(0, 0);
printf("Score: %d\n", score);
// 绘制游戏边框
for (int i = 0; i < WIDTH; i++)
{
printf("#");
}
printf("\n");
for (int i = 1; i < HEIGHT - 1; i++)
{
printf("#");
for (int j = 1; j < WIDTH - 1; j++)
{
// 绘制蛇的身体
int flag = 0;
for (int k = 0; k < len; k++)
{
if (snake[k][0] == j && snake[k][1] == i)
{
printf("O");
flag = 1;
break;
}
}
if (!flag)
{
// 绘制食物
if (j == food[0] && i == food[1])
{
printf("@");
}
else
{
printf(" ");
}
}
}
printf("#\n");
}
for (int i = 0; i < WIDTH; i++)
{
printf("#");
}
}
void update() // 更新游戏状态函数
{
// 移动蛇的身体
for (int i = len - 1; i > 0; i--)
{
snake[i][0] = snake[i - 1][0];
snake[i][1] = snake[i - 1][1];
}
// 移动蛇头
switch (dir)
{
case 0:
snake[0][1]--;
break;
case 1:
snake[0][0]++;
break;
case 2:
snake[0][1]++;
break;
case 3:
snake[0][0]--;
break;
}
// 判断是否吃到食物
if (snake[0][0] == food[0] && snake[0][1] == food[1])
{
// 增加蛇的长度
len++;
score++;
// 随机生成新的食物
food[0] = rand() % (WIDTH - 2) + 1;
food[1] = rand() % (HEIGHT - 2) + 1;
}
// 判断是否撞到墙壁或自身
if (snake[0][0] == 0 || snake[0][0] == WIDTH - 1 ||
snake[0][1] == 0 || snake[0][1] == HEIGHT - 1)
{
exit(0); // 直接退出程序
}
for (int i = 1; i < len; i++)
{
if (snake[0][0] == snake[i][0] && snake[0][1] == snake[i][1])
{
exit(0); // 直接退出程序
}
}
}
void input() // 处理用户输入函数
{
if (_kbhit()) // 判断是否有按键按下
{
switch (_getch())
{
case 'w':
if (dir != 2) // 防止掉头
{
dir = 0;
}
break;
case 'd':
if (dir != 3)
{
dir = 1;
}
break;
case 's':
if (dir != 0)
{
dir = 2;
}
break;
case 'a':
if (dir != 1)
{
dir = 3;
}
break;
}
}
}
int main()
{
init(); // 初始化游戏状态
while (1) // 主循环
{
draw(); // 绘制游戏画面
update(); // 更新游戏状态
input(); // 处理用户输入
Sleep(100); // 等待一段时间
}
return 0;
}
```
这段代码实现了一个简单的贪吃蛇游戏,运行后可以通过键盘上下左右控制蛇头的移动方向,吃到食物会增加蛇的长度和得分,撞到墙壁或自身会结束游戏。
用c语言写一个贪吃蛇游戏
这里提供一个简单的贪吃蛇游戏的C语言代码,你可以根据自己的需求进行修改和完善。
```
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#define WIDTH 40 // 游戏区域宽度
#define HEIGHT 20 // 游戏区域高度
// 定义方向
enum DIRECTION {
UP, DOWN, LEFT, RIGHT
};
struct Position {
int x;
int y;
};
struct Snake {
int length; // 蛇的长度
struct Position *body; // 蛇的身体坐标
enum DIRECTION direction; // 蛇的前进方向
};
struct Food {
int x;
int y;
};
// 初始化蛇的位置和方向
void initSnake(struct Snake *snake) {
snake->length = 3;
snake->direction = RIGHT;
snake->body = (struct Position *)malloc(snake->length * sizeof(struct Position));
snake->body[0].x = 3;
snake->body[0].y = 1;
snake->body[1].x = 2;
snake->body[1].y = 1;
snake->body[2].x = 1;
snake->body[2].y = 1;
}
// 初始化食物的位置
void initFood(struct Food *food) {
srand((unsigned)time(NULL));
food->x = rand() % (WIDTH - 2) + 1;
food->y = rand() % (HEIGHT - 2) + 1;
}
// 绘制游戏界面
void drawGame(struct Snake *snake, struct Food *food) {
system("cls");
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 < snake->length; k++) {
if (snake->body[k].x == j && snake->body[k].y == i) {
printf("*");
flag = 1;
break;
}
}
if (!flag) {
printf(" ");
}
}
}
printf("\n");
}
printf("Length: %d\n", snake->length);
}
// 控制蛇的方向
void control(struct Snake *snake) {
char ch = getch();
if (ch == 'w' || ch == 'W') {
if (snake->direction != DOWN) {
snake->direction = UP;
}
} else if (ch == 's' || ch == 'S') {
if (snake->direction != UP) {
snake->direction = DOWN;
}
} else if (ch == 'a' || ch == 'A') {
if (snake->direction != RIGHT) {
snake->direction = LEFT;
}
} else if (ch == 'd' || ch == 'D') {
if (snake->direction != LEFT) {
snake->direction = RIGHT;
}
}
}
// 移动蛇
void move(struct Snake *snake, struct Food *food) {
// 蛇头移动
int x = snake->body[0].x;
int y = snake->body[0].y;
switch (snake->direction) {
case UP:
y--;
break;
case DOWN:
y++;
break;
case LEFT:
x--;
break;
case RIGHT:
x++;
break;
}
// 判断是否吃到食物
if (x == food->x && y == food->y) {
snake->length++; // 蛇长度加1
snake->body = (struct Position *)realloc(snake->body, snake->length * sizeof(struct Position));
for (int i = snake->length - 1; i > 0; i--) {
snake->body[i] = snake->body[i - 1];
}
snake->body[0].x = x;
snake->body[0].y = y;
initFood(food); // 重新生成食物
} else {
// 蛇尾移动
for (int i = snake->length - 1; i > 0; i--) {
snake->body[i] = snake->body[i - 1];
}
snake->body[0].x = x;
snake->body[0].y = y;
}
}
// 判断游戏是否结束
int isGameOver(struct Snake *snake) {
// 判断是否撞墙
if (snake->body[0].x == 0 || snake->body[0].x == WIDTH - 1 || snake->body[0].y == 0 || snake->body[0].y == HEIGHT - 1) {
return 1;
}
// 判断是否咬到自己
for (int i = 1; i < snake->length; i++) {
if (snake->body[0].x == snake->body[i].x && snake->body[0].y == snake->body[i].y) {
return 1;
}
}
return 0;
}
int main() {
struct Snake snake;
struct Food food;
initSnake(&snake);
initFood(&food);
while (1) {
drawGame(&snake, &food);
control(&snake);
move(&snake, &food);
if (isGameOver(&snake)) {
printf("Game Over!\n");
break;
}
Sleep(200); // 控制游戏速度
}
free(snake.body);
return 0;
}
```
阅读全文