捣蛋小游戏——猜数字

简介: 捣蛋小游戏——猜数字

前言:

       随着我们对C语言的学习,相信大家对C语言已经有了初步的了解,来一个简单的项目来检验一下学习成果吧。

一、必备函数

       猜数字最重要的便是猜,总不能直接输入一个数吧。所以,我们不得不再一次寻求援助,下面便是这次的援助:

       1.1 rand函数

       什么是rand函数呢?官网的解释如下:

       

      翻译下来大致是这样:

       rand函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的⼤⼩是 依赖编译器上实现的,但是⼤部分编译器上是32767。 rand函数的使⽤需要包含⼀个头⽂件是:stdlib.h

       可用如下代码实现:

1. #include <stdio.h>
2. #include<stdlib.h>
3. int main()
4. {
5.  printf("%d\n", rand());
6.  printf("%d\n", rand());
7.  printf("%d\n", rand());
8.  return 0;
9. }

运行结果如下:

第一次运行结果  第二次运行结果

       相信你们发现这两次运行结果是一样的 ,那这是为什么呢?

       原来是其实rand函数⽣成的随机数是伪随机的,伪随机数不是真正 的随机数,是通过某种算法⽣成的随机数。真正的随机数的是⽆法预测下⼀个值是多少的。⽽rand函 数是对⼀个叫“种⼦”的基准值进⾏运算⽣成的随机数。

       那结果一样那游戏还有什么意思,所以我们请出第二位

1.2 srand函数

       C语⾔中⼜提供了⼀个函数叫 srand,⽤来初始化随机数的⽣成器的。官网解释如下:

       

       大致意思如下:

       程序中在调⽤ rand 函数之前先调⽤ srand 函数,通过 srand 函数的参数seed来设置rand函数⽣成随 机数的时候的种⼦,只要种⼦在变化,每次⽣成的随机数序列也就变化起来了。 那也就是说给srand的种⼦是如果是随机的,rand就能⽣成随机数;在⽣成随机数的时候⼜需要⼀个随 机数,这就⽭盾了 。

       通过以上,我们可以得出,随机数的生成与’种子‘有关,那我们该如何改变呢?那就不得不再来一位了。

1.3 time

       在程序中我们⼀般是使⽤程序运⾏的时间作为种⼦的,因为时间时刻在发⽣变化的。

       官网解释:

       

大致意思如下:

       time 函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的 差值,单位是秒。返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类 型。 time函数的参数 timer 如果是⾮NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存 中带回去。 如果 timer 是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳。

       时间戳:时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。

time函数的时候需要包含头⽂件:time.h

       代码展示:

1. #include <stdio.h>
2. #include<stdlib.h>
3. #include<time.h>
4. int main()
5. {
6.  //使⽤time函数的返回值设置种⼦
7.  //因为srand的参数是unsigned int类型,我们将time函数的返回值强制类型转换
8.  srand((unsigned int)time(NULL));
9.  printf("%d\n", rand());
10.   printf("%d\n", rand());
11.   printf("%d\n", rand());
12.   return 0;
13. }

第一次  第二次

         srand函数是不需要频繁调⽤的,⼀次运⾏的程序中调⽤⼀次就够了。

         看得出我们找到了种方法,那我们如何限定范围呢?其实很简单。

       1.4 设定范围

       如果我们要⽣成0~99之间的随机数,⽅法如下:

rand() % 100;

       那0~100呢? 方法如下:

rand() % 100+1;

       所以如果要⽣成a~b的随机数,⽅法如下:

a + rand()%(b-a+1)

       好了,我们开始向项目进军吧。

二、猜数字代码实现

       2.1游戏要求及思路

       游戏要求: 1. 电脑⾃动⽣成1~100的随机数 2. 玩家猜数字,猜数字的过程中,根据猜测数据的⼤⼩给出⼤了或⼩了的反馈,直到猜对,游戏结束

             实现思路:1.设置菜单,选择是否游戏;2.选择错误,重新选择。

        2.2 打印菜单

1. void menu()
2. {
3.  printf("***********************\n");
4.  printf("******* 1. play *******\n");
5.  printf("******* 0. exit *******\n");
6.  printf("***********************\n");
7. }

                        (我才学疏浅只能实现如此简陋的菜单)

       2.3 主体框架

1. int main()
2. {
3.  int input = 0;
4.  srand((unsigned int)time(NULL));
5.  do
6.  {
7.    menu();
8.    printf("请选择:>");
9.    scanf("%d", &input);
10.     switch (input)
11.     {
12.     case 1:
13.       printf("开始游戏:\n");
14.       game();
15.       break;
16.     case 2:
17.       printf("游戏结束:\n");
18.       break;
19.     default :
20.       printf("输入错误,请重新输入\n");
21.       break;
22.     }
23.   } while (input);
24.   return 0;
25. }

       2.4 游戏框架

1. void game()
2. {
3.  int r = rand() % 100 + 1;
4.  int guess = 0;
5.  int count = 5;
6.  while (count)
7.  {
8.    printf("\n你还有%d次机会\n", count);
9.    printf("请猜数字>:");
10.     scanf("%d", &guess);
11.     if (guess < r)
12.     {
13.       printf("猜小了\n");
14.     }
15.     else if (guess > r)
16.     {
17.       printf("猜大了\n");
18.     }
19.     else
20.     {
21.       printf("恭喜你,猜对了\n");
22.       break;
23.     }
24.     count--;
25.   }
26.   if (count == 0)
27.   {
28.     printf("你失败了,正确值是:%d\n", r);
29.     punish();
30.   }
31. }

       2.5 惩罚措施

       如何实现惩罚措施呢?可借用函数。

       官网解释如下:

解释如下:

  1. 头文件#include<stdlib.h>
  2. 声明: int system(const char *command)
  3. 作用:把 command 指定的命令名称或程序名称传给要被命令处理器执行的主机环境,并在命令完成后返回。(简单来说就是执行系统指令)\n返回值:如果发生错误,则返回值为 -1,否则返回命令的状态。

       关机指令:

1. 
2. system("shutdown -s -t 60");//60s后关机
3. //不要忘记之间的空格哦
4. 
5.

       取消指令 :

       

1. 
2. system("shutdown -s -t 60");//60s后关机
3. //不要忘记之间的空格哦
4. 
5.

       问题来了,如何取消惩罚措施呢?其实也很简单。

       当玩家输入“取消关机”的时候,则取消关机,用计算机语言表达就是比较玩家输入的内容是否与“我是猪”这个字符串相同,可能大家第一想法是用==,但是字符串在内存中是以首元素地址存储的,比较两个地址肯定不同,所以我们就借用一个库函数strcmp()来比较字符串。

       strcmp函数解释如下:

       

  1. 头文件#include<string.h>
  2. 声明:int strcmp(const char *str1, const char *str2),str1 – 要进行比较的第一个字符串。str2 – 要进行比较的第二个字符串。
  3. 作用:比较两个字符串。
  4. 返回值:如果返回值小于 0,则表示 str1 小于 str2。
  5. 如果返回值大于 0,则表示 str1 大于 str2。\n如果返回值等于 0,则表示 str1 等于 str2。

代码实现:

1. void punish()
2. {
3.  printf("你的电脑将会在60s内关机\n");
4.  system("shutdown -s -t 60");
5.  printf("若不想关机,请输入:不想关机。\n");
6.  while (1)
7.  {
8.    char arr[20] = { 0 };
9.    gets(arr);
10.     if (!strcmp(arr, "不想关机"))
11.     {
12.       system("shutdown -a");
13.       break;
14.     }
15.   }
16. }

三、完整代码

       

1. #define _CRT_SECURE_NO_WARNINGS 1
2. #include <stdio.h>
3. #include<stdlib.h>
4. #include<time.h>
5. #include<string.h>
6. void menu()
7. {
8.  printf("***********************\n");
9.  printf("******* 1. play *******\n");
10.   printf("******* 0. exit *******\n");
11.   printf("***********************\n");
12. }
13. void punish()
14. {
15.   printf("你的电脑将会在60s内关机\n");
16.   system("shutdown -s -t 60");
17.   printf("若不想关机,请输入:不想关机。\n");
18.   while (1)
19.   {
20.     char arr[20] = { 0 };
21.     gets(arr);
22.     if (!(strcmp(arr, "不想关机")))
23.     {
24.       system("shutdown -a");
25.       break;
26.     }
27.   }
28. }
29. void game()
30. {
31.   int r = rand() % 100 + 1;
32.   int guess = 0;
33.   int count = 5;
34.   while (count)
35.   {
36.     printf("\n你还有%d次机会\n", count);
37.     printf("请猜数字>:");
38.     scanf("%d", &guess);
39.     if (guess < r)
40.     {
41.       printf("猜小了\n");
42.     }
43.     else if (guess > r)
44.     {
45.       printf("猜大了\n");
46.     }
47.     else
48.     {
49.       printf("恭喜你,猜对了\n");
50.       break;
51.     }
52.     count--;
53.   }
54.   if (count == 0)
55.   {
56.     printf("你失败了,正确值是:%d\n", r);
57.     punish();
58.   }
59. }
60. int main()
61. {
62.   int input = 0;
63.   srand((unsigned int)time(NULL));
64.   do
65.   {
66.     menu();
67.     printf("请选择:>");
68.     scanf("%d", &input);
69.     switch (input)
70.     {
71.     case 1:
72.       printf("开始游戏:\n");
73.       game();
74.       break;
75.     case 2:
76.       printf("游戏结束:\n");
77.       break;
78.     default:
79.       printf("输入错误,请重新输入\n");
80.       break;
81.     }
82.   } while (input);
83.   return 0;
84. }

       快写给你兄弟一起玩吧!

       完!

相关文章
|
13天前
|
C++
C++小练习:猜数游戏
C++小练习:猜数游戏
|
1月前
|
C语言
猜数字小游戏(随机生成’三剑客‘)
猜数字小游戏(随机生成’三剑客‘)
|
1月前
|
弹性计算 运维 算法
猜数游戏
【4月更文挑战第29天】
23 1
|
1月前
L1-056 猜数字
L1-056 猜数字
16 0
|
1月前
|
BI
猜数字
猜数字
18 0
|
11月前
猜数字小游戏
猜数字小游戏
45 0
|
11月前
小游戏(猜数字、剪刀石头布) 2021-01-03
小游戏(猜数字、剪刀石头布) 2021-01-03
|
10月前
|
存储 C语言
你也能做的简单版猜数字游戏(和优化版猜数字)
你也能做的简单版猜数字游戏(和优化版猜数字)
|
11月前
|
C++
你猜我猜不猜 (猜数字游戏) 快来小玩一把叭
你猜我猜不猜 (猜数字游戏) 快来小玩一把叭
71 0
猜数字小游戏(加强版)它来了
猜数字小游戏(加强版)它来了
57 0