揭秘C语言:泊舟的猜数字游戏

简介: 揭秘C语言:泊舟的猜数字游戏

前言:

前面已经讲过c语言的基本结构,我们今天将基于分支与循环设计并完成一个猜数字的小游戏。


一、游戏要求:

游戏要求:

1. 电脑⾃动⽣成一个0~你选择的大小(n)的随机数

2. 玩家猜数字,猜数字的过程中,根据猜测数据的⼤⼩给出⼤了或⼩了的反馈。

3. 玩家一共有log2(n)次机会,在log2(n)次内,猜对就游戏通关,猜错就游戏失败。

4. 游戏失败可以选择执行惩罚措施(60s后电脑关机),若输入我是猪,则取消关机。


二、随机数的生成

猜数字首先需要有一个数字,这个数字由系统进行随机生成


2.1 rand()函数

1.头文件<stdlib.h>

2.C 库函数rand(void) 返回一个范围在 0 到 RAND_MAX 之间的“随机数”。RAND_MAX 是一个常量,它的默认值在不同的实现中会有所不同,但是值至少是 32767。

3.int rand (void);,void表示()内不需要填值,返回值是int类型,也就是生成那个“随机数”


代码如下

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int m = 0;
    scanf("%d", &m);
    int n = rand()%m;//生成随机数0~m
    return 0;
}

但是rand()函数生成的“随机数”是一种伪随机数,是根据一个数值按照某个公式推算出来的,每次生成的结果是一样的,该怎么办呢?

2.3 srand()函数

1.头文件<stdlib.h>

2.C 库函数srand() 播种由函数 rand 使用的随机数发生器。

3. void srand(unsigned int seed),不返回值。


srand()函数能控制rand()函数生成的值, 我们知道了rand()并不是真正的随机数,但是srand()如果参数部分仍是一个确定的值,rand()生成的数仍是伪随机数,这又要怎么处理呢?


我们自然而然想到,我们能不能通过控制srand(),来间接控制rand()呢,开始套娃了呢。


2.3 time()函数

在srand()函数里面我们需要一个随时改变的值,那有什么是时刻都在变的呢?

那就是现在的时间,在c语言里面被称为时间戳!


1.头文件<time.h>


2.C 库函数 time(time_t *seconds) 返回自纪元 Epoch(1970-01-01 00:00:00 UTC)起经过的时间,以秒为单位。如果 seconds 不为空,则返回值也存储在变量 seconds 中。


3.time_t time(time_t *seconds),time_t就是无符号整数。


想要详细了解时间戳以及存在的某种隐患就太过复杂,暂时不用深入了解,只需要会用就可以啦~

1. srand(time(NULL));
2. int n = rand()%m;//生成随机数0~m


三、设计思路

  1. 在开始时自动出现一个简易的菜单,提醒我们做选择。
  2. 玩家选择时,1为开始游戏,0为退出游戏。
  3. 选择了其他的让玩家重新选择。
  4. 至少执行一次让玩家选择是否开始,所以用do while循环。
  5. 设计一个game()函数为执行游戏。
  6. 当一次游戏结束后再让玩家选择是否继续

代码实现如下:

int main()
{
  int chiose = 0;
  start();
  do
  {
    printf("请选择:>");
    scanf("%d", &chiose);
    printf("\n");
    switch (chiose)
    {
    case 1:game();
      printf("是否要继续游玩?(1.是   0.否)\n");
      break;
    case 0:
      printf("退出游戏\n");
      break;
    default:printf("输入错误\n");
    }
  } while (chiose);
 
  return 0;
}


四、菜单

菜单只需要简单的打印出来就行,写一个菜单函数start(),无需返回值。

代码实现如下:

void start()
{
  printf("**************************************************\n");
  printf("*************    1.play   0.exit     *************\n");
  printf("**************************************************\n");
}


五、游戏函数的实现

我们要实现这个游戏函数需要先创建一个随机数:

void game()
{
  int m;
  srand(time(NULL));
  printf("  猜数字游戏\n\n");
  printf("选择范围(0~?):");
  scanf("%d", &m);
  printf("\n");
  int times=log2(m);
  int n = rand()%m;//生成随机数0~m
}

我们给的猜测次数设为以2为底m的对数,log函数的头文件是math.h,既然需要猜,那一次没猜中就要继续猜,知道猜测次数用完,猜对了就跳出循环,没猜对给出提示。

void game()
{
  int guess, i, m;
  srand(time(NULL));
  printf("  猜数字游戏\n\n");
  printf("选择范围(0~?):");
  scanf("%d", &m);
  printf("\n");
  int times=log2(m);
  int n = rand()%m;//生成随机数0~m
  int a = times;
 
  for (i = 0;i < times;i++)
  {
    printf("猜一个数字:\n");
    scanf("%d",&guess);
    if (guess > n)
    {
      
      printf("猜大了\n");
      a--;
      printf("剩余%d次机会\n\n",a);
    }
    else if (guess < n)
    {
      printf("猜小了\n");
      a--;
      printf("剩余%d次机会\n\n",a);
    }else
    {
      printf("猜对了\n\n");
      break;
    }
  }
}

出循环之后如果i==times,那就说明循环执行完了也没有猜对:

1. if (i == times)
2.  {
3.    printf("连续猜错%d次,游戏失败!\n", times);
4.    printf("正确答案为:%d\n\n", n);
5.  }

游戏函数的大体代码就完成了。

六、清屏代码和停顿代码(美化界面)

我们完成了一次游戏开始下一次没有清除之前的代码,会让界面看起来多些很没有必要的东西。

为了让界面看起来更美观,我们可以使用下面的代码

system("cls");

这个函数用于执行外部命令,这句代码用于对控制台面板进行清屏,在合适的地方加上能让游戏运行时界面更加美观,它的头文件是stdlib

有的时候我们需要程序暂停一段时间,让我们的视觉有一定的反应时间,达到美化显示页面的效果。

sleep(500);

单位是毫秒。

 

七、完整代码

我的代码没有加入惩罚,你可以自行加入,例如关机代码。

也可以自行加入一些打印出中文提示语句,以及计分功能,倒数次数等功能,可以自由发挥。

#include<stdio.h>
#include <stdlib.h>  
#include <time.h>  
#include<windows.h>
#include<math.h>
 
int point = 0;
int j = 0;
 
void start()
{
  printf("**************************************************\n");
  printf("*************    1.play   0.exit     *************\n");
  printf("**************************************************\n");
}
 
void game()
{
  system("cls");
  int guess, i, m;
  srand(time(NULL));
  printf("  猜数字游戏\n\n");
  printf("选择范围(0~?):");
  scanf("%d", &m);
  printf("\n");
  int times=log2(m);
  int n = rand()%m;//生成随机数0~m
  int a = times;
  j++;
 
  for (i = 0;i < times;i++)
  {
    printf("猜一个数字:\n");
    scanf("%d",&guess);
    if (guess > n)
    {
      
      printf("猜大了\n");
      a--;
      printf("剩余%d次机会\n\n",a);
      Sleep(500);
    }
    else if (guess < n)
    {
      printf("猜小了\n");
      a--;
      printf("剩余%d次机会\n\n",a);
      Sleep(500);
    }else
    {
      printf("猜对了\n\n");
      point++;
      break;
    }
  }
  if (i == times)
  {
    printf("连续猜错%d次,游戏失败!\n", times);
    printf("正确答案为:%d\n\n", n);
    Sleep(1000);//停顿
  }
}
 
int main()
{
  int chiose = 0;
  start();
  do
  {
    printf("请选择:>");
    scanf("%d", &chiose);
    printf("\n");
    switch (chiose)
    {
    case 1:game();
      printf("是否要继续游玩?(1.是   0.否)\n");
      break;
    case 0:system("cls");
      printf("退出游戏\n");
      printf("你总共参加了%d局游戏,获得的分数为%d\n", j, point);
      break;
    default:;printf("输入错误\n");
    }
  } while (chiose);
 
  return 0;
}
相关文章
|
2月前
|
机器学习/深度学习 C语言
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
【8月更文挑战第5天】本篇文章用C语言采用多文件编写实现了一个基础的扫雷游戏(附源码),并讲解了关于函数递归的基础概念及其相对应的习题练习(附源码)
37 1
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
|
3月前
|
存储 C语言 开发者
C语言实战 | Flappy Bird游戏
【7月更文挑战第4天】Flappy Bird是由越南开发者制作的简单却极具挑战性的游戏,玩家需控制小鸟穿越水管障碍。游戏涉及角色初始化、显示和更新。小鸟和水管结构体存储数据,使用变量和数组。初始化小鸟和水管,显示背景、小鸟和水管,更新小鸟位置及碰撞检测。代码示例展示了小鸟和水管的状态管理,当小鸟与管道碰撞或触地时,游戏结束。游戏的成功在于其独特的虐心体验。
60 0
C语言实战 | Flappy Bird游戏
|
7天前
|
C语言 开发者
C语言实现猜数字小游戏(详细教程)
C语言实现猜数字小游戏(详细教程)
|
7天前
|
存储 算法 安全
C语言实现扫雷游戏
C语言实现扫雷游戏
|
8天前
|
算法 编译器 C语言
【C语言】实现猜数字游戏(分支语句与循环语句的运用)
【C语言】实现猜数字游戏(分支语句与循环语句的运用)
|
2天前
|
C语言
C语言扫雷游戏(详解)
C语言扫雷游戏(详解)
13 0
|
6天前
|
程序员 C语言
初识C语言之三子棋游戏
初识C语言之三子棋游戏
20 0
|
6天前
|
C语言
初识C语言3——函数(以猜数字游戏为例)
初识C语言3——函数(以猜数字游戏为例)
33 0
|
8天前
|
存储 编译器 C语言
【C语言篇】数组和函数的实践:扫雷游戏(附源码)
【C语言篇】数组和函数的实践:扫雷游戏(附源码)
20 0
|
2月前
|
算法 编译器 C语言
【C语言篇】猜数字游戏(赋源码)
rand函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的⼤⼩是依赖编译器上实现的,但是⼤部分编译器上是32767。
76 1