用C语言实现猜数字游戏

简介: 接下来我将带领大家用C语言实现简单的猜数字游戏,并一步一步实现和排错,希望能帮助到大家

接下来我将带领大家用C语言实现简单的猜数字游戏,并一步一步实现和排错,希望能帮助到大家


首先我们先确定一下猜数字游戏都有哪些功能


电脑随机生成一个数字

玩家猜数字

玩家猜小了,就告知猜小了

玩家猜大了,就告知猜大了

直到猜对为止

游戏可以一直玩

1、实现主函数和菜单函数 玩家选1开始游戏、选0结束游戏、其他重新选择

void menu()
{
  printf("**********************\n");
  printf("*********1.play*******\n");
  printf("*********0.exit*******\n");
  printf("**********************\n");
}
int main()
{
  int input = 0;
  do
  {
  menu();
  printf("请选择:>");
  scanf("%d", &input);
  switch (input)
  {
  case 1:
    game();
    break;
  case 0:
    printf("退出游戏\n");
    break;
  default: 
    printf("选择错误,重新选择\n");
    break;
  }
  } while (input);
  return 0;
}

第一步完成,接下来就该实现猜数字最重要的部分,游戏的实现。


2、写一个game()函数

2.1、生成一个随机数

       C语言中提供了一个生成随机数的函数 "rand()" 头文件 #include<stdlib.h>


7cfa050187113c82429bb156ebaca341_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

  "rand()"函数本身不要参数,并返回一个int类型的随机值,该值的范围在0~RAND_MAX

       当我们引入#include<stdlib.h>头文件就能看见RAND_MAX的定义


b69a7e6e9f5cf941c45daa907a23e96f_6ca72766abc34cdfb62ca36d4ab4bd3d.png

       可见RAND_MAX的大小为32767,所以rand 函数返回的随机数的范围是(0~32767)


       我们可以调试一下看看效果

void game()
{
  int ret = rand();
  printf("%d\n", ret);
}

这是就会出现一个问题,我们测试两次生成的随机数完全一样。如果玩家真的要玩第二次的话,完全可以记着第一次的结果。


所以这种用法不对,需要改正

47aa2698d3e9e17f9662410818c27d8a_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

我们再重新读一下rand()的用法

8b8e0ab723427cdefcb9b22c0f25ad60_6ac272bb8f0d4e51bd7cf18155c0aaf0.png

图中标记的那句话的意思是:在调用 rand 之前需要先调用 srand函数去设置随机数的生成器。


也就是说在调用rand之前要先调用srand。


现在出现在我们面前的问题是srand又是何方神圣呢?我们看文档

69cac88f722a5a01fb51672fd65f795a_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

我们发现srand需要一个整型,那就让我们在srand里面加入整型试一试。

我们分别把srand函数中的值改为200和100,并调试观察结果。

void game()
{
  srand(200);//srand(100);
  int ret = rand();
  printf("%d\n", ret);
}

 0c25a1b5640286eed9015bc654159e71_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_18,color_FFFFFF,t_70,g_se,x_16.png

5405a265c464d040b6e7019f068e2ed5_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_18,color_FFFFFF,t_70,g_se,x_16.png

       可以发现随机数随着srand里面的参数而改变,问题来了,我们需要一个随机数而srand告诉我们需要投入进去一个随机数,天啊这不就是套娃问题吗。


       为了解决此问题我们需要找到一个一直变化的东西,但是什么是变化的东西呢?


时间!


       这里引入一个概念叫“时间戳”,它的含义就是:这个时间相较于相较于计算机的起始时间(1970年1月1日0时0分0秒)的差值,单位是秒。


       时间戳可以转换为时间,同样时间也可以转换成时间戳。

1919a656a69834c0a10fbf30dd179980_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png



       如果我们把“时间戳”作为参数传递给srand,那么就能随机生成一个随机数啦。但是怎么传呢? 别急,C语言提供了一个函数time,可以返回一个时间戳。

58c40baab4f050e6296cd3b9724b8eb9_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png



       time 函数有一个参数参数叫timer,类型为“time_t *”, 头文件为#include<time.h>,而timer的含义为“Storage location for time”。


       什么意思呢,就是我们可以在函数外面可以创建一个参数例如: time_t* t;我们可以把‘t’的地址传给time函数,然后time函数就把时间戳的时间放到‘t’里面 。当然这个参数我们也可以不用,可以传入空指针NULL。


所以返回时间戳有两种方法


1、用参数:我们可以把时间戳放到 't'里面,当然这个't'是我们自己创建的。


