你也能做的简单版猜数字游戏(和优化版猜数字)

简介: 你也能做的简单版猜数字游戏(和优化版猜数字)

猜数字游戏

1.游戏可以重复玩(打印一个游戏菜单提示)-至少执行一次

2.程序会生成1-100之间的随机数
3.猜数字
(1)猜小了,程序会告诉你猜小了,继续猜
(2)猜大了,程序会告诉你猜大了,继续猜
(3)猜对了,程序会告诉:恭喜你猜对了,程序结束

写代码:不是一行一行的抄写,是想到哪写到哪

            并且要一边写一边测试(才不会出现很多错误)

1.框架

#include<stdio.h>
void menu()
{
  printf("**************************\n");
  printf("*****      1.play    *****\n");
  printf("*****      0.exit    *****\n");
  printf("**************************\n");
}
int main()
{
  int input = 0;//玩不玩游戏的循环判断条件(作用域)
  do
  {
    //打印菜单
    menu();
    printf("请选择\n");//提示你输入
    scanf("%d", &input);
    //多分支语句
    switch (input)
    {
    case 1:
      printf("猜数字\n");
      break;//实现分支,跳出switch
    case 0:
      printf("退出游戏\n");
      break;
    default:
      printf("选择错误,请重新选择\n");
      break;
    }
  } while (input);
  return 0;
}

这里我们就先测试一次,可以吗,可以就继续写

2.生成随机数

(1)第二次测试

#include<stdio.h>
#include<stdlib.h>//rand-头文件
void menu()
{
  printf("**************************\n");
  printf("*****      1.play    *****\n");
  printf("*****      0.exit    *****\n");
  printf("**************************\n");
}
//rand函数是专门用来生成随机数的
//int rand(void)-返回的是0-RAND_MAX之间的一个随机数
//#define RAND_MAX 0x7fff
//0x7fff=32767
void game()//void-空-不用返回参数
{
  //1、生成随机数
  int ret = rand();
    printf("%d\n",ret);
  //2、猜数字
}
int main()
{
  //RAND_MAX;//鼠标右键查找转到定义
  int input = 0;//玩不玩游戏的循环判断条件(作用域)
  do
  {
    //打印菜单
    menu();
    printf("请选择\n");//提示你输入
    scanf("%d", &input);
    //多分支语句
    switch (input)
    {
    case 1:
      //printf("猜数字\n");
      game();//game()函数是猜数字的整个逻辑
      break;//实现分支,跳出switch
    case 0:
      printf("退出游戏\n");
      break;
    default:
      printf("选择错误,请重新选择\n");
      break;
    }
  } while (input);
  return 0;
}

1、rand函数是专门用来生成随机数的

格式:int rand(void)-返回的是0-RAND_MAX之间的一个随机数

#define RAND_MAX 0x7fff

0x7fff=32767

2、rand的头文件“stdlib.h”

这时我们运行两次程序,发现了第一次和第二次运行生成的随机数一样!如下:大家可以试试。


rand函数是返回0-32767之间的伪随机数


改正:rand函数在使用之前要使用一个srand函数来设置随机数的生成器(生成起点)


srand函数-设置随机数的生成器(生成起点)

格式:void srand(unsigned int seed)

返回值:void-不返回,就是没有

参数:unsigned int seed-无符号的整形种子,就是自然数

srand的头文件:“stdlib.h”


#include<stdlib.h>
#include<stdio.h>
int main()
{
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    srand(1);//随机数生成器
    int ret = rand();//生成随机数
    printf("%d\n", ret);
  }
  return 0;
}


注:由上可看出 srand函数只需调用一次就可以了,不要频繁调用(生成起点一样,随机数不够随机)

    只调用一次----放在main中

#include<stdlib.h>
#include<stdio.h>
int main()
{
  srand(1);//随机数生成器
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    int ret = rand();//生成随机数
    printf("%d\n", ret);
  }
  return 0;
}


