服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言模拟掷骰子游戏

C语言模拟掷骰子游戏

2022-03-03 14:14小辉_Super C/C++

这篇文章介绍了C语言模拟掷骰子游戏的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。需要的朋友可以收藏下

今天我们写一个有趣的C语言小游戏——掷骰子(zhì tóu zi)

实现原理

大家对骰子应该不陌生,让我们先看看百度词条的介绍:

掷骰子
拼音:zhì tóu zi
骰子: 既色子,用象牙、骨头或塑料等较坚硬物体做的小四方块;每面刻有点数,一到六,常用一对做各种游戏或赌博。
掷骰子:先摇动骰子,然后抛掷使两个骰子都随意停止在一平面上。
——百度百科

掷骰子时,每次能掷出的点数为1~6,且是随机的,那么如何用C语言来产生这一随机数呢?

这时就要用到rand()和srand()函数了:

srand函数是随机数发生器的初始化函数。原型:void srand(unsigned int seed);
srand和rand()配合使用产生伪随机数序列。

 

rand():
原型:int rand(void),
功能:产生随机值,从srand (seed)中指定的seed开始,返回一个[seed, RAND_MAX(0x7fff))间的随机整数。
srand():
原型:void srand(unsigned seed),
参数:seed是rand()的种子,用来初始化rand()的起始值。
功能:可以认为rand()在每次被调用时,它都会查看srand(seed)中指定的seed值,如果存在srand(seed),那么它会自动调用srand(seed)一次来初始化它的起始值。如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。

——百度百科

上面提到了rand()函数只能生成伪随机数,意思是如果起始值seed固定,那么每次程序运行,它产生的随机数序列都是相同的,而不是真正意义上的随机数。形象地说,如果seed值固定,那每次程序运行,第一次掷到的点数都是固定的,这显然不合理,那怎么生成更加合理的随机数呢?

补充:
种子在每次启动计算机时是随机的,但是一旦计算机启动以后它就不再变化了;也就是说,每次启动计算机以后,种子就是定值了,所以根据公式推算出来的结果(也就是生成的随机数)就是固定的。——http://c.biancheng.net/view/2043.html

我们都知道系统的时间值(总秒数)是时刻都在变化着的,如果把时间秒数当做随机数的种子seed,那岂不是能实现真正的随机数?答案是方法可行,但并不能产生真正的随机数,因为时间是递增的,是有规律的数字序列,所以产生的随机数也会呈现一定的规律,但是,此时的随机数已经足够我们用来完成掷骰子游戏了,所以我们也没必要去纠结是否是真正的随机数(可能计算机本来就无法产生真正随机数)。

要想获取系统时间秒数,需要用到time()函数:

time() 是指返回自 Unix 纪元(January 1 1970 00:00:00 GMT)起的当前时间的秒数的函数,主要用来获取当前的系统时间,返回的结果是一个time_t类型。
time_t time(time_t *t);
如果t是空指针,直接返回当前时间。如果t不是空指针,返回当前时间的同时,将返回值赋予t指向的内存空间。
——百度百科

time_t的原型就是long int,这个函数的实现原理我们也没必要去深究,我们只要清楚它能返回秒数就足够了。
程序中,我们可以通过下面的语句初始化随机数种子和产生随机数:

srand((unsigned)time(NULL)); //用系统秒数初始化随机数种子
ret = rand();                //产生随机数,赋值给ret变量

现在生成了随机数,那如何将随机数转换成骰子的呢?

骰子一般都是正方体,有6个面,正面朝上的即为点数,那么它就有6种点数,分别是1~6,我们将刚才生成的随机数对6取余,即可将随机数限定在0~5之间,再加上1,就是我们要的随机点数了:

ret = rand() % 6 + 1;       //ret即为随机点数

源码介绍

原理介绍完了,接下来直接上代码

代码由两个部分构成:

  • 菜单打印:打印功能选择,显示上次投骰子的结果
  • 操作选择:选择掷骰子或退出退出程序
#include <stdio.h> 
#include <stdlib.h>     //srand()/rand()
#include <time.h>       //time()

int main()
{
  char choice = '\0'; //菜单选择
  int ret = 0;
  //用系统秒数初始化随机数种子
  srand((unsigned)time(NULL));
  while(1)
  {      
      /* 1.菜单打印 */
      system("cls");  //清屏--Windows系统
      printf("======================\n");
      printf("|     掷骰子游戏     |\n");
      printf("|  1:掷骰子  0:退出  |\n");
      if(ret)
          printf("|     上轮点数:%d     |\n", ret);
      printf("======================\n");

      /* 2.操作选择 */
      printf("请选择>>>>>>>\n");
      scanf(" %c", &choice);    //输入选择
                                //" %c" 可以吃前面的空格和回车
      while(getchar() != '\n'); //吃掉除choice外其它字符
      ret = 0;                  //初始化点数
      switch(choice)
      {
          case '0': 
          	printf("Goodbye!\n");
  			return 0;   //退出
          //掷骰子(产生1 ~ 6 随机数)
          case '1':
           	ret = rand() % 6 + 1;
              break;
          default: printf("无效选择!\n");
      }
  }
  return 0;
}

效果展示

C语言模拟掷骰子游戏

 

今日练习

题目描述

骰子是一个有六个面的正方体,每个面分别印有1〜6之间的小圆点代表点数。假设这个游戏的规则是:两个人轮流掷骰子6次,并将每次投掷的点数累加起来。点数多者获胜;点数相同则为平局。

要求编写程序模拟这个游戏的过程,并求出玩100盘之后谁是最终的获胜者。

问题分析

思路可以参照前面掷骰子小游戏的实现原理。
实现步骤:两层循环,外层循环100次,内层循环6次,每次都将他们掷骰子的点数进行累加,最后总点数大的即为赢家,如果点数相同,则平局。

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
  int sum_1 = 0, sum_2 = 0;
  int i = 0, j = 0;
  //用系统秒数初始化随机数种子
  srand((unsigned)time(NULL));
  for(i = 0; i < 100; i++)
  {
      for(j = 0; j < 6; j++)
      {
          //获取骰子点数
          sum_1 += rand() % 6 + 1;
          sum_2 += rand() % 6 + 1;
      }
  }
  printf("甲的总点数:%d\n", sum_1);
  printf("乙的总点数:%d\n", sum_2);
  if(sum_1 > sum_2)
      printf("甲获胜!\n");
  else if(sum_1 == sum_2)
      printf("平局...\n");
  else
      printf("乙获胜!\n");
  return 0;
}

运行结果

由于掷骰子点数是随机的,所以获胜者也是随机的。

结果1:

C语言模拟掷骰子游戏

结果2:

C语言模拟掷骰子游戏


把他们掷骰子次数调为1,试了n次之后,终于平局了

C语言模拟掷骰子游戏

原文链接:https://blog.csdn.net/weixin_43772810/article/details/121450441

延伸 · 阅读

精彩推荐
  • C/C++C语言中炫酷的文件操作实例详解

    C语言中炫酷的文件操作实例详解

    内存中的数据都是暂时的,当程序结束时,它们都将丢失,为了永久性的保存大量的数据,C语言提供了对文件的操作,这篇文章主要给大家介绍了关于C语言中文件...

    针眼_6702022-01-24
  • C/C++学习C++编程的必备软件

    学习C++编程的必备软件

    本文给大家分享的是作者在学习使用C++进行编程的时候所用到的一些常用的软件,这里推荐给大家...

    谢恩铭10102021-05-08
  • C/C++C语言实现电脑关机程序

    C语言实现电脑关机程序

    这篇文章主要为大家详细介绍了C语言实现电脑关机程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    xiaocaidayong8482021-08-20
  • C/C++C++之重载 重定义与重写用法详解

    C++之重载 重定义与重写用法详解

    这篇文章主要介绍了C++之重载 重定义与重写用法详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    青山的青6062022-01-04
  • C/C++深入理解goto语句的替代实现方式分析

    深入理解goto语句的替代实现方式分析

    本篇文章是对goto语句的替代实现方式进行了详细的分析介绍,需要的朋友参考下...

    C语言教程网7342020-12-03
  • C/C++详解c语言中的 strcpy和strncpy字符串函数使用

    详解c语言中的 strcpy和strncpy字符串函数使用

    strcpy 和strcnpy函数是字符串复制函数。接下来通过本文给大家介绍c语言中的strcpy和strncpy字符串函数使用,感兴趣的朋友跟随小编要求看看吧...

    spring-go5642021-07-02
  • C/C++c++ 单线程实现同时监听多个端口

    c++ 单线程实现同时监听多个端口

    这篇文章主要介绍了c++ 单线程实现同时监听多个端口的方法,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下...

    源之缘11542021-10-27
  • C/C++C/C++经典实例之模拟计算器示例代码

    C/C++经典实例之模拟计算器示例代码

    最近在看到的一个需求,本以为比较简单,但花了不少时间,所以下面这篇文章主要给大家介绍了关于C/C++经典实例之模拟计算器的相关资料,文中通过示...

    jia150610152021-06-07