猜数字游戏:随机生成一个整数(0-100),用户进行猜
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int menu(){
int choose = 0;
printf("********************************\n");
printf("0:退出 1:开始游戏\n");
printf("请输入你的选择:\n");
printf("********************************\n");
scanf("%d", &choose);
return choose;
}
int game(){
int to_guess = rand() % 100 + 1;
int num = 0;
while (1){
printf("请输入你猜的数子:\n");
scanf("%d", &num);
if (to_guess >num){
printf("低了!\n");
}
else if (to_guess < num){
printf("高了!\n");
}
else{
printf("你猜对了!\n");
break;
}
}
}
int main(){
srand((unsigned int)time(0));
while (1){
int choice = menu();
if (choice == 1){
game();
}
else if (choice == 0){
printf("goodbye!\n");
break;
}
else{
printf("输入有误!请重新输入\n");
}
}
system("pause");
return 0;
}
这个代码用户创建了两个函数,一个为menu函数,一个为game函数
menu :main函数调用menu函数,接受一个返回值,这个返回值可以判定用户是否进行游戏
game :
1.随机生成一个数
用rand()函数( #include<stdio.h> ) 可以随机生成一个数,但是当你运行代码时,你猜对第一个数后,你再次运行代码,你输入你第一次运行代码猜对得数,你会发现又猜对了,但这样的代码是不符合预期的.
这是因为rand()函数产生的是伪随机函数,所谓的“伪随机数”指的并不是假的随机数,其实绝对的随机数只是一种理想状态的随机数,计算机只能生成相对的随机数即伪随机数。
系统在调用rand()之前都会自动调用srand(),如果用户在rand()之前曾调用过srand()给参数seed指定了一个值,那么 rand()就会将seed的值作为产生伪随机数的初始值;而如果用户在rand()前没有调用过srand(),那么系统默认将1作为伪随机数的初始 值。如果给了一个定值,那么每次rand()产生的随机数序列都是一样的。所以我们就要让它产生的随机数的初始值是改变的,这就涉及到一个时间戳的概念 (是以1970年1月1日0时0分0秒为基准,计算当前时刻和基准时刻的秒数之差. 可以用 time(0) 或者 (time(NULL) (#include<time.h)).这样就保证了产生随机数的初始值是改变的.
如果你添加上srand(time(0)),你会发现可能会给你警告,这是因为srand()的函数参数是一个
unsigned int型,而time的返回值是一个unsigned long long 型,字节不同可能会造成数据的丢失,但是在这个代码中我们可以不用考虑这个,消除警告我们可以强制转换,即改为
srand((unsigned int)time(0))
2.比较数
用户从键盘输入一个数和随机数进行比较,在不停比较的这个过程中可以用whlie(1),这虽然是一个死循环,但是当你输入的数和随机数相等时可以用break跳出这个循环
在main函数中调用menu函数,当返回值为0时,break跳出while(1)循环,退出游戏.当返回值为1时,调用game函数,进行游戏