这个时候我们很高兴生成了随机数,但是当我们多次运行的时候又发现每一次运行生成的随机数又是一样的了。

这个时候该怎么办呢?

参数:要一个随机数?不又死循环了吗?

       要一个变化的值--->时间不就是一直在变吗--->时间戳


在C语言中,time函数会返回时间戳

格式:time_t time(time_t* timer)

参数:(定时器)(1)指向存储时间值的类型对象的指针;(2)不使用参数,此参数可以是NULL指针(NULL-空指针)

返回值:读取成功,返回作为time_t对象的当前日历时间(就是一个整形数字);读取失败,返回of

time头文件:“time.h”


#include<stdlib.h>
#include<stdio.h>
#include<time.h>
int main()
{
  srand((unsigned int)time(NULL));//随机数生成器
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    int ret = rand();//生成随机数
    printf("%d\n", ret);
  }
  return 0;
}

这个时候我们才能每次都生成不同的随机数

3.猜数字

#include<stdio.h>
#include<stdlib.h>//rand和srand-头文件
#include<time.h>//time-头文件
void menu()
{
  printf("**************************\n");
  printf("*****      1.play    *****\n");
  printf("*****      0.exit    *****\n");
  printf("**************************\n");
}
//rand函数是专门用来生成随机数的
//int rand(void)-返回的是0-RAND_MAX之间的一个随机数
//#define RAND_MAX 0x7fff
//0x7fff=32767
void game()//void-空-不用返回参数
{
  //1、生成随机数
  int ret = rand()%100+1;//任意数%100=0-99,这时我们要1-100的数
  //2、猜数字
  int num = 0;
  while (1)
  {
    printf("请猜数字\n");
    scanf("%d", &num);
    if (num < ret)
      printf("猜小了,继续猜\n");
    else if (num > ret)
      printf("猜大了,继续猜\n");
    else
    {
      printf("恭喜你猜对了,还要玩吗?\n");
      break;
    }
  }
}
int main()
{
  //RAND_MAX;//鼠标右键查找转到定义
  int input = 0;//玩不玩游戏的循环判断条件(作用域)
  srand((unsigned int)time(NULL));//随机数生成器
  do
  {
    //打印菜单
    menu();
    printf("请选择\n");//提示你输入
    scanf("%d", &input);
    //多分支语句
    switch (input)
    {
    case 1:
      //printf("猜数字\n");
      game();//game()函数是猜数字的整个逻辑
      break;//实现分支,跳出switch
    case 0:
      printf("退出游戏\n");
      break;
    default:
      printf("选择错误,请重新选择\n");
      break;
    }
  } while (input);
  return 0;
}

我们基础的猜数字游戏就完成了,大家可以去试试吧

任意一个数%100=0-99--->想要0-100:任意数%100+1


做一个优化加强版的猜数字游戏:

总体思路大致相同:

1、优化页面--玩一次删除一次页面

2、设置游戏难度--即限制猜数字的次数

