• 售前

  • 售后

热门帖子
入门百科

分支与循环语句练习——用C语言设计一个猜数字游戏把(随机数的

[复制链接]
默默MYQ 显示全部楼层 发表于 2022-1-15 08:00:35 |阅读模式 打印 上一主题 下一主题
前言

  
博客主页:干脆面la的主页
        为了能够获得更多关于使用分支与循环语句的经验,现在编写一个简单的游戏程序。这个程序产生一个1~100的随机数,用户尝试尽可能少的次数猜出这个数。
  

  • 如果认为博主的文章对你有所帮助
  • 欢迎三连加关注
  • 你们的支持是最我大的动力!
目录
前言
 1 下面是这个程序运行时用户将看到的
2 整体构思
2.1 main函数
2.2 menu()函数
2.3 game()函数
2.3.1 利用rand()函数生成1~100随机数
 2.3.2 srand()函数 
2.3.3 time函数
2.3.4 交互过程 
3 完整代码奉上 

正文开始...
 1 下面是这个程序运行时用户将看到的

   

  • 猜数字游戏
  • 电脑随机生成一个1~100之间数字
  • 用户猜小了,电脑会告诉:猜小了
  • 用户猜大了,电脑会告诉:猜大了
  • 玩家猜对了,电脑会告诉:恭喜你,猜对了   
    运行结果如下:

  

2 整体构思

   这个程序需要完成几个任务:
  

  • 打印菜单
  • 选择开始游戏 or 退出游戏
  • 生成随机数
  • 猜测神秘数
  • 与用户交互直到选出正确数
  • 选择继续开始游戏 or 退出游戏
因此我们可以写下主函数的框架:
  
2.1 main函数

  分析过程:
  

  • 进入程序需要先打印菜单,并且选择1(开始游戏)/0(结束游戏)来开始游戏或结束游戏。
  • 我们知道当程序一运行起来就要打印菜单并且输入选择开始or结束,因此选择用do...while循环来编写程序。
  • 而input就是我们选择的对菜单进行的选择1(开始游戏)/0(结束游戏),用input作为while的判断条件恰好使输入1的时候条件为真继续循环,而输入0的时候条件为假结束循环。
  1. int main()
  2. {
  3.         int input = 0;
  4.         do
  5.         {
  6.                 //打印菜单
  7.                 menu();
  8.                 printf("Please select:>");
  9.                 scanf("%d", &input);
  10.                 switch(input)
  11.                 {
  12.                 case 1://输入1开始游戏,调用game()函数
  13.                         game();
  14.                         break;
  15.                 case 0:
  16.                         printf("退出游戏\n");//输入0结束游戏,并且循环结束
  17.                         break;
  18.                 default:
  19.                         printf("选择错误\n");//输入其他数字会显示输入错误,并继续重新输入
  20.                         break;
  21.                 }
  22.         } while (input);
  23.         return 0;
  24. }
复制代码

2.2 menu()函数

  menu函数的实现其实很简单,就是通过printf函数来打印相关内容
  1. void menu()
  2. {
  3.         printf("**************************\n");
  4.         printf("*****    1.start     *****\n");
  5.         printf("*****    0.exit      *****\n");
  6.         printf("**************************\n");
  7. }
复制代码

2.3 game()函数

  分析过程:
  

  • 电脑生成1~100随机数
  • 用户猜数字
  • 用户每猜一次就会告诉用户猜大or猜小
  • 用户猜对了就返回主函数   
    2.3.1 利用rand()函数生成1~100随机数
        C语言中生成随机数的方法是rand()函数
          我们先来通过文档看看该怎么使用rand函数
  

  

  

   转到定义得知RAND_MAX是一个十六进制数0x7fff也就是说返回一个十进制为0~32767的int
  文档说到必须在使用rand函数前使用srand函数,我们尝试下如果不使用会怎么样:
  1. void game()
  2. {
  3.         int r = rand();
  4.         printf("%d\n", r);
  5. }
复制代码
第一次运行程序: 
  
  第二次运行程序: 
   我们发现两次运行生成的随机数居然是相同的,这明显不是我们想要的结果。
  
 2.3.2 srand()函数 

  srand(unsigned seed)通过参数seed改变系统提供的种子值,从而可以使得每次调用rand函数生成的伪随机数序列不同,从而实现真正意义上的“随机”。
  
   当我们将种子值设为1时,我们发现随机数都为41
  1. void game()
  2. {
  3.         srand(1);
  4.         int r = rand();
  5.         printf("%d\n", r);
  6. }
复制代码

   当我们将种子值设为100时,随机数又全为365
  
   因此,种子值决定了随机数生成的值,因此我们要思考,什么参数是可以不断变化的,从而实现真正意义上的“随机”,这里我们可以将种子值设为不断变化的时间,这里我们又要引用time()函数。
  
2.3.3 time函数

  
   由于time返回的值是time_t,而time_t转为定义我们发现它实际上通过typedef定义的整型
  
  
  而srand函数需要的参数是unsigned int,因此我们需要对time函数强制类型转换为unsigned int,通过整理,我们只需要把代码写成这样,就可以在真正意义上生成随机数。
  1. void game()
  2. {
  3.         srand((unsigned int)time(NULL));//设置随机数的生成器
  4.         int r = rand();
  5.         printf("%d\n", r);
  6. }
复制代码

   但是这里还有一点是错误的,就是设置随机数的生成器只需要在整个工程中设置一次就可以了,如果在game()函数中创造随机数,如果输入快点会发现生成一样的随机数,如下图:
  
   因此我们把它放在main函数里才是正确的打开方式,这时我们无论输入多快,随机数值都不会重复,如下图: 
  
   
  
  那么我们在设计程序时想要设置的数字时1~100之间的数字,我们要怎么做呢?
  首先我们用r=rand()%100,r的范围就是0~99;
  那么再加上1:r=rand()%100+1,r的范围就是1~100。
   至此我们就成功生成随机数了:
  
  
2.3.4 交互过程 

  接下来就是猜数字及电脑与用户交互的过程,如下图代码:
  1. void game()
  2. {
  3.         printf("请猜一个1~100的数字:>\n");
  4.         //生成随机数
  5.         int r = rand() % 100 + 1;
  6.         int guess = 0;
  7.         int count = 0;
  8.         while(1)
  9.         {
  10.                 scanf("%d", &guess);
  11.                 if (guess < r)
  12.                 {
  13.                         printf("猜小啦,请继续\n");
  14.                         count++;
  15.                 }
  16.                 else if (guess > r)
  17.                 {
  18.                         printf("猜大啦,请继续\n");
  19.                         count++;
  20.                 }
  21.                 else
  22.                 {
  23.                         printf("恭喜你,猜对啦!\n");
  24.                         count++;
  25.                         printf("总共猜了%d次~\n", count);
  26.                         break;
  27.                 }
  28.         }
  29. }
复制代码

  3 完整代码奉上 

  1. #include #include #include void menu()
  2. {
  3.         printf("**************************\n");
  4.         printf("*****    1.start     *****\n");
  5.         printf("*****    0.exit      *****\n");
  6.         printf("**************************\n");
  7. }void game()
  8. {
  9.         printf("请猜一个1~100的数字:>\n");
  10.         //生成随机数
  11.         int r = rand() % 100 + 1;
  12.         int guess = 0;
  13.         int count = 0;
  14.         while(1)
  15.         {
  16.                 scanf("%d", &guess);
  17.                 if (guess < r)
  18.                 {
  19.                         printf("猜小啦,请继续\n");
  20.                         count++;
  21.                 }
  22.                 else if (guess > r)
  23.                 {
  24.                         printf("猜大啦,请继续\n");
  25.                         count++;
  26.                 }
  27.                 else
  28.                 {
  29.                         printf("恭喜你,猜对啦!\n");
  30.                         count++;
  31.                         printf("总共猜了%d次~\n", count);
  32.                         break;
  33.                 }
  34.         }
  35. }int main(){        int input = 0;        srand((unsigned)time(NULL));        do         {                //打印菜单                menu();                printf("Please select:>");                scanf("%d", &input);                switch(input)                {                case 1://进入游戏                        game();                        break;                case 0://退出游戏                        printf("退出游戏\n");                        break;                default:                        printf("选择错误\n");                        break;                }        } while (input);        return 0;}
复制代码
(完)

来源:https://blog.caogenba.net/m0_63303316/article/details/122489732
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作