成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

C語言每日一練——第61天:擲骰子游戲

whlong / 3787人閱讀

摘要:原型和配合使用產(chǎn)生偽隨機(jī)數(shù)序列。問題分析思路可以參照前面擲骰子小游戲的實現(xiàn)原理。

C語言每日一練
2021年11月21日

實現(xiàn)擲骰子小游戲

在開始今天的練習(xí)前,我先寫一個有趣的C語言小游戲——擲骰子(zhì tóu zi)

實現(xiàn)原理

大家對骰子應(yīng)該不陌生,讓我們先看看百度詞條的介紹:

擲骰子
拼音:zhì tóu zi
骰子: 既色子,用象牙、骨頭或塑料等較堅硬物體做的小四方塊;每面刻有點(diǎn)數(shù),一到六,常用一對做各種游戲或賭博。
擲骰子:先搖動骰子,然后拋擲使兩個骰子都隨意停止在一平面上。
——百度百科

擲骰子時,每次能擲出的點(diǎn)數(shù)為1~6,且是隨機(jī)的,那么如何用C語言來產(chǎn)生這一隨機(jī)數(shù)呢?

這時就要用到rand()srand()函數(shù)了:

srand函數(shù)是隨機(jī)數(shù)發(fā)生器的初始化函數(shù)。原型:void srand(unsigned int seed);
srandrand()配合使用產(chǎn)生偽隨機(jī)數(shù)序列。

  1. rand()
    原型:int rand(void)
    功能:產(chǎn)生隨機(jī)值,從srand (seed)中指定的seed開始,返回一個[seed, RAND_MAX(0x7fff))間的隨機(jī)整數(shù)。
  2. srand()
    原型:void srand(unsigned seed),
    參數(shù):seedrand()的種子,用來初始化rand()的起始值。
    功能:可以認(rèn)為rand()在每次被調(diào)用時,它都會查看srand(seed)中指定的seed值,如果存在srand(seed),那么它會自動調(diào)用srand(seed)一次來初始化它的起始值。如果用戶在此之前沒有調(diào)用過srand(seed),它會自動調(diào)用srand(1)一次。

——百度百科

上面提到了rand()函數(shù)只能生成偽隨機(jī)數(shù),意思是如果起始值seed固定,那么每次程序運(yùn)行,它產(chǎn)生的隨機(jī)數(shù)序列都是相同的,而不是真正意義上的隨機(jī)數(shù)。形象地說,如果seed值固定,那每次程序運(yùn)行,第一次擲到的點(diǎn)數(shù)都是固定的,這顯然不合理,那怎么生成更加合理的隨機(jī)數(shù)呢?

補(bǔ)充:
種子在每次啟動計算機(jī)時是隨機(jī)的,但是一旦計算機(jī)啟動以后它就不再變化了;也就是說,每次啟動計算機(jī)以后,種子就是定值了,所以根據(jù)公式推算出來的結(jié)果(也就是生成的隨機(jī)數(shù))就是固定的。——http://c.biancheng.net/view/2043.html

我們都知道系統(tǒng)的時間值(總秒數(shù))是時刻都在變化著的,如果把時間秒數(shù)當(dāng)做隨機(jī)數(shù)的種子seed,那豈不是能實現(xiàn)真正的隨機(jī)數(shù)?答案是方法可行,但并不能產(chǎn)生真正的隨機(jī)數(shù),因為時間是遞增的,是有規(guī)律的數(shù)字序列,所以產(chǎn)生的隨機(jī)數(shù)也會呈現(xiàn)一定的規(guī)律,但是,此時的隨機(jī)數(shù)已經(jīng)足夠我們用來完成擲骰子游戲了,所以我們也沒必要去糾結(jié)是否是真正的隨機(jī)數(shù)(可能計算機(jī)本來就無法產(chǎn)生真正隨機(jī)數(shù))。

要想獲取系統(tǒng)時間秒數(shù),需要用到time()函數(shù):

time() 是指返回自 Unix 紀(jì)元(January 1 1970 00:00:00 GMT)起的當(dāng)前時間的秒數(shù)的函數(shù),主要用來獲取當(dāng)前的系統(tǒng)時間,返回的結(jié)果是一個time_t類型。
time_t time(time_t *t);
如果t是空指針,直接返回當(dāng)前時間。如果t不是空指針,返回當(dāng)前時間的同時,將返回值賦予t指向的內(nèi)存空間。
——百度百科

