C/C++实现投骰子游戏

我们将要模拟一个非常流行的游戏——掷骰子。

骰子的形式多种多样, 最普遍的是使用两个6面骰子。在一些冒险游戏中,会使用5种骰子:4面、6 面、8面、12面和20面。聪明的古希腊人证明了只有5种正多面体,它们的所 有面都具有相同的形状和大小。各种不同类型的骰子就是根据这些正多面体 发展而来。也可以做成其他面数的,但是其所有的面不会都相等,因此各个 面朝上的几率就不同。
计算机计算不用考虑几何的限制,所以可以设计任意面数的电子骰子。 我们先从6面开始。
我们想获得1~6的随机数。然而,rand()生成的随机数在0~ RAND_MAX之间。RAND_MAX被定义在stdlib.h中,其值通常是 INT_MAX。因此,需要进行一些调整,方法如下。

1.把随机数求模6,获得的整数在0~5之间。
2.结果加1,新值在1~6之间。
3.为方便以后扩展,把第1步中的数字6替换成骰子面数。

下面的代码实现了这3个步骤:

#include <stdlib.h> /* 提供rand()的原型 */
int rollem(int sides)
{
int roll;
roll = rand() % sides + 1;
return roll;

}

我们还想用一个函数提示用户选择任意面数的骰子,并返回点数总和。

/* diceroll.c -- 掷骰子模拟程序 */
/* 与 mandydice.c 一起编译 */
#include "diceroll.h"
#include <stdio.h>
#include <stdlib.h>      /* 提供库函数 rand()的原型 */
int roll_count = 0;      /* 外部链接 */
static int rollem(int sides)  /* 该函数属于该文件私有 */
{
int roll;
roll = rand() % sides + 1;
++roll_count;       /* 计算函数调用次数 */
return roll;
}
int roll_n_dice(int dice, int sides)
{
int d;
int total = 0;
if (sides < 2)
{
printf("Need at least 2 sides.\n");
return -2;
}
if (dice < 1)
{
printf("Need at least 1 die.\n");
return -1;
}
for (d = 0; d < dice; d++)
total += rollem(sides);
return total;
}

该文件加入了新元素。第一,rollem()函数属于该文件私有,它是 roll_n_dice()的辅助函数。第二,为了演示外部链接的特性,该文件声明了 一个外部变量roll_count。该变量统计调用rollem()函数的次数。这样设计有 点蹩脚,仅为了演示外部变量的特性。第三,该文件包含以下预处理指令:

#include "diceroll.h"

如果使用标准库函数,如 rand(),要在当前文件中包含标准头文件(对 rand()而言要包含stdlib.h),而不是声明该函数。因为头文件中已经包含了 正确的函数原型。我们效仿这一做法,把roll_n_dice()函数的原型放在 diceroll.h头文件中。把文件名放在双引号中而不是尖括号中,指示编译器在 本地查找文件,而不是到编译器存放标准头文件的位置去查找文件。“本地 查找”的含义取决于具体的实现。一些常见的实现把头文件与源代码文件或 工程文件(如果编译器使用它们的话)放在相同的目录或文件夹中。

//diceroll.h
extern int roll_count;
int roll_n_dice(int dice, int sides);

该头文件中包含一个函数原型和一个 extern 声明。由于 direroll.c 文件 包含了该文件, direroll.c实际上包含了roll_count的两个声明:

extern int roll_count;   // 头文件中的声明(引用式声明)
int roll_count = 0;     // 源代码文件中的声明(定义式声明)

这样做没问题。一个变量只能有一个定义式声明,但是带 extern 的声明 是引用式声明,可以有多个引用式声明。
使用 roll_n_dice()函数的程序都要包含 diceroll.c 头文件。包含该头文件 后,程序便可使用roll_n_dice()函数和roll_count变量。

/* manydice.c -- 多次掷骰子的模拟程序 */
/* 与 diceroll.c 一起编译*/
#include <stdio.h>
#include <stdlib.h>    /* 为库函数 srand() 提供原型 */
#include <time.h>     /* 为 time() 提供原型      */
#include "diceroll.h"   /* 为roll_n_dice()提供原型,为roll_count变量 提供声明 */
int main(void)
{
int dice, roll;
int sides;
int status;
srand((unsigned int) time(0)); /* 随机种子 */
printf("Enter the number of sides per die, 0 to stop.\n");
while (scanf("%d", &sides) == 1 && sides > 0)
{
printf("How many dice?\n");
if ((status = scanf("%d", &dice)) != 1)
{
905
if (status == EOF)
break;       /* 退出循环 */
else
{
printf("You should have entered an integer.");
printf(" Let's begin again.\n");
while (getchar() != '\n')
continue;   /* 处理错误的输入 */
printf("How many sides? Enter 0 to stop.\n");
continue;       /* 进入循环的下一轮迭代 */
}
}
roll = roll_n_dice(dice, sides);
printf("You have rolled a %d using %d %d-sided dice.\n",
roll, dice, sides);
printf("How many sides? Enter 0 to stop.\n");
}
printf("The rollem() function was called %d times.\n",
roll_count);     /* 使用外部变量 */
906
printf("GOOD FORTUNE TO YOU!\n");
return 0;
}

要与包含程序清单12.11的文件一起编译该文件。可以把程序清单 12.11、12.12和12.13都放在同一文件夹或目录中。运行该程序,下面是一个 输出示例:

Enter the number of sides per die, 0 to stop.
6
How many dice?
2
You have rolled a 12 using 2 6-sided dice.
How many sides? Enter 0 to stop.
6
How many dice?
2
You have rolled a 4 using 2 6-sided dice.
How many sides? Enter 0 to stop.
6
How many dice?
2
907
You have rolled a 5 using 2 6-sided dice.
How many sides? Enter 0 to stop.
0
The rollem() function was called 6 times.
GOOD FORTUNE TO YOU!

因为该程序使用了srand()随机生成随机数种子,所以大多数情况下,即 使输入相同也很难得到相同的输出。注意,manydice.c中的main()访问了定 义在diceroll.c中的roll_count变量。

有3种情况可以导致外层while循环结束:side小于1、输入类型不匹配 (此时scanf()返回0)、遇到文件结尾(返回值是EOF)。为了读取骰子的 点数,该程序处理文件结尾的方式(退出while循环)与处理类型不匹配 (进入循环的下一轮迭代)的情况不同。

可以通过多种方式使用roll_n_dice()。sides等于2时,程序模仿掷硬 币,“正面朝上”为2,“反面朝上”为1(或者反过来表示也行)。很容易修改 该程序单独显示点数的结果,或者构建一个骰子模拟器。如果要掷多次骰子 (如在一些角色扮演类游戏中),可以很容易地修改程序以输出类似的结 果:

Enter the number of sets; enter q to stop.
18
How many sides and how many dice?
6 3
Here are 18 sets of 3 6-sided throws.
908
12 10 6 9 8 14 8 15 9 14 12 17 11 7 10
13 8 14
How many sets? Enter q to stop.
q

rand1()或 rand()(不是 rollem())还可以用来创建一个猜数字程序,让 计算机选定一个数字,你来猜。读者感兴趣的话可以自己编写这个程序。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++实现N个骰子的点数算法

    本文实例讲述了C++实现N个骰子的点数算法,分享给大家供大家参考之用.具体方法如下: 题目要求:把n个骰子仍在地上,所有点数 实现代码如下: #include <iostream> using namespace std; const int g_maxValue = 6; const int number = 6; int array[(number - 1) * g_maxValue + 1]; void probility(int original, int current, int s

  • 使用C语言求解扑克牌的顺子及n个骰子的点数问题

    扑克牌的顺子     问题描述:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的.2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字.          思路:可以将这5张牌排个序,然后统计出0的个数以及非0数字之间的间隔数,如果出现重复的非0数字,那么不是顺子.如果间隔数小于等于0的个数,那么是顺子.暂时未想到更好的办法.          参考代码: //函数功能 : 从扑克牌中随机抽5张牌,判断是不是一个顺子 //函数参数 : pCards

  • C/C++实现投骰子游戏

    我们将要模拟一个非常流行的游戏--掷骰子. 骰子的形式多种多样, 最普遍的是使用两个6面骰子.在一些冒险游戏中,会使用5种骰子:4面.6 面.8面.12面和20面.聪明的古希腊人证明了只有5种正多面体,它们的所 有面都具有相同的形状和大小.各种不同类型的骰子就是根据这些正多面体 发展而来.也可以做成其他面数的,但是其所有的面不会都相等,因此各个 面朝上的几率就不同. 计算机计算不用考虑几何的限制,所以可以设计任意面数的电子骰子. 我们先从6面开始. 我们想获得1-6的随机数.然而,rand()生

  • C++实现投骰子的随机游戏

    本文实例为大家分享了C++实现投骰子的随机游戏的具体代码,供大家参考,具体内容如下 每个骰子有六面,点数分别为1.2.3.4.5.6.游戏者在程序开始时输入一个无符号整数,作为产生随机数的种子. 每轮投两次骰子,第一轮如果和数为7或11则为胜,游戏结束:和数为2.3或12则为负,游戏结束:和数为其它值则将此值作为自己的点数,继续第二轮.第三轮…直到某轮的和数等于点数则取胜,若在此前出现和数为7则为负. rand函数 函数原型:int rand(void):所需头文件:功能和返回值:求出并返回一个

  • C语言模拟掷骰子游戏

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

  • 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,

  • 使用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

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

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

  • 微信小程序实现简单的摇骰子游戏

    本文实例为大家分享了微信小程序实现摇骰子游戏的具体代码,供大家参考,具体内容如下 页面代码 <view class='top'>{{txt}}</view> <view class='point1'> <image src='{{one_img}}'></image> </view> <view class='point2'> <image src='{{two_img}}'></image> &l

  • 基于JavaScript制作一个骰子游戏

    目录 知识点 HTML 部分 CSS 部分 JavaScript 部分 总结 游戏可以通过这个链接进入 完整源码我已经放在GitHub上了 这节实验我们将使用 HTML.CSS 和 JavaScript 构建一个骰子游戏.设置两名玩家(一个人玩也行)然后掷骰子,获得更高点数的玩家将赢得游戏. 知识点 :hover 选择器 querySelector() 方法 setAttribute() 方法 骰子 1-6 点的图片都放在这里了,大家可以将这些图片保存在本地的文件夹中然后用相对地址引用,或者也可

  • Android实现微信摇骰子游戏

    过年怎么可以不玩红包娱乐一下呢,微信里的摇骰子大小和石头剪刀布就是不错的游戏方式. 使用Java的Random函数很容易实现,以骰子为例: 1.骰子摇动的动画,使用animation-list帧动画实现 2.生成1~6的随机数,1 + new Random().nextInt(6) 以下是代码实现,文末提供图片资源下载: package com.zms.dicedemo; import java.util.Random; import android.app.Activity; import a

随机推荐