2、用返回值:例如 srand(time(NULL)) 直接把time函数的返回值传出去。(注意要传入空指针)


现在又涉及到一个问题,time函数返回的数类型是什么?


这里我们直接查看time_t 的定义

35da67075819f832ebd5a070435d3eaf_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

       发现是一个长整型或一个整型,而srand参数需要的是unsigned int (可以翻看上面图片)。


使用传参的时候就应该这样写

srand((unsigned int)time(NULL));

我们再一次测试结果

779d29400cbacc62a00d4349bbd1a52c_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_19,color_FFFFFF,t_70,g_se,x_16.png

          发现数字已经发生变化了,但是生成还是有问题,当我们快速按两次1,会发现两次生成随机数一样。


       所以在调用rand函数之前要调用srand,但是不需要频繁调用。只要在整个程序运行起来之前调用一次就可以了。我们只需要把它放到主函数里面。

void game()
{
  //1.生成一个随机数
  int ret = rand();
  printf("%d\n", ret);
  //2.猜数字
}
int main()
{
  srand((unsigned int)time(NULL));
  int input = 0;
  do
  {
  menu();
  printf("请选择:>");
  scanf("%d", &input);
  switch (input)
  {
  case 1:
    game();
    break;
  case 0:
    printf("退出游戏\n");
    break;
  default: 
    printf("选择错误,重新选择\n");
    break;
  }
  } while (input);
  return 0;
}

b5c1e7caffb3c90e1ef43ef4d163329d_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png


测试两次,发现随机数不一样了,终于解决这个问题了呼~


在生成随机数之前主要注意


1、在调用rand之前要先调用srand


2、srand需要一个变化的值 time函数返回的时间戳


3、srand只需要调用一次就可以了,不需要频繁调用


       我们在介绍rand生成的随机数的范围在(0~32767),而在开头我们要猜的数在(1~100),所以我们要控制随机数生成的范围。


       让rand()%100,因为任何数模上100的余数必为(0~99),再加上1,这样就能生成(1~100)的数啦。

int ret = rand()%100+1;

6152a098ba7c527da560b9980f7acf3c_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png


2.2、猜数字

当玩家在猜数字的时候,我们不能把生成的随机数让玩家看见,所以我们不能打印随机数


同时,我们也不可能只让玩家猜一猜,所以要用上while循环,只有猜对了才能结束

void game()
{
  int guess = 0;
  //1.生成一个随机数
  int ret = rand()%100+1;
  /*printf("%d\n", ret);*/
  //2.猜数字
  while (1)
  {
  printf("请猜数字:>\n");
  scanf("%d", &guess);
  if (guess < ret)
  {
    printf("猜小了\n");
  }
  else if (guess > ret)
  {
    printf("猜大了\n");
  }
  else {
    printf("恭喜你,猜对了\n");
    break;
  }
  }
}

c71033abd9e9743c4c0835010de02fef_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_18,color_FFFFFF,t_70,g_se,x_16.png


至此猜数字游戏圆满完成,下面是完整的代码,希望可以为各位提供帮助

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
  printf("**********************\n");
  printf("*********1.play*******\n");
  printf("*********0.exit*******\n");
  printf("**********************\n");
}
//猜数字游戏的实现
void game()
{
  int guess = 0;
相关文章
|
2天前
|
程序员 C语言 索引
【️C语言-游戏设置】---三子棋(N满)
【️C语言-游戏设置】---三子棋(N满)
|
2天前
|
C语言
️️【C语言-游戏设置】---猜数字游戏1~100
️️【C语言-游戏设置】---猜数字游戏1~100
|
10天前
|
C语言
C语言——oj刷题——猜数字游戏
C语言——oj刷题——猜数字游戏
|
10天前
|
C语言
扫雷游戏(C语言)
扫雷游戏(C语言)
|
11天前
|
C语言
C语言游戏实战(12):植物大战僵尸(坤版
C语言游戏实战(12):植物大战僵尸(坤版
25 4
|
18天前
|
安全 C语言
四步手把手教你实现扫雷游戏(c语言)
四步手把手教你实现扫雷游戏(c语言)
25 0
|
18天前
|
程序员 C语言
实现三子棋游戏(C语言)----就是这么简单
实现三子棋游戏(C语言)----就是这么简单
8 2
|
18天前
|
C语言
C语言实现猜数字游戏
C语言实现猜数字游戏
25 1
|
19天前
|
C语言
C语言实现扫雷游戏
C语言实现扫雷游戏
16 0
|
22天前
|
C语言
循环的应用--猜数字游戏、关机程序【c语言篇】
循环的应用--猜数字游戏、关机程序【c语言篇】
31 0