time_t的原型就是long int,這個函數(shù)的實現(xiàn)原理我們也沒必要去深究,我們只要清楚它能返回秒數(shù)就足夠了。
程序中,我們可以通過下面的語句初始化隨機(jī)數(shù)種子產(chǎn)生隨機(jī)數(shù)

srand((unsigned)time(NULL)); //用系統(tǒng)秒數(shù)初始化隨機(jī)數(shù)種子ret = rand();                //產(chǎn)生隨機(jī)數(shù),賦值給ret變量

現(xiàn)在生成了隨機(jī)數(shù),那如何將隨機(jī)數(shù)轉(zhuǎn)換成骰子的點(diǎn)數(shù)呢?
骰子一般都是正方體,有6個面,正面朝上的即為點(diǎn)數(shù),那么它就有6種點(diǎn)數(shù),分別是1~6,我們將剛才生成的隨機(jī)數(shù)對6取余,即可將隨機(jī)數(shù)限定在0~5之間,再加上1,就是我們要的隨機(jī)點(diǎn)數(shù)了:

ret = rand() % 6 + 1;       //ret即為隨機(jī)點(diǎn)數(shù)

源碼介紹

原理介紹完了,接下來直接上代碼

代碼由兩個部分構(gòu)成:

  1. 菜單打?。捍蛴」δ苓x擇,顯示上次投骰子的結(jié)果
  2. 操作選擇:選擇擲骰子或退出退出程序
#include  #include      //srand()/rand()#include        //time()int main(){    char choice = "/0"; //菜單選擇    int ret = 0;    //用系統(tǒng)秒數(shù)初始化隨機(jī)數(shù)種子    srand((unsigned)time(NULL));    while(1)    {              /* 1.菜單打印 */        system("cls");  //清屏--Windows系統(tǒng)        printf("======================/n");        printf("|     擲骰子游戲     |/n");        printf("|  1:擲骰子  0:退出  |/n");        if(ret)            printf("|     上輪點(diǎn)數(shù):%d     |/n", ret);        printf("======================/n");        /* 2.操作選擇 */        printf("請選擇>>>>>>>/n");        scanf(" %c", &choice);    //輸入選擇                                  //" %c" 可以吃前面的空格和回車        while(getchar() != "/n"); //吃掉除choice外其它字符        ret = 0;                  //初始化點(diǎn)數(shù)        switch(choice)        {            case "0":             	printf("Goodbye!/n");    			return 0;   //退出            //擲骰子(產(chǎn)生1 ~ 6 隨機(jī)數(shù))            case "1":             	ret = rand() % 6 + 1;                break;            default: printf("無效選擇!/n");        }    }    return 0;}

效果展示

今日練習(xí)

題目描述

骰子是一個有六個面的正方體,每個面分別印有1?6之間的小圓點(diǎn)代表點(diǎn)數(shù)。假設(shè)這個游戲的規(guī)則是:兩個人輪流擲骰子6次,并將每次投擲的點(diǎn)數(shù)累加起來。點(diǎn)數(shù)多者獲勝;點(diǎn)數(shù)相同則為平局。

要求編寫程序模擬這個游戲的過程,并求出玩100盤之后誰是最終的獲勝者。

問題分析

思路可以參照前面擲骰子小游戲的實現(xiàn)原理。
實現(xiàn)步驟:兩層循環(huán),外層循環(huán)100次,內(nèi)層循環(huán)6次,每次都將他們擲骰子的點(diǎn)數(shù)進(jìn)行累加,最后總點(diǎn)數(shù)大的即為贏家,如果點(diǎn)數(shù)相同,則平局。

代碼實現(xiàn)

#include #include #include int main(){    int sum_1 = 0, sum_2 = 0;    int i = 0, j = 0;    //用系統(tǒng)秒數(shù)初始化隨機(jī)數(shù)種子    srand((unsigned)time(NULL));    for(i = 0; i < 100; i++)    {        for(j = 0; j < 6; j++)        {            //獲取骰子點(diǎn)數(shù)            sum_1 += rand() % 6 + 1;            sum_2 += rand() % 6 + 1;        }    }    printf("甲的總點(diǎn)數(shù):%d/n", sum_1);    printf("乙的總點(diǎn)數(shù):%d/n", sum_2);    if(sum_1 > sum_2)        printf("甲獲勝!/n");    else if(sum_1 == sum_2)        printf("平局.../n");    else        printf("乙獲勝!/n");    return 0;}

