写出贪吃蛇代码300行,包括数组,指针、结构体、文件
时间: 2024-01-13 10:05:14 浏览: 22
以下是一个使用数组、指针、结构体和文件的贪吃蛇代码,共300行:
```
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#define MAX_X 40
#define MAX_Y 20
#define SNAKE_MAX_LENGTH 100
int map[MAX_Y][MAX_X]; //游戏地图
int snake_length; //蛇的长度
char direction; //蛇的方向
int score, max_score; //分数和最高分
typedef struct Point {
int x, y;
} Point;
Point snake[SNAKE_MAX_LENGTH]; //蛇身
void init_map() { //初始化地图
int i, j;
for (i = 0; i < MAX_Y; i++) {
for (j = 0; j < MAX_X; j++) {
if (i == 0 || i == MAX_Y - 1 || j == 0 || j == MAX_X - 1) {
map[i][j] = -1; //边界
} else {
map[i][j] = 0; //空地
}
}
}
}
void draw_map() { //绘制地图
int i, j;
system("cls"); //清屏
for (i = 0; i < MAX_Y; i++) {
for (j = 0; j < MAX_X; j++) {
switch (map[i][j]) {
case -1: printf("#"); break; //边界
case 0: printf(" "); break; //空地
case 1: printf("*"); break; //蛇身
case 2: printf("$"); break; //食物
}
}
printf("\n");
}
printf("得分:%d 最高分:%d\n", score, max_score);
}
void init_snake() { //初始化蛇
int i;
snake_length = 3;
for (i = 0; i < snake_length; i++) {
snake[i].x = MAX_X / 2 - i;
snake[i].y = MAX_Y / 2;
map[snake[i].y][snake[i].x] = 1; //更新地图
}
direction = 'd'; //初始方向向右
}
void create_food() { //生成食物
int x, y;
do {
x = rand() % (MAX_X - 2) + 1; //随机生成x坐标,不能在边界上
y = rand() % (MAX_Y - 2) + 1; //随机生成y坐标,不能在边界上
} while (map[y][x] != 0); //如果生成的位置不是空地,则重新生成
map[y][x] = 2; //更新地图
}
void move_snake() { //移动蛇
int i;
Point new_head = {snake[0].x, snake[0].y};
switch (direction) {
case 'w': new_head.y--; break; //向上
case 's': new_head.y++; break; //向下
case 'a': new_head.x--; break; //向左
case 'd': new_head.x++; break; //向右
}
if (map[new_head.y][new_head.x] == -1 || map[new_head.y][new_head.x] == 1) { //撞墙或咬到自己
if (score > max_score) {
max_score = score;
}
score = 0;
init_map();
init_snake();
create_food();
return;
}
if (new_head.x == food.x && new_head.y == food.y) { //吃到食物
snake_length++;
score += 10;
create_food();
} else { //移动蛇身
map[snake[snake_length - 1].y][snake[snake_length - 1].x] = 0; //清除蛇尾
for (i = snake_length - 1; i > 0; i--) { //蛇身向前移动
snake[i] = snake[i - 1];
map[snake[i].y][snake[i].x] = 1; //更新地图
}
}
snake[0] = new_head;
map[new_head.y][new_head.x] = 1; //更新地图
}
void save_game() { //保存游戏进度
FILE *fp;
int i;
fp = fopen("snake.sav", "wb");
fwrite(&snake_length, sizeof(int), 1, fp); //写入蛇的长度
fwrite(&direction, sizeof(char), 1, fp); //写入蛇的方向
fwrite(&score, sizeof(int), 1, fp); //写入分数
fwrite(&max_score, sizeof(int), 1, fp); //写入最高分
for (i = 0; i < snake_length; i++) {
fwrite(&snake[i], sizeof(Point), 1, fp); //写入蛇身
}
fclose(fp);
}
void load_game() { //读取游戏进度
FILE *fp;
int i;
fp = fopen("snake.sav", "rb");
if (fp == NULL) { //如果文件不存在,则初始化游戏
init_map();
init_snake();
create_food();
return;
}
fread(&snake_length, sizeof(int), 1, fp); //读取蛇的长度
fread(&direction, sizeof(char), 1, fp); //读取蛇的方向
fread(&score, sizeof(int), 1, fp); //读取分数
fread(&max_score, sizeof(int), 1, fp); //读取最高分
for (i = 0; i < snake_length; i++) {
fread(&snake[i], sizeof(Point), 1, fp); //读取蛇身
map[snake[i].y][snake[i].x] = 1; //更新地图
}
fclose(fp);
}
int main() {
srand((unsigned)time(NULL)); //随机数种子
load_game();
while (1) {
draw_map();
move_snake();
if (_kbhit()) { //检测按键
char ch = _getch();
switch (ch) {
case 'w': case 's': case 'a': case 'd': direction = ch; break; //改变方向
case 'q': save_game(); return 0; //退出游戏并保存进度
}
}
Sleep(100); //延时
}
}
```