#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void game() {
int guess = 0;
int num = rand() % 100 + 1;
int max = 100;
int min = 1;
int i = 0;
while (1) {
printf("猜数字:");
if (scanf("%d", &guess) != 1) {
// 清除输入缓冲区并提示用户重新输入
while (getchar() != '\n');
printf("输入无效,请重新输入一个整数。\n");
continue;
}
if (guess > num) {
max = guess - 1;
printf("猜大了,范围在%d~%d之间\n", min, max);
i++;
} else if (guess < num) {
min = guess + 1;
printf("猜小了,范围在%d~%d之间\n", min, max);
i++;
} else {
printf("猜对了,结果为%d,用了%d次\n", num, i);
break;
}
}
}
void menu() {
printf("========================\n");
printf("=======猜数字游戏=======\n");
printf("==【1.开始】【2.退出】==\n");
printf("========================\n");
}
int main() {
int input = 0;
srand((unsigned int)time(NULL)); // 确保在 main 函数的开始处设置随机数种子
do {
menu();
printf("请输入=>");
scanf("%d", &input);
switch (input) {
case 1:
printf("欢迎进入游戏\n");
game();
break;
case 2:
printf("你已经退出游戏\n");
break;
default:
printf("输入的参数有误\n");
break;
}
} while (input != 2); // 简化退出条件
return 0;
}
上面的代码实现了一个简单的猜数字游戏,包含了菜单选项、随机数生成、用户输入处理以及游戏逻辑。以下是关于这段代码的注意事项和要点:
注意事项
- 输入验证:
- 代码使用了
scanf
来读取用户输入,并通过返回值来验证是否成功读取了一个整数。这是一个好的做法,因为这样可以防止程序在非整数输入时崩溃。 - 但是,当用户输入了非法的字符序列(如字母、符号等)时,
scanf
会留下这些字符在输入缓冲区中,可能导致后续的scanf
调用也失败。为了解决这个问题,代码使用了一个while
循环来消耗掉输入缓冲区中的剩余字符,直到遇到换行符或文件结束符。
- 代码使用了
- 随机数种子:
srand((unsigned int)time(NULL));
用于设置随机数生成器的种子,以确保每次程序运行时都能生成不同的随机数。这是必要的,因为如果没有设置种子,或者总是使用相同的种子,那么程序将生成相同的随机数序列。
- 退出条件:
- 在
main
函数中,do-while
循环用于处理菜单选项。当用户选择退出(输入2)时,input
不再等于2,因此循环终止。这是一个简洁的退出条件。
- 在
- 变量命名:
- 变量命名应该清晰、有意义,以便于阅读和理解代码。例如,
gess
应该更正为guess
以避免混淆。
- 变量命名应该清晰、有意义,以便于阅读和理解代码。例如,
- 错误处理:
- 当用户输入无效时,程序会提示用户重新输入。但是,如果用户在多次尝试后仍然输入无效,程序可能会陷入无限循环。为了增加用户体验,可以设置一个尝试次数的限制,并在达到限制后退出游戏。
- 内存管理:
- 在这个简单的程序中,没有动态内存分配,因此不需要担心内存泄漏或越界访问等问题。但是,在更复杂的程序中,内存管理是一个重要的考虑因素。
要点
- 模块化:
- 程序被划分为多个函数(
game
,menu
,main
),每个函数负责执行特定的任务。这种模块化设计使得代码更易于阅读、理解和维护。
- 程序被划分为多个函数(
- 用户交互:
- 程序通过菜单和提示与用户进行交互,使得用户能够轻松地开始和退出游戏。良好的用户交互设计可以提高用户体验。
- 清晰的控制流:
- 程序的控制流清晰明了,从
main
函数开始,根据用户输入执行不同的操作。这种结构使得程序易于理解和调试。
- 程序的控制流清晰明了,从
- 可重用性:
game
和menu
函数可以在其他程序或项目中重用,只要它们满足相同的接口要求。这增加了代码的可重用性和灵活性。
- 代码风格:
- 代码使用了清晰的缩进和注释,使得代码易于阅读和理解。良好的代码风格可以提高代码的可读性和可维护性。