目录
猜数字游戏
一、猜数字判定
二、重复猜数字,直到猜中停止
三、随机生成一个目标数字
四、保存输入记录
首先,我们需要做一个测试版本,我们事先设置好一个目标数字,然后由玩家输入数字与目标数字进行比较,并且显示比较后的结果。
代码1:
#include
int main()
{
int n = 0; \\玩家输入的数字
int ans = 7; \\这是事先设置好的目标数字
printf("请输入1个0 - 9 间的一个数字:");
scanf("%d", &n);
if (n > ans)
{
printf("\a猜大了!\n");
}
else if (n < ans)
{
printf("\a猜小了!\n");
}
else
{
printf("恭喜你,猜对了!\n");
}
return 0;
}
在现在的测试版本中,我们设置的目标数字为 7 ,而由玩家输入的值则用变量 n 来表示。
if (n > ans) { printf("\a猜大了!\n"); } else if (n < ans) { printf("\a猜小了!\n"); } else { printf("恭喜你,猜对了!\n"); }
而这一段代码就是用来判断 n 和 ans 两个变量之间大小关系,并且输出相应的结果。
输出的字符串中包含了两种转义字符:
\n : 换行
\a : 表示警报,输出的时候会响起蜂鸣音。
如果玩家只能进行一次猜数字,那么想要才猜对数字可能就需要重新运行多次程序,就过于繁琐了,所以我们可以给我们的程序加上循环。
代码2:
#include
int main()
{
int n = 0; //玩家输入的数字
int ans = 7; //这是事先设置好的目标数字
printf("请输入1个0 - 9 间的一个数字:");
scanf("%d", &n);
do {
if (n > ans)
{
printf("\a猜大了!\n");
}
else if (n < ans)
{
printf("\a猜小了!\n");
}
} while (n != ans);
printf("恭喜你,猜对了!\n");
return 0;
}
在代码2中,我们删除了代码1中,if语句的后半截,并在此基础上增加了 do语句。
do语句是先循环,后判断的语句。
do 和 while 围起来的语句叫做循环体。只要()中的表达式不为0,循环体就会一直重复运行下去,直到表达式的结果为0,才会停止工作。
运算符 != 是对左右两边操作数值是否不相等这一条件进行判断。如果条件成立,表达式的值为1,程序继续运行;若条件不成立,则为0,跳出循环。
在这段代码中,当n和ans是同一个数时,表达式的值结果就是0,循环结束,将在屏幕上打印“恭喜你,猜对了!”。
补充 :
(1)判断两个操作数是否相等的操作符有::"==" 、 “!=”。
(2)判断两个操作数的大小关系的操作符有:">"、"<"、"<="、“>=”。
代码3:
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
int main()
{
int n = 0; //玩家输入的数字
srand(time(NULL)); //设计随机数的种子
int ans = rand()%1000; //随机生成一个0~999之间的一个数字
printf("请输入1个0 - 999 间的一个数字:");
do {
printf("请输入:");
scanf("%d", &n);
if (n > ans)
{
printf("\a猜大了!\n");
}
else if (n < ans)
{
printf("\a猜小了!\n");
}
} while (n != ans); //重复到猜对为止
printf("恭喜你,猜对了!\n");
return 0;
}
仅仅是把目标数字从我们自己预设的,变成随机生成的,这个游戏的趣味性就增加了。大家可以将代码多运行几次感受一下。
补充:
(1)生成随机数之前需要设定一个“种子”。
#include
#include /*·····*/ srand(time(NULL)); /*设定随机数的种子*/ 在调用rand()函数之前需要先调用srand函数(至少调用一次,调用次数不限制)。如果没有上述代码,那么生成的数字是相同且有规律的。
(2)生成随机数
一旦调用 rand 函数,就会得到一个大于等于0且小于等于 RAND_MAX 的随机数。RAND_MAX的值取决于编程环境,即大于等于32767。
如果想要设置随机数的范围,可以这样操作:
rand() % (a+1); //这是大于等于 0 且 小于等于 a 的随机数 b + rand() % (a+1) //这是大于等于 b 且 小于等于 b+a 的随机数
为了增加游戏的紧迫感,可以限制猜数字的次数
代码4:
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
int main()
{
int n = 0; //玩家输入的数字
const int max_stage = 10; //最多可以猜测的次数
int remain = max_stage; //还可以猜测几次
srand(time(NULL)); //设计随机数的种子
int ans = rand()%1000; //随机生成一个0~999之间的一个数字
printf("请输入1个0 - 999 间的一个数字:");
do {
printf("还剩%d次机会,请继续输入:",remain);
scanf("%d", &n);
remain--; // 减少可输入次数
if (n > ans)
{
printf("\a猜大了!\n");
}
else if (n < ans)
{
printf("\a猜小了!\n");
}
} while (n != ans && remain > 0); //重复到猜对为止
if (n != ans)
printf("\a很遗憾,正确答案是:%d\n", ans);
else {
printf("恭喜你,猜对了!\n");
printf("你用了%d次猜中了\n", max_stage - remain);
}
return 0;
}
变量 max_stage 表示玩家最多可输入的次数,这上述代码中是10。
变量remain 表示还可以输入的次数,当这个值为0的时候游戏就结束了,因为在 do 语句的判断中不仅有 n!=ans ,还有remain > 0这个条件。
&&操作符的两边都不为0时,表达式的值为1,反之,则为0。
所以,上述代码中,如果玩家输入10次数字均为猜中,即remain的值为0,则游戏结束。
最后用 max_stage - remain 就可以知道玩家是第几次猜中的数字。
我们希望程序可以记录下玩家输入过的数字,并且在游戏结束的时候知道自己猜的数字和目标数字的差距有多大。
代码5:
#include
#include
#include
#define MAX_STAGE 10 //最多可输入的次数
int main()
{
int stage = 0; //已经输入的次数
int n = 0; //输入的数字
int ans = 0; //目标数字
int num[MAX_STAGE] = { 0 }; //输入过的数字,历史记录
srand(time(NULL)); //设置随机数的种子
ans = rand() % 1000; //生成0~999的随机数
printf("请输入一个0~999之间的一个数字: \n");
do {
printf("还剩下%d次机会。请输入: ", MAX_STAGE - stage);
scanf("%d", &n);
num[stage++] = n; //将输入过的数字,存到数组中去
if (n > ans)
printf("猜大了!\n");
else if (n < ans)
printf("猜小了!\n");
} while (n != ans && stage < MAX_STAGE);
if (n != ans)
printf("\a很遗憾!,正确答案是:%d\n", ans);
else
{
printf("恭喜你猜对了!\n");
printf("你一共猜了%d次。\n", stage);
}
puts("--- 输入记录 ---\n");
int i = 0;
for (i = 0; i < stage; i++)
{
printf("%2d : %4d %+4d\n", i + 1, num[i], num[i] - ans);
}
return 0;
}
在代码5中,没有采用变量 max_stage ,而是定义了一个宏 MAX_STAGE。
并创建了数组 num 用于储存玩家输入过的数字。
因为在编译的时候,这个 int num[MAX_STAGE],会被替换成 int num[10],所以程序不会报错。
在代码5中,新引入变量 stage 。这个变量用于代替代码4中表示剩余输入次数的变量remain。
游戏开始时,stage的初始值为0,之后玩家每输入一次,stage的值都会逐次增加,当值等于MAX_STAGE时,也就是等于10的时候,游戏结束。
在数组的声明中,[]里的值是元素个数,也可以用于访问各个元素。
首个元素的下标为0,之后的下标逐一递增,因此可以用 num[0],num[1],...,num[9],依次访问数组的元素。由于最后一个元素的下标等于元素个数-1,所以不存在num[10]这个元素。
这里共有3个操作符,分别是
[ ] ——声明int[10]中的[ ]是用于声明的符号;用于访问a[5]中的[ ]是下标运算符号。
++ ——增量运算符(递增运算符),又分为前置形式的 ++a,和后置形式的a++。
前置增量运算符 ++a:会在整个表达式进行求值之前,先对操作数的值进行增量。
后置增量运算符a++:会在整个表达式进行求值之后,再对操作数的值进行增量。
这样,一个简单的猜数字游戏就完成了。