欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C/C++實(shí)現(xiàn)投骰子游戲

 更新時(shí)間:2020年11月17日 17:18:26   作者:tsz danger  
這篇文章主要為大家詳細(xì)介紹了C/C++實(shí)現(xiàn)投骰子游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

我們將要模擬一個(gè)非常流行的游戲——擲骰子。

骰子的形式多種多樣, 最普遍的是使用兩個(gè)6面骰子。在一些冒險(xiǎn)游戲中,會(huì)使用5種骰子:4面、6 面、8面、12面和20面。聰明的古希臘人證明了只有5種正多面體,它們的所 有面都具有相同的形狀和大小。各種不同類(lèi)型的骰子就是根據(jù)這些正多面體 發(fā)展而來(lái)。也可以做成其他面數(shù)的,但是其所有的面不會(huì)都相等,因此各個(gè) 面朝上的幾率就不同。
計(jì)算機(jī)計(jì)算不用考慮幾何的限制,所以可以設(shè)計(jì)任意面數(shù)的電子骰子。 我們先從6面開(kāi)始。
我們想獲得1~6的隨機(jī)數(shù)。然而,rand()生成的隨機(jī)數(shù)在0~ RAND_MAX之間。RAND_MAX被定義在stdlib.h中,其值通常是 INT_MAX。因此,需要進(jìn)行一些調(diào)整,方法如下。

1.把隨機(jī)數(shù)求模6,獲得的整數(shù)在0~5之間。
2.結(jié)果加1,新值在1~6之間。
3.為方便以后擴(kuò)展,把第1步中的數(shù)字6替換成骰子面數(shù)。

下面的代碼實(shí)現(xiàn)了這3個(gè)步驟:

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

}

我們還想用一個(gè)函數(shù)提示用戶選擇任意面數(shù)的骰子,并返回點(diǎn)數(shù)總和。

/* diceroll.c -- 擲骰子模擬程序 */
/* 與 mandydice.c 一起編譯 */
#include "diceroll.h"
#include <stdio.h>
#include <stdlib.h>      /* 提供庫(kù)函數(shù) rand()的原型 */
int roll_count = 0;      /* 外部鏈接 */
static int rollem(int sides)  /* 該函數(shù)屬于該文件私有 */
{
int roll;
roll = rand() % sides + 1;
++roll_count;       /* 計(jì)算函數(shù)調(diào)用次數(shù) */
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()函數(shù)屬于該文件私有,它是 roll_n_dice()的輔助函數(shù)。第二,為了演示外部鏈接的特性,該文件聲明了 一個(gè)外部變量roll_count。該變量統(tǒng)計(jì)調(diào)用rollem()函數(shù)的次數(shù)。這樣設(shè)計(jì)有 點(diǎn)蹩腳,僅為了演示外部變量的特性。第三,該文件包含以下預(yù)處理指令:

#include "diceroll.h"

如果使用標(biāo)準(zhǔn)庫(kù)函數(shù),如 rand(),要在當(dāng)前文件中包含標(biāo)準(zhǔn)頭文件(對(duì) rand()而言要包含stdlib.h),而不是聲明該函數(shù)。因?yàn)轭^文件中已經(jīng)包含了 正確的函數(shù)原型。我們效仿這一做法,把roll_n_dice()函數(shù)的原型放在 diceroll.h頭文件中。把文件名放在雙引號(hào)中而不是尖括號(hào)中,指示編譯器在 本地查找文件,而不是到編譯器存放標(biāo)準(zhǔn)頭文件的位置去查找文件。“本地 查找”的含義取決于具體的實(shí)現(xiàn)。一些常見(jiàn)的實(shí)現(xiàn)把頭文件與源代碼文件或 工程文件(如果編譯器使用它們的話)放在相同的目錄或文件夾中。

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

該頭文件中包含一個(gè)函數(shù)原型和一個(gè) extern 聲明。由于 direroll.c 文件 包含了該文件, direroll.c實(shí)際上包含了roll_count的兩個(gè)聲明:

extern int roll_count;   // 頭文件中的聲明(引用式聲明)
int roll_count = 0;     // 源代碼文件中的聲明(定義式聲明)

這樣做沒(méi)問(wèn)題。一個(gè)變量只能有一個(gè)定義式聲明,但是帶 extern 的聲明 是引用式聲明,可以有多個(gè)引用式聲明。
使用 roll_n_dice()函數(shù)的程序都要包含 diceroll.c 頭文件。包含該頭文件 后,程序便可使用roll_n_dice()函數(shù)和roll_count變量。

/* manydice.c -- 多次擲骰子的模擬程序 */
/* 與 diceroll.c 一起編譯*/
#include <stdio.h>
#include <stdlib.h>    /* 為庫(kù)函數(shù) 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)); /* 隨機(jī)種子 */
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;       /* 退出循環(huán) */
else
{
printf("You should have entered an integer.");
printf(" Let's begin again.\n");
while (getchar() != '\n')
continue;   /* 處理錯(cuò)誤的輸入 */
printf("How many sides? Enter 0 to stop.\n");
continue;       /* 進(jìn)入循環(huán)的下一輪迭代 */
}
}
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都放在同一文件夾或目錄中。運(yùn)行該程序,下面是一個(gè) 輸出示例:

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!