//加强版猜数字
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
void menu()
{
  printf("************************************\n");
  printf("*******     1.play          ********\n");
  printf("*******     0.exit          ********\n");
  printf("************************************\n");
}
void page()
{
  printf("*************************************\n");
  printf("*******     10.简单           ********\n");
  printf("*******     5.中等          ********\n");
  printf("*******     3.困难           ********\n");
  printf("*************************************\n");
}
void game()
{
  //1、生成随机数1-100
  int ret = rand()%100+1;//1、头文件“stdlib.h”2、前面要随机数生成器
  //2.选择难度,猜数字
    //打印难度页面
    page();
    printf("请选择难度:>\n");
    int num = 0;//变量,猜数字
    int flat = 0;//判断失败的变量
    int diffculty = 0;//游戏难度
    scanf("%d", &diffculty);
    int i = 0;//猜数字次数
    for (i = 0; i < diffculty; i++)//控制猜的次数
    {
      if (diffculty!= 10 && diffculty!= 5 && diffculty != 3)
      {
        printf("输入错误,游戏重新开始\n");
        break;//终止循环
      }
      printf("请猜数字\n");
      scanf("%d", &num);
      if (ret > num)
      {
        printf("猜小了,你还剩余%d次机会", diffculty - ++i);
      }
      else if (ret < num)
      {
        printf("猜大了,你还剩余%d次机会", diffculty - ++i);
      }
      else
      {
        flat = 1;
        printf("恭喜你猜对了,还要玩吗?\n");
        break;
      }
    }
    if (0 == flat)
    {
      printf("很遗憾,你失败了,建议降低难度。\n");
    }
    Sleep(2000);//Sleep函数是实现睡眠,单位是毫秒;头文件“windows.h”
    system("cls");//system是一个库函数,可以执行系统命令,cls是清空屏幕的一个命令;头文件"stdlib.h"
}
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;
}


相关文章
|
BI 数据挖掘
公开课02期 |基于宜搭的《客户关系管理(CRM)》应用搭建
主要展示宜搭搭建CRM应用的大致结构,用户可以根据自己的需求搭建简单或复杂的CRM应用。
23769 1
公开课02期 |基于宜搭的《客户关系管理(CRM)》应用搭建
|
2月前
|
监控 安全 数据安全/隐私保护
教你如何修复硬盘坏道,一文看懂实用方法
电脑变卡、文件打不开、系统崩溃?可能是硬盘坏道所致!本文教你如何判断硬盘是否存在坏道,并提供多种修复方法,包括DiskGenius、CHKDSK及厂商工具等,助你轻松应对逻辑坏道与物理坏道问题。修复前请备份数据、保持供电稳定,若坏道频发,建议及时更换硬盘。了解硬盘保养技巧,延长使用寿命,保障数据安全。
|
JavaScript 前端开发
JS如何配合input框实现模糊搜索
JS如何配合input框实现模糊搜索
327 2
|
12月前
|
前端开发
ThinkPHP6表单上传的数据获取的四种方式【请求对象调用,静态调用,助手函数调用,原生的get|post】
本文介绍了在ThinkPHP6中获取表单上传数据的四种方式:请求对象调用、静态调用(Facade)、助手函数调用以及原生的$_GET和$_POST数组。文章通过示例代码展示了每种方式的具体使用方法,并强调了在使用请求对象调用时引入正确的Request类的重要性。
|
安全 数据库 数据安全/隐私保护
什么是特权账号,如何定义
对特权账号进行简单定义,区别普通账号
298 0
什么是特权账号,如何定义
|
存储 Kubernetes API
apisix~为自定义插件设计一个configmap脚本
Kubernetes ConfigMap*是一种资源对象,用于存储非敏感配置数据,如环境变量和配置文件,解耦配置与应用,支持动态更新。它可以被挂载到Pod中,跨Namespace共享。通过`kubectl create configmap`命令创建。例如,一个apisix插件配置可能包含3个lua文件,通过`kubectl create configmap`命令将它们整合到一个ConfigMap中供apisix使用。ConfigMap不同于Secret,用于存储非敏感信息。
160 0
|
安全 Java 数据安全/隐私保护
Spring Boot中集成LDAP身份认证的步骤
Spring Boot中集成LDAP身份认证的步骤
|
存储 固态存储 API
spdk关于nvme模块的实例helloword代码
spdk关于nvme模块的实例helloword代码
|
存储 数据可视化 数据挖掘
基于SPSS和ArcGIS的地区社会弱势性空间格局分析
基于SPSS和ArcGIS的地区社会弱势性空间格局分析
704 0
|
SQL 关系型数据库 MySQL
MySQL8.0.26—Linux版安装详细教程
MySQL8.0.26—Linux版安装详细教程
2761 1
MySQL8.0.26—Linux版安装详细教程