1. 列出游戏相关功能
1.1 随机生成一个数字,让玩家猜
1.2 三种可能的情况
1.2.1 猜大了,重新猜
1.2.2 猜小了,重新猜
1.2.3 猜对了,恭喜你,猜对了,结束游戏
1.3 玩完一把,可以选择是否再玩一把,不用退出程序
2. 三种功能的思路解析
2.1 功能一思路实现
要生成一个随机数,我们需要学习三个函数——rand(随机生成数字)、srand(初始化随机数——在调用rand之前)、time(返回时间戳)
rand函数:可以实现随机生成一个范围是 0 ~ RAND_MAX(32767)的数,RAND_MAX16 进制为(0x7fff)——>转为十进制数为32767
srand函数:如果给srand传递一个不变的值,这时rand随机生成的值就是不变的值,所以我们需要传一个变化的值给srand,我们发现计算机上的的时间是时刻变化的—使用time函数,返回时间戳
扩展:时间戳> 是指现在的时间减去1970年1月1日的时间,化成秒表示的数字大小,不考虑闰秒
time函数:在srand函数中调用time函数,返回时间戳,time的返回类型进行了多层包装,其实是long long (长长整型),srand需要的返回类型是unsigned int 类型,使用我们需要强转一下
注意点1:由于我们玩的那一把只需要生成一个随机数来玩,所以我们可以在主函数中调用随机生成数字部分的代码,因为主函数在程序运行时只会被调用一次,也就一把生成一个随机数,而且十分随机
注意点2:由于随机数的范围太大了,游戏体验感很差,我们可以在生成随机数后%100+1,生成的就是0~100的数字
2.2 功能二 思路实现
猜数字部分我们可以想到用if—else语句来实现3种情况,还有使用while循环,判断条件部分恒为真,实现一直猜
2.3 功能三 思路实现
使用do—while实现玩完一把,再玩一把
3. 代码实现
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <time.h> void menu() { printf("***************************\n"); printf("***** 1.play 0.exit *****\n"); printf("***************************\n"); } //void srand (unsigned int seed); void game() { RAND_MAX; //1. 生成随机数 int ret = rand() % 100 + 1;//可以生成随机数,随机数的范围是:0~32767 //0~99 //2. 猜数字 int guess = 0; while (1)//恒为真,直到猜对,结束本局游戏 { printf("请猜数字:>"); scanf("%d", &guess); if (guess > ret) { printf("猜大了\n"); } else if (guess < ret) { printf("猜小了\n"); } else { printf("恭喜你,猜对了\n"); break; } } } int main() { //打印菜单 //1. 玩游戏 //0. 退出游戏 int input = 0; srand((unsigned int)time(NULL));//要给srand传递一个变化的值,计算机上的时间是时刻发生变化的 //time函数可以返回一个时间戳 do { menu(); printf("请选择:>"); scanf("%d", &input);//1 0 switch (input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("选择错误\n"); break; } } while (input); return 0; }
总结:
1. 这里实现的游戏目录可以简化我们玩游戏的选择种类,1(玩游戏)、0(退出游戏),后面实现通讯录、扫雷、三子棋等小游戏的时候也要用到
2. 学习了rand、srand、time等函数的功能,三个函数配合使用可以随机生成数字