因?yàn)樵摮绦蚴褂昧藄rand()隨機(jī)生成隨機(jī)數(shù)種子,所以大多數(shù)情況下,即 使輸入相同也很難得到相同的輸出。注意,manydice.c中的main()訪問(wèn)了定 義在diceroll.c中的roll_count變量。

有3種情況可以導(dǎo)致外層while循環(huán)結(jié)束:side小于1、輸入類(lèi)型不匹配 (此時(shí)scanf()返回0)、遇到文件結(jié)尾(返回值是EOF)。為了讀取骰子的 點(diǎn)數(shù),該程序處理文件結(jié)尾的方式(退出while循環(huán))與處理類(lèi)型不匹配 (進(jìn)入循環(huán)的下一輪迭代)的情況不同。

可以通過(guò)多種方式使用roll_n_dice()。sides等于2時(shí),程序模仿擲硬 幣,“正面朝上”為2,“反面朝上”為1(或者反過(guò)來(lái)表示也行)。很容易修改 該程序單獨(dú)顯示點(diǎn)數(shù)的結(jié)果,或者構(gòu)建一個(gè)骰子模擬器。如果要擲多次骰子 (如在一些角色扮演類(lèi)游戲中),可以很容易地修改程序以輸出類(lèi)似的結(jié) 果:

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())還可以用來(lái)創(chuàng)建一個(gè)猜數(shù)字程序,讓 計(jì)算機(jī)選定一個(gè)數(shù)字,你來(lái)猜。讀者感興趣的話可以自己編寫(xiě)這個(gè)程序。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 輸入一個(gè)字符串,取出其中的整數(shù)(實(shí)現(xiàn)代碼)

    輸入一個(gè)字符串,取出其中的整數(shù)(實(shí)現(xiàn)代碼)

    輸入一個(gè)字符串,內(nèi)含所有數(shù)字和非數(shù)字字符。將其中連續(xù)的數(shù)字作為一個(gè)整數(shù),依次存放到一個(gè)數(shù)組中,統(tǒng)計(jì)共有多少個(gè)整數(shù),并輸出這些數(shù)
    2013-09-09
  • VC運(yùn)用OPENGL加載BMP紋理圖的實(shí)現(xiàn)方法匯總

    VC運(yùn)用OPENGL加載BMP紋理圖的實(shí)現(xiàn)方法匯總

    這篇文章主要介紹了VC運(yùn)用OPENGL加載BMP紋理圖的實(shí)現(xiàn)方法,對(duì)于更好的了解OpenGL很有幫助,需要的朋友可以參考下
    2014-07-07
  • 對(duì)比C語(yǔ)言中g(shù)etc()函數(shù)和ungetc()函數(shù)的使用

    對(duì)比C語(yǔ)言中g(shù)etc()函數(shù)和ungetc()函數(shù)的使用

    這篇文章主要介紹了對(duì)比C語(yǔ)言中g(shù)etc()函數(shù)和ungetc()函數(shù)的使用,是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08
  • c語(yǔ)言實(shí)現(xiàn)MD5算法的項(xiàng)目實(shí)踐

    c語(yǔ)言實(shí)現(xiàn)MD5算法的項(xiàng)目實(shí)踐

    MD5用于確保信息傳輸完整一致,是計(jì)算機(jī)廣泛使用的雜湊算法之一,本文主要介紹了c語(yǔ)言實(shí)現(xiàn)MD5算法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • 淺談C++標(biāo)準(zhǔn)庫(kù)

    淺談C++標(biāo)準(zhǔn)庫(kù)

    C++標(biāo)準(zhǔn)庫(kù)是一組C++模板類(lèi),提供了通用的編程數(shù)據(jù)結(jié)構(gòu)和函數(shù),本文簡(jiǎn)單講解C++標(biāo)準(zhǔn)庫(kù)包含的一些內(nèi)容,可能會(huì)對(duì)小伙伴的學(xué)習(xí)或工作有一定的幫助,大家一起來(lái)看看吧
    2021-08-08
  • C++實(shí)現(xiàn)LeetCode(210.課程清單之二)

    C++實(shí)現(xiàn)LeetCode(210.課程清單之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(210.課程清單之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 基于C語(yǔ)言實(shí)現(xiàn)的掃雷游戲代碼

    基于C語(yǔ)言實(shí)現(xiàn)的掃雷游戲代碼

    這篇文章主要介紹了基于C語(yǔ)言實(shí)現(xiàn)的掃雷游戲代碼,對(duì)于學(xué)習(xí)游戲開(kāi)發(fā)的朋友有一定的借鑒價(jià)值,需要的朋友可以參考下
    2014-08-08
  • C++歸并排序算法詳解

    C++歸并排序算法詳解

    大家好,本篇文章主要講的是C++歸并排序算法詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C++實(shí)現(xiàn)LeetCode(199.二叉樹(shù)的右側(cè)視圖)

    C++實(shí)現(xiàn)LeetCode(199.二叉樹(shù)的右側(cè)視圖)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(199.二叉樹(shù)的右側(cè)視圖),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++冒泡排序及其優(yōu)化算法

    C++冒泡排序及其優(yōu)化算法

    這篇文章主要為大家介紹了C++冒泡排序及其優(yōu)化算法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-11-11

最新評(píng)論