用c语言写一个小游戏,运用结构体,链表,二维数组,文件等知识
时间: 2023-08-12 18:06:53 浏览: 96
好的,我可以给你提供一个简单的游戏示例:猜数字游戏。
游戏规则如下:
1. 程序随机生成一个 1-100 之间的整数。
2. 玩家有 10 次机会猜测该数字,每次猜测后程序会告诉玩家猜的数字是大于还是小于答案。
3. 如果玩家在 10 次内猜中了答案,游戏结束并提示胜利;如果 10 次内没有猜中,游戏结束并提示失败。
接下来是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 定义链表结构体
struct record {
int round; // 猜数字的轮数
int guess; // 玩家猜的数字
char result[10]; // 猜测结果,"大于"或"小于"
struct record *next; // 指向下一个节点
};
// 定义全局变量
int answer; // 答案
int round; // 当前轮数
struct record *head = NULL; // 链表头指针
// 函数声明
void generateAnswer(); // 生成答案
void playGame(); // 玩猜数字游戏
void saveRecord(int guess, char *result); // 保存猜测记录到链表
void showHistory(); // 显示猜测记录
void saveToFile(); // 将猜测记录保存到文件
void loadFromFile(); // 从文件中加载猜测记录
int main() {
int choice;
srand(time(NULL)); // 初始化随机数种子
loadFromFile(); // 加载以前的猜测记录
do {
printf("=== 猜数字游戏 ===\n");
printf("1. 开始新游戏\n");
printf("2. 查看猜测记录\n");
printf("3. 退出游戏\n");
printf("请选择操作:");
scanf("%d", &choice);
switch (choice) {
case 1:
generateAnswer(); // 生成答案
playGame(); // 玩猜数字游戏
saveToFile(); // 将猜测记录保存到文件
break;
case 2:
showHistory(); // 显示猜测记录
break;
case 3:
printf("谢谢游玩!\n");
break;
default:
printf("无效操作!\n");
break;
}
} while (choice != 3);
return 0;
}
void generateAnswer() {
answer = rand() % 100 + 1;
round = 1;
}
void playGame() {
int guess;
printf("=== 第%d轮 ===\n", round);
printf("猜一个 1-100 之间的整数:");
scanf("%d", &guess);
while (guess != answer && round < 10) {
if (guess > answer) {
printf("猜大了!\n");
saveRecord(guess, "大于"); // 保存猜测记录到链表
} else {
printf("猜小了!\n");
saveRecord(guess, "小于"); // 保存猜测记录到链表
}
round++;
printf("=== 第%d轮 ===\n", round);
printf("猜一个 1-100 之间的整数:");
scanf("%d", &guess);
}
if (guess == answer) {
printf("恭喜你猜对了!\n");
} else {
printf("很遗憾,你没有猜中。正确答案是%d。\n", answer);
}
}
void saveRecord(int guess, char *result) {
// 创建新节点
struct record *newRecord = (struct record*)malloc(sizeof(struct record));
newRecord->round = round;
newRecord->guess = guess;
strcpy(newRecord->result, result);
newRecord->next = NULL;
if (head == NULL) { // 如果链表为空,添加为头节点
head = newRecord;
} else { // 否则添加到末尾
struct record *p = head;
while (p->next != NULL) {
p = p->next;
}
p->next = newRecord;
}
}
void showHistory() {
if (head == NULL) { // 链表为空,没有猜测记录
printf("没有猜测记录。\n");
} else {
printf("猜测记录:\n");
struct record *p = head;
while (p != NULL) { // 遍历链表,打印每个节点的信息
printf("第%d轮,猜%d,结果:%s\n", p->round, p->guess, p->result);
p = p->next;
}
}
}
void saveToFile() {
FILE *fp = fopen("guess_history.txt", "w"); // 以写入方式打开文件
if (fp == NULL) { // 文件打开失败
printf("无法保存猜测记录到文件!\n");
} else {
struct record *p = head;
while (p != NULL) { // 遍历链表,将每个节点的信息写入文件
fprintf(fp, "%d %d %s\n", p->round, p->guess, p->result);
p = p->next;
}
fclose(fp); // 关闭文件
printf("猜测记录已保存到文件!\n");
}
}
void loadFromFile() {
FILE *fp = fopen("guess_history.txt", "r"); // 以读取方式打开文件
if (fp == NULL) { // 文件不存在,无需加载
return;
}
char line[20];
while (fgets(line, sizeof(line), fp) != NULL) { // 从文件中读取每行数据
int round, guess;
char result[10];
sscanf(line, "%d %d %s", &round, &guess, result); // 解析数据到变量中
saveRecord(guess, result); // 将数据添加到链表中
}
fclose(fp); // 关闭文件
printf("猜测记录已从文件中加载!\n");
}
```
在这个示例中,我们使用了结构体来定义猜测记录,链表来保存猜测记录,二维数组和文件来实现猜测记录的读写。当然,这只是一个简单的示例,你可以根据自己的兴趣和需求来设计更加复杂的游戏和数据结构。
阅读全文