猜数字游戏实现
1.程序会生成一个1~100之间的随机数
2.猜数字
1)猜小了,程序会告诉你猜小了。继续猜
2)猜大了,程序会告诉你猜大了。继续猜
3)猜对了,程序会告诉你:恭喜你猜对了。结束
3.游戏可以反复玩
第一步先写一个函数menu,打印菜单,用do.....while循环来实现
#include <stdio.h>
void menu()
{
printf("*********************");
printf("****** 1. play*******");
printf("****** 0. exit*******");
printf("*********************");
}
int main()
{
do
{
//打印菜单
menu();
} while();
return 0;
}
接下来写猜数字游戏实现的完整逻辑
#include <stdio.h>
void menu()
{
printf("*********************");
printf("****** 1. play*******");
printf("****** 0. exit*******");
printf("*********************");
}
int main()
{ int input = 0;
do
{
//打印菜单
menu();
printf("请选择:>");
scanf("%d",&input);
switch(input)
{
case 1:
printf("猜数字\n");
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while(input);
return 0;
}
此时代码运行起来
接下来要写猜数字部分:
写一个函数game来实现猜数字,在game函数内部分为两部分(生成随机数和猜数字),在第一部中,生成随机数用rand函数来实现,rand函数是专门用来生成随机数的,它返回的是0~RAND_MAX(32767)之间的一个随机数
#include <stdio.h>
void menu()
{
printf("*********************");
printf("****** 1. play*******");
printf("****** 0. exit*******");
printf("*********************");
}
void game()
{
//1.生成随机数
int ret = rand();
printf("%d\n",ret);
//2.猜数字
}
int main()
{ int input = 0;
do
{
//打印菜单
menu();
printf("请选择:>");
scanf("%d",&input);
switch(input)
{
case 1:
game();//game函数中是猜数字的整个逻辑
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while(input);
return 0;
}
此时代码运行起来会发现每一次的数字都是一样的,并不是随机数字
这是因为rand函数在使用之前要使用一个srand函数来设置随机数的生成器,srand函数需要一个头文件 #include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
void menu()
{
printf("*********************");
printf("****** 1. play*******");
printf("****** 0. exit*******");
printf("*********************");
}
void game()
{
srand(0);
//1.生成随机数
int ret = rand();
printf("%d\n",ret);
//2.猜数字
}
int main()
{ int input = 0;
do
{
//打印菜单
menu();
printf("请选择:>");
scanf("%d",&input);
switch(input)
{
case 1:
game();//game函数中是猜数字的整个逻辑
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while(input);
return 0;
}
此时再次运行会发现每一次的数字都一样【将srand(),()内的数字改为1等其他数字,结果也一样】
这时候要引入一个概念,时间戳,时间戳是从1970年1月1日(UTC/GMT的午夜)所经过的秒数
(时间戳=现在的时间 - 19701.1),而在C语言中,time函数会返回时间戳,time函数的参数类型是一个指针,此时我们不需要,可以将它的参数设置为空指针(NULL),这样就能生成每一次都不一样的随机数,并且time函数需要引入一个头文件 #include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("*********************");
printf("****** 1. play*******");
printf("****** 0. exit*******");
printf("*********************");
}
void game()
{
srand((unsigned int)time(NULL));
//1.生成随机数
int ret = rand();
printf("%d\n",ret);
//2.猜数字
}
int main()
{ int input = 0;
do
{
//打印菜单
menu();
printf("请选择:>");
scanf("%d",&input);
switch(input)
{
case 1:
game();//game函数中是猜数字的整个逻辑
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while(input);
return 0;
}
此时让代码运行起来,会发现随机数非常相近,如果动作稍微快一点的话,前后几次的随机数可能会相同
原因:srand函数在程序中只要调用一次就可以了,不需要频繁调用,所以应该将srand函数放在主函数中去使用
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("*********************");
printf("****** 1. play*******");
printf("****** 0. exit*******");
printf("*********************");
}
void game()
{
//1.生成随机数
int ret = rand();
printf("%d\n",ret);
//2.猜数字
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
//打印菜单
menu();
printf("请选择:>");
scanf("%d",&input);
switch(input)
{
case 1:
game();//game函数中是猜数字的整个逻辑
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while(input);
return 0;
}
此时打印出来的就是真正的一串随机数
我们条件要求的是生成1~100的随机数,而任何数%100的结果都在0~99之间,所以
%100+1就变成在1~100之间
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("*********************");
printf("****** 1. play*******");
printf("****** 0. exit*******");
printf("*********************");
}
void game()
{
//1.生成随机数
int ret = rand() % 100 + 1;
printf("%d\n",ret);
//2.猜数字
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
//打印菜单
menu();
printf("请选择:>");
scanf("%d",&input);
switch(input)
{
case 1:
game();//game函数中是猜数字的整个逻辑
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while(input);
return 0;
}
接下来要最后完成的二部分,猜数字
以下是最终代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("*********************");
printf("****** 1. play*******");
printf("****** 0. exit*******");
printf("*********************");
}
void game()
{
int num = 0;
//1.生成随机数
int ret = rand() % 100 + 1;
//printf("%d\n",ret);进行猜数字部分需将此步注释掉
//2.猜数字
while(1)
{
printf("请猜数字:>");
scanf("%d",&num);
if(num<ret)
{
printf("猜小了\n");
}
else if(num>ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
//打印菜单
menu();
printf("请选择:>");
scanf("%d",&input);
switch(input)
{
case 1:
game();//game函数中是猜数字的整个逻辑
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while(input);
return 0;
}