運(yùn)行結(jié)果

由于擲骰子點(diǎn)數(shù)是隨機(jī)的,所以獲勝者也是隨機(jī)的。

結(jié)果1:

結(jié)果2:


把他們擲骰子次數(shù)調(diào)為1,試了n次之后,終于平局了?

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/124091.html

相關(guān)文章

  • C語言每日一練——62:選美比賽

    摘要:語言每日一練年月日文章目錄題目描述問題分析代碼實現(xiàn)運(yùn)行結(jié)果題目描述用語言編寫軟件完成以下任務(wù)一批選手參加比賽,比賽的規(guī)則是最后得分越高,名次越低。 C語言每日一...

    tuomao 評論0 收藏0
  • 30分鐘入門比特幣與區(qū)塊鏈

    摘要:文章前部分適合想了解比特幣和區(qū)塊鏈的非開發(fā)人員,整篇文章適合想轉(zhuǎn)入比特幣與區(qū)塊鏈相關(guān)開發(fā)的技術(shù)人員。張三和李四均可通過查詢區(qū)塊鏈網(wǎng)絡(luò)確認(rèn)轉(zhuǎn)賬成功。 ??常見的比特幣與區(qū)塊鏈入門文章大約分為兩類,一類是面向非開發(fā)人員的科普讀物;另一類是面向開發(fā)人員的技術(shù)指南。前者易流于淺表,讓讀者接觸了一堆名詞和概念,卻無法對比特幣與區(qū)塊鏈有個直觀的認(rèn)識;而后者又往往直接進(jìn)入細(xì)節(jié),使開發(fā)人員一葉障目不能...

    learning 評論0 收藏0
  • Python學(xué)習(xí)之路14-生成數(shù)據(jù)

    摘要:小結(jié)本篇主要講述了如何生成數(shù)據(jù)集以及如何對其進(jìn)行可視化如何使用創(chuàng)建簡單的圖表如果使用散點(diǎn)圖來探索隨機(jī)漫步過程如何使用創(chuàng)建直方圖,以及如何使用直方圖來探索同時擲兩個面數(shù)不同的骰子的結(jié)果。 《Python編程:從入門到實踐》筆記。從本篇起將用三篇的篇幅介紹如何用Python進(jìn)行數(shù)據(jù)可視化。 1. 前言 從本篇開始,我們將用三篇的篇幅來初步介紹如何使用Python來進(jìn)行數(shù)據(jù)可視化操作。本篇的...

    wanglu1209 評論0 收藏0
  • 用animation的steps屬性制作幀動畫

    摘要:于是我順著他的思路,用上了在中的屬性。修改效果如下但是這都不是我們需要的效果,因為幀動畫的關(guān)鍵在于瞬變。在的中,有一個屬性。表示將動畫分為幀。這個位置變化沒有過渡效果,這就是的特點(diǎn)階躍性。  昨天火急火燎地接到一個任務(wù),說是要做一個擲骰子的游戲,關(guān)于擲骰子期間的過渡動畫,我本來是想用css 3d制作一個立體的骰子,然后叫UI給6張平面圖貼上去。再用translate3d來操作。然而UI考慮得...

    googollee 評論0 收藏0
  • 用animation的steps屬性制作幀動畫

    摘要:于是我順著他的思路,用上了在中的屬性。修改效果如下但是這都不是我們需要的效果,因為幀動畫的關(guān)鍵在于瞬變。在的中,有一個屬性。表示將動畫分為幀。這個位置變化沒有過渡效果,這就是的特點(diǎn)階躍性。 昨天火急火燎地接到一個任務(wù),說是要做一個擲骰子的游戲,關(guān)于擲骰子期間的過渡動畫,我本來是想用css 3d制作一個立體的骰子,然后叫UI給6張平面圖貼上去。再用translate3d來操作。然而UI考慮得十...

    zhichangterry 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<