C语言模拟掷骰子游戏

目录
  • 实现掷骰子小游戏
    • 实现原理
    • 源码介绍
    • 效果展示
  • 今日练习
    • 题目描述
    • 问题分析
    • 代码实现
    • 运行结果

实现掷骰子小游戏

在开始今天的练习前,我先写一个有趣的C语言小游戏——掷骰子(zhì tóu zi)

实现原理

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

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

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

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

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

rand()
原型:int rand(void)
功能:产生随机值,从srand (seed)中指定的seed开始,返回一个[seed, RAND_MAX(0x7fff))间的随机整数。

srand():
原型:void srand(unsigned seed)
参数:seedrand()的种子,用来初始化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;
}

效果展示

今日练习

题目描述

骰子是一个有六个面的正方体,每个面分别印有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:

结果2:



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

(0)

相关推荐

  • C语言实现简单猜数字小游戏

    本文实例为大家分享了Java实现图片旋转的具体代码,供大家参考,具体内容如下 猜数字游戏是令游戏机随机产生一个100以内的正整数 用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较 并提示大了("Too big"),还是小了("Too small"),相等表示猜到了 如果猜到,则结束程序.程序还要求统计猜的次数,如果1次猜出该数,提示"Bingo!" 如果3次以内猜到该数,则提示"Lucky You!"

  • C语言实现三子棋游戏含完整代码

    目录 一.text.c源文件部分 1.main函数部分 2.game函数部分 二.game.h头文件部分 三.game.c源文件部分 运行  三子棋是大家小时候和同桌在纸上都玩过的简单小游戏,这个游戏我们在c语言中就可以实现. 在这篇文章我推荐大家使用vs2013,vs2019,vs2022等的编译器.部分学校使用的vc6.0以及Devc++.前者是1998年推出的c语言编译器,在现在的win10或者win11的系统中并不兼容,可能会出现一些问题,后者也在2015年停更,这两款祖传c语言编译器并

  • C语言实现扫雷游戏小项目

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 一.基本实现功能 1.建立一个游戏菜单 2.创建游戏盘,一个埋雷,一个显示. 3.打印游戏盘. 4.翻开坐标如若没踩到雷显示周围一圈8个有几个雷. 5.判断胜利 翻开的格子数等于没埋雷的个数. 二.源代码展示 1.头文件  minesweep.h #pragma once #include <stdio.h> #include <Windows.h> #include <string.h> #i

  • 用C语言完整实现2048游戏

    目录 前言 一.游戏思路 二.游戏框架 1.菜单界面 2.游戏主体 1.初始化界面: 2.随机生成初始数字 3.实现移动 4.增加新数字 5.判定胜负 6.游戏函数 三.游戏运行 四.所有代码 总结 前言 游戏规则:游戏开始,在4x4的棋盘上随机两个方块出现数字2,通过方向键控制所有方块向同一个方向移动,两个相同数字方块撞在一起之后合并成为他们的和.每次移动,棋盘上还会在一个随机位置增加一个数字2或者数字4,当最终得到一个"2048"的方块就算胜利了. 简单吧?简单--个鬼啊,我以前玩

  • C语言模拟掷骰子游戏

    目录 实现掷骰子小游戏 实现原理 源码介绍 效果展示 今日练习 题目描述 问题分析 代码实现 运行结果 实现掷骰子小游戏 在开始今天的练习前,我先写一个有趣的C语言小游戏--掷骰子(zhì tóu zi) 实现原理 大家对骰子应该不陌生,让我们先看看百度词条的介绍: 掷骰子 拼音:zhì tóu zi 骰子: 既色子,用象牙.骨头或塑料等较坚硬物体做的小四方块:每面刻有点数,一到六,常用一对做各种游戏或赌博. 掷骰子:先摇动骰子,然后抛掷使两个骰子都随意停止在一平面上. --百度百科 掷骰子时,

  • Python使用random模块实现掷骰子游戏的示例代码

    引入内容 根据人民邮电出版社出版的<Python程序设计现代设计方法>P102习题中的第7题--掷骰子游戏,进行代码编写. 题目要求 一盘游戏中,两人轮流掷骰子5次,并将每次掷出的点数累加,5局之后,累计点数较大者获胜,点数相同则为平局.根据此规则实现掷骰子游戏,并算出50盘之后的胜利者( 50盘中嬴得盘数最多的,即最终胜利者). 审题: 共有50盘游戏.一盘游戏有5局,每一局双方各掷骰子一次,5局结束以后统计分数,分数高的一方获胜.至此,一盘游戏结束.50盘游戏结束后,赢得盘数最多的一方为最

  • Java编写掷骰子游戏

    废话不多说了,直接奔主题. **多线程&&观察者模式 题目要求:<掷骰子>窗体小游戏,在该游戏中,玩家初始拥有1000的金钱,每次输入押大还是押小,以及下注金额,随机3个骰子的点数,如果3个骰子的总点数小于等于9,则开小,否则开大,然后判断玩家是否押对,如果未押对则扣除下注金额,如果押对则奖励和玩家下注金额相同的金钱. 分析:这个题目要求灵活运用多线程的相关知识,达到点击开始按钮时,有3个线程启动,分别控制3颗骰子的转动,在3颗骰子全部转完以后,回到主线程计算游戏结果. //个

  • Java实现的简单掷骰子游戏示例

    本文实例讲述了Java实现的简单掷骰子游戏.分享给大家供大家参考,具体如下: 要求: 掷两个骰子,每个骰子有六面, 分别为1.2.3.4.5.6.检查这两个骰子的和. 如果为2.3或12你就输了:如果和是7或者11你就赢了. 但如果和是其他数字(例如4.5.6.8.9或者10), 就确定了一个点.继续掷骰子直至抛出一个7或者 掷出和刚才相同的点数.如果掷出的是7,你就输了. 如果掷出的点数和你前一次掷出的点数相同, 你就赢了. java实现代码: enum Status { Win, Lose,

  • Python 使用matplotlib模块模拟掷骰子

    掷骰子 骰子类 # die.py 骰子类模块 from random import randint class Die(): """骰子类""" def __init__(self, num_sides=6): """默认六面的骰子""" self.num_sides = num_sides def roll(self): """掷骰子的方法"&q

  • 使用jQuery实现掷骰子游戏

    本文实例为大家分享了jQuery实现掷骰子游戏的具体代码,供大家参考,具体内容如下 直接新建一个html页面,需要在head中引入jquery,js,一些css代码以及js代码,如下: <script type="text/javascript" src="jquery-1.8.3.min.js"></script> <style type=text/css > .wrap{width:90px; height:90px; mar

  • Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)

    使用Python可视化Pygal包来生成可缩放的矢量图形文件! 对于在尺寸不同的屏幕上显示图标,它们将自动缩放以适合观看者的屏幕,如果以在线的方式使用图标,建议使用Pygal来生成,这样在任何设备上显示都会很美观!!! 1.安装Pygal 安装Pygal有好几种办法这边简略带过!!! 介绍一种在pycharm中直接安装的方法! 1.在File文件中打开Settings 2.找到Project:untitled打开Projiect lnterpreter右上方的+号 3.输入我们要安装的Pygal

  • Python Tkinter实例——模拟掷骰子

    什么是Tkinter? Tkinter 是 Python 的标准 GUI 库.Python 使用 Tkinter 可以快速的创建 GUI 应用程序. 由于 Tkinter 是内置到 python 的安装包中.只要安装好 Python 之后就能 import Tkinter 库.适合初学者入门.小型应用的开发 .简单的代价就是功能薄弱了,有相当多的需求需要依赖其他的库.不像PyQT.wxPython这些功能强大的框架. 需要导入的模块 Tkinter:建立图形界面 Random:生成随机数 Ima

  • python数据可视化pygal模拟掷骰子实现示例

    目录 可视化包Pygal生成可缩放矢量图形文件 分析结果,计算每个点数出现的次数 绘制直方图 同时投掷两个骰子 同时投掷两个面数不同骰子 可视化包Pygal生成可缩放矢量图形文件 可以在尺寸不同的屏幕上自动缩放,显示图表 #安装pygal pip install pygal ''' 想要了解Pygal可生成什么样的图表,可访问http://www.pygal.org/ 单击document,点击chart types,每个示例都包含源代码 ''' from random import randi

  • C语言模拟实现扫雷游戏

    扫雷是Windows系统的经典游戏,下文将利用c语言实现这个经典的小游戏.本版本程序添加了炸弹标记功能.但由于作者水平实现较为死板,此处留坑待以后学习后改进. Part 1主函数部分: 此部分主要提供用户界面,不同程序均可利用: int main() { srand((unsigned int)time(NULL)); int input = 0; do { menu(); printf("请选择:>\n"); scanf("%d", &input);

随机推荐