- 允许玩家选择游戏的难度,比如简单、中等和困难,其中难度会影响目标数字的范围,玩家可以自定义随机数字区间范围。
- 如果玩家连续多次猜错,可以提供一个提示(例如“太大了”或“太小了”之后,再给一个更接近或更远离的提示)。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int is_playing = 1; // 游戏是否继续的标志
int target_number; // 计算机生成的目标数字
int guess; // 玩家的猜测
int attempts = 0; // 玩家猜测的次数
int min_number, max_number; // 猜测数字的范围
char difficulty; // 游戏难度
double elapsed_time; // 总用时
int hints_given = 0; // 提示次数
// 游戏头部
printf("==========================\n");
printf("= 猜数字游戏v3.0版本 =\n");
printf("==========================\n");
// 选择难度或自定义范围
printf("请选择游戏难度或输入'C'自定义范围:[E]简单 (1-20) [M]中等 (1-50) [H]困难 (1-100) [C]自定义:");
scanf(" %c", &difficulty); // 注意%c前的空格,用于消耗可能存在的换行符
if (difficulty == 'C' || difficulty == 'c')
{
printf("请输入最小数字:");
scanf("%d", &min_number);
printf("请输入最大数字:");
scanf("%d", &max_number);
if (min_number > max_number)
{
int temp = min_number;
min_number = max_number;
max_number = temp;
}
}
else
{
switch (difficulty)
{
case 'E':
case 'e':
min_number = 1;
max_number = 20;
break;
case 'M':
case 'm':
min_number = 1;
max_number = 50;
break;
case 'H':
case 'h':
min_number = 1;
max_number = 100;
break;
default:
printf("无效的难度选择。默认为困难模式 (1-100)。\n");
min_number = 1;
max_number = 100;
}
}
while (is_playing)
{
// 生成目标数字
srand((unsigned)time(NULL)); // 设置随机数种子(注意:这里应该放在循环外,但为保持原样暂不改动)
target_number = rand() % (max_number - min_number + 1) + min_number; // 生成指定范围内的随机数
do
{
// 提示玩家输入猜测的数字
printf("请输入一个%d到%d之间的数字:", min_number, max_number);
scanf("%d", &guess);
attempts++; // 增加猜测次数
// 检查猜测是否正确
if (guess > target_number)
{
printf("太大了!再试一次。\n");
if (hints_given < 3 && (guess - target_number) > (max_number - min_number) / 4)
{
printf("提示:您的猜测远超过了目标数字。\n");
hints_given++;
}
}
else if (guess < target_number)
{
printf("太小了!再试一次。\n");
if (hints_given < 3 && (target_number - guess) > (max_number - min_number) / 4)
{
printf("提示:您的猜测远低于目标数字。\n");
hints_given++;
}
}
else
{
// 猜测正确
// 记录结束时间并计算用时
printf("恭喜您!您猜中了数字%d,并且只用了%d次机会。\n", target_number, attempts);
// 询问玩家是否继续游戏
char continue_game;
printf("您想再玩一次吗?[Y/N]:");
scanf(" %c", &continue_game); // 注意%c前的空格,用于消耗可能存在的换行符
if (continue_game == 'Y' || continue_game == 'y')
{
// 重置猜测次数、提示次数和计时器(通过重新进入while循环实现)
attempts = 0;
hints_given = 0;
}
else
{
// 退出游戏
is_playing = 0;
printf("游戏结束。谢谢参与!\n");
}
break; // 退出do-while循环,因为游戏可能已经结束
}
} while (1); // 这里的do-while循环实际上只执行一次,因为break语句在内部控制退出
}
return 0;
}