C语言 按蛇身长度 PC
时间: 2023-10-16 17:10:41 浏览: 38
好的,让我们开始编写代码。首先,我们需要定义蛇的结构体和食物的结构体,代码如下:
```
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#define WIDTH 30
#define HEIGHT 20
#define SNAKE_INIT_LENGTH 3
typedef struct {
int x;
int y;
} Point;
typedef struct {
Point position;
} Food;
typedef struct {
Point position;
int length;
int score;
} Snake;
```
在这个代码中,我们定义了三个结构体,分别是Point,Food和Snake。Point是一个包含x和y坐标的结构体,用于表示蛇和食物的位置。Food结构体表示食物,包含一个Point类型的position属性。Snake结构体表示蛇,包含一个Point类型的position属性、一个整型的length属性和一个整型的score属性,分别表示蛇头的位置、蛇身的长度和分数。
接下来,我们需要定义一些函数来实现贪吃蛇的逻辑。首先,我们需要编写一个函数来初始化蛇的位置、长度和分数,代码如下:
```
void initSnake(Snake *snake) {
snake->position.x = WIDTH / 2;
snake->position.y = HEIGHT / 2;
snake->length = SNAKE_INIT_LENGTH;
snake->score = 0;
}
```
在这个函数中,我们将蛇的位置初始化为屏幕中心,长度初始化为SNAKE_INIT_LENGTH,即3,分数初始化为0。
接下来,我们需要编写一个函数来生成食物的位置,代码如下:
```
void generateFood(Food *food, Snake snake) {
int x, y;
do {
x = rand() % WIDTH;
y = rand() % HEIGHT;
} while (snake.position.x == x && snake.position.y == y);
food->position.x = x;
food->position.y = y;
}
```
在这个函数中,我们使用rand函数来生成一个随机的x和y坐标,如果这个坐标和蛇的位置重复了,就重新生成,直到找到一个不重复的坐标为止。
接下来,我们需要编写一个函数来显示游戏界面,代码如下:
```
void display(Snake snake, Food food) {
system("cls");
for (int i = 0; i < WIDTH + 2; i++) {
printf("#");
}
printf("\n");
for (int i = 0; i < HEIGHT; i++) {
printf("#");
for (int j = 0; j < WIDTH; j++) {
if (i == snake.position.y && j == snake.position.x) {
printf("O");
} else if (i == food.position.y && j == food.position.x) {
printf("*");
} else {
printf(" ");
}
}
printf("#\n");
}
for (int i = 0; i < WIDTH + 2; i++) {
printf("#");
}
printf("\n");
printf("Score: %d\n", snake.score);
}
```
在这个函数中,我们使用system函数来清屏,然后循环输出游戏界面,包括蛇、食物和边界。最后,我们输出当前的分数。
接下来,我们需要编写一个函数来让蛇移动,代码如下:
```
void move(Snake *snake, Food food, int *gameOver) {
if (_kbhit()) {
switch (_getch()) {
case 'w':
snake->position.y--;
break;
case 'a':
snake->position.x--;
break;
case 's':
snake->position.y++;
break;
case 'd':
snake->position.x++;
break;
}
}
if (snake->position.x < 0 || snake->position.x >= WIDTH ||
snake->position.y < 0 || snake->position.y >= HEIGHT) {
*gameOver = 1;
return;
}
if (snake->position.x == food.position.x && snake->position.y == food.position.y) {
snake->length++;
snake->score += snake->length;
generateFood(&food, *snake);
}
Point tail = snake->position;
for (int i = 0; i < snake->length - 1; i++) {
snake->position = snake->body[i];
snake->body[i] = tail;
if (snake->position.x == tail.x && snake->position.y == tail.y) {
*gameOver = 1;
return;
}
}
}
```
在这个函数中,我们首先判断用户是否按下了方向键,如果按下了,就根据方向键来改变蛇头的位置。然后,我们判断蛇是否撞墙了,如果撞墙了,游戏结束。接下来,我们判断蛇是否吃到了食物,如果吃到了,就让蛇的长度加1,分数也相应地加上蛇的长度,然后重新生成食物的位置。最后,我们让蛇的身体跟着蛇头走,如果蛇头撞到了蛇身,游戏也结束。
最后,我们需要编写一个主函数来启动游戏,代码如下:
```
int main() {
srand(time(NULL));
Snake snake;
initSnake(&snake);
Food food;
generateFood(&food, snake);
int gameOver = 0;
while (!gameOver) {
display(snake, food);
move(&snake, food, &gameOver);
Sleep(100);
}
printf("Game over! Your score is %d.\n", snake.score);
return 0;
}
```
在主函数中,我们首先使用srand函数来生成随机数种子,然后初始化蛇和食物的位置,设置游戏是否结束的标志为0。然后,我们进入一个循环,在每次循环中调用display函数显示游戏界面,再调用move函数让蛇移动。最后,我们输出游戏结束时的分数,并结束程序。
希望这个代码可以满足你的要求。
相关推荐
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.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)
![](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)
![](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)
![](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)
![](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)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)