国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

隨機(jī)函數(shù)在游戲軟件開(kāi)發(fā)中的應(yīng)用

2019-12-16 01:48:12趙海國(guó)
電腦知識(shí)與技術(shù) 2019年29期

趙海國(guó)

摘要:隨機(jī)函數(shù)在掃雷游戲、貪吃蛇游戲、紙牌游戲和拼圖游戲等多種游戲軟件開(kāi)發(fā)過(guò)程中經(jīng)常用到。該文討論隨機(jī)函數(shù)在游戲軟件開(kāi)發(fā)中的應(yīng)用技巧,有利于游戲開(kāi)發(fā)人員全面了解該類函數(shù)的功能和使用方法。

關(guān)鍵詞:隨機(jī)函數(shù);掃雷游戲;貪吃蛇游戲;紙牌游戲

中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A

文章編號(hào):1009-3044(2019)29-0062-03

游戲是人們休閑的一種重要方式,它既能豐富人們的業(yè)余生活,又能幫助人們釋放學(xué)習(xí)、生活或工作中的壓力。游戲之所以有如此大的魅力主要原因是其隨機(jī)性,趣味性和挑戰(zhàn)性能吸引玩家的興趣,故而隨機(jī)函數(shù)在游戲軟件的程序設(shè)計(jì)中占據(jù)著舉足輕重的作用。不同的語(yǔ)言環(huán)境下生成隨機(jī)數(shù)的函數(shù)名稱略有不同:iava環(huán)境下產(chǎn)生隨機(jī)數(shù)的隨機(jī)函數(shù)為Math.randomO函數(shù),VB環(huán)境下產(chǎn)生隨機(jī)數(shù)的隨機(jī)函數(shù)為Rnd()函數(shù),C/C++語(yǔ)言環(huán)境下產(chǎn)生隨機(jī)數(shù)的隨機(jī)函數(shù)為rand()函數(shù)。下面以C,c++語(yǔ)言環(huán)境為例介紹隨機(jī)函數(shù)的相關(guān)概念及使用方法。

1隨機(jī)函數(shù)的概念

1.1rand()函數(shù)的概念

在以C/C++語(yǔ)言為基礎(chǔ)的編程環(huán)境中,隨機(jī)函數(shù)是rand()函數(shù)。添加頭文件后,可使用該函數(shù)來(lái)產(chǎn)生隨機(jī)數(shù)。rand()函數(shù)的使用格式為:int rand(void)。

例如以下程序用幾行代碼就可以生成一個(gè)隨機(jī)數(shù)并打印出來(lái)

以上程序中rand()函數(shù)產(chǎn)生的隨機(jī)數(shù)并不是真正的隨機(jī)數(shù),而是一個(gè)偽隨機(jī)數(shù),因?yàn)榉磸?fù)調(diào)用程序發(fā)現(xiàn),每次得到隨機(jī)數(shù)都是同樣的數(shù),沒(méi)有真正達(dá)到隨機(jī)的效果。因?yàn)閞and()函數(shù)的實(shí)現(xiàn)是以一個(gè)被稱為隨機(jī)數(shù)種子seed的值為基準(zhǔn),根據(jù)某個(gè)遞推公式推算出來(lái)的。計(jì)算機(jī)開(kāi)機(jī)后隨機(jī)數(shù)種子seed的值會(huì)默認(rèn)為1,rand()函數(shù)在每次被調(diào)用時(shí)會(huì)查看隨機(jī)數(shù)種子seed的值,若隨機(jī)數(shù)種子seed的值系統(tǒng)一直默認(rèn)為1而沒(méi)有被改變,得到的隨機(jī)數(shù)就會(huì)是重復(fù)的??梢?jiàn)要想得到不同的隨機(jī)序列,可以在程序運(yùn)行開(kāi)始時(shí)通過(guò)改變隨機(jī)數(shù)種子seed的值來(lái)實(shí)現(xiàn)。故而系統(tǒng)又引入了srand()函數(shù),用來(lái)設(shè)置隨機(jī)數(shù)種子seed的值,rand()函數(shù)調(diào)用時(shí)使用不同的隨機(jī)數(shù)種子seed值便可生成游戲軟件系統(tǒng)所需要的隨機(jī)序列。

1.2srand()函數(shù)的概念

srand0函數(shù)稱為初始化隨機(jī)數(shù)發(fā)生器,它是C/C++語(yǔ)言環(huán)境下用來(lái)設(shè)置隨機(jī)數(shù)種子seed的值的一個(gè)函數(shù),其正確的使用格式為:void srand(unsigned int seed)。

通過(guò)srand()函數(shù)可以重新“播種”修改隨機(jī)數(shù)種子seed的值,程序先調(diào)用srand()函數(shù)設(shè)置一個(gè)最新的隨機(jī)數(shù)種子seed值,然后再調(diào)用隨機(jī)函數(shù)rand()函數(shù),它會(huì)以最新的種子seed值為基準(zhǔn),根據(jù)遞推公式推算出一個(gè)當(dāng)前的隨機(jī)數(shù)。由于每次設(shè)置的隨機(jī)數(shù)種子seed的值是不同的,故而每次推算出來(lái)的隨機(jī)數(shù)就實(shí)現(xiàn)了真正隨機(jī)的效果。為了使得程序每次重新運(yùn)行調(diào)用srand()函數(shù)時(shí)能夠設(shè)置一個(gè)可變的隨機(jī)數(shù)種子seed值,常常使用系統(tǒng)時(shí)間函數(shù)time()的返回值作為srand()函數(shù)的參數(shù),正確使用格式為:srand((unsigned)time(NULL))或者srand((un-signed)time(O)。

程序每次被調(diào)用的時(shí)間都是不同的,語(yǔ)句srand((unsigned)time(O)相當(dāng)于對(duì)用一個(gè)全新的時(shí)間參數(shù)對(duì)隨機(jī)數(shù)種子seed進(jìn)行重新“播種”,rand()函數(shù)調(diào)用時(shí)使用不同的隨機(jī)數(shù)種子seed值推算出不同的隨機(jī)數(shù),反復(fù)調(diào)用即可得到不同的隨機(jī)數(shù)序列。時(shí)間函數(shù)time()以秒為單位,加上頭文件就可使用。由此可見(jiàn),stand()函數(shù),time()函數(shù)和rand0函數(shù)聯(lián)合使用,程序生成的隨機(jī)數(shù)序列就真正有了隨機(jī)性,具體使用方法請(qǐng)看下面的程序?qū)嵗?/p>

多次運(yùn)行上面這段程序,發(fā)現(xiàn)每次程序運(yùn)行調(diào)用srand()函數(shù)被調(diào)用的時(shí)間不同,相當(dāng)于每次設(shè)置的隨機(jī)數(shù)種子seed的值不同,rand()函數(shù)每次推算出來(lái)的隨機(jī)數(shù)便不同,故而程序每次運(yùn)行都可以得到不同的隨機(jī)序列。

2隨機(jī)函數(shù)在游戲軟件開(kāi)發(fā)中的應(yīng)用

2.1隨機(jī)函數(shù)在掃雷游戲系統(tǒng)中的應(yīng)用

掃雷游戲是windows系統(tǒng)自帶的一款大眾類益智小游戲,玩家要在盡可能短的時(shí)間里找出所有設(shè)置了地雷的方塊,且在找雷過(guò)程中從未踩到雷則判斷玩家勝利游戲結(jié)束,若中途判斷錯(cuò)誤踩到雷則判斷玩家失敗游戲結(jié)束。游戲根據(jù)不同難度有不同的大小規(guī)格,玩家可以自定義游戲規(guī)格和雷數(shù),游戲開(kāi)始之后玩家需要做的就是在不踩到雷的前提條件下根據(jù)翻開(kāi)的方塊得到周圍雷的信息并找出所有地雷。

隨機(jī)函數(shù)在掃雷游戲中主要用在游戲開(kāi)局時(shí)初始化數(shù)據(jù),完成游戲界面隨機(jī)布雷,使得每次游戲時(shí)都有不重復(fù)的地雷布局。以游戲界面規(guī)格為9*9(row*col)的簡(jiǎn)單模式為例,定義行列為(row+2)*(col+2)的界面,上下加一行左右加一列,這樣對(duì)邊角的方塊進(jìn)行周圍雷數(shù)統(tǒng)計(jì)時(shí)會(huì)更方便也更精準(zhǔn)。定義一個(gè)二維數(shù)組char arr[ROW][coL],在9*9的簡(jiǎn)單模式實(shí)例中ROW和COL的值都是11,二維數(shù)組中的元素用“1”來(lái)代表雷,用“0”代表空白方塊.利用srand()函數(shù)和時(shí)間函數(shù)time()函數(shù)生成隨機(jī)種子seed的值,ran()函數(shù)根據(jù)最新的種子seed值推算出當(dāng)前的隨機(jī)數(shù),兩次調(diào)用函數(shù)生成兩個(gè)隨機(jī)數(shù)組成二維數(shù)組中的橫坐標(biāo)和縱坐標(biāo)。坐標(biāo)生成后判斷該位置是否為空能否生成新的地雷,循環(huán)生成所有地雷,即完成隨機(jī)布雷。隨機(jī)函數(shù)在掃雷游戲中的關(guān)鍵代碼如下:

可見(jiàn),隨機(jī)函數(shù)在掃雷游戲中的主要應(yīng)用就是初始化游戲界面。先利用隨機(jī)函數(shù)在二維數(shù)組中游戲界面區(qū)域生成隨機(jī)坐標(biāo),判斷坐標(biāo)為空白時(shí)將此坐標(biāo)置為雷,總雷數(shù)減一再繼續(xù)生成新地雷,直到完成所有地雷的布置。因?yàn)殡S機(jī)函數(shù)的使用,掃雷游戲每一次重新開(kāi)始后都有不同的游戲開(kāi)局,給玩家?guī)?lái)了全新的游戲體驗(yàn),游戲過(guò)程中的趣味性和挑戰(zhàn)性對(duì)玩家有極大的吸引力。

2.2隨機(jī)函數(shù)在貪吃蛇游戲系統(tǒng)中的應(yīng)用

貪吃蛇游戲是一款簡(jiǎn)單又耐玩的經(jīng)典益智游戲,矩形游戲界面內(nèi)有隨機(jī)布置的“食物”和一條玩家控制的貪吃蛇,玩家通過(guò)控制貪吃蛇的蛇頭方向去吃掉食物,每次吃掉食物之后玩家會(huì)獲得積分但是也會(huì)讓貪吃蛇的蛇身變得越來(lái)越長(zhǎng),游戲過(guò)程中貪吃蛇的蛇頭碰到游戲邊框和蛇身就會(huì)判定游戲結(jié)束,累計(jì)每次吃掉食物的所有積分,最后的積分即為游戲結(jié)束時(shí)的最終成績(jī)。

隨機(jī)函數(shù)在貪吃蛇游戲中的作用是在游戲過(guò)程中在游戲界面上隨機(jī)地選擇位置為貪吃蛇生成新的食物。貪吃蛇是矩形游戲界面,游戲界面由一個(gè)個(gè)方塊組成,先要用一個(gè)二維數(shù)組來(lái)存儲(chǔ)數(shù)據(jù),將srand()函數(shù),time()函數(shù)和rand()函數(shù)聯(lián)合使用生成隨機(jī)數(shù).然后把隨機(jī)生成的兩個(gè)隨機(jī)數(shù)取余變成界面內(nèi)的一個(gè)坐標(biāo),判斷這個(gè)位置是不是在蛇身上或者障礙物,如果不是蛇身或障礙物就能直接生成新食物顯示在游戲界面;如果是蛇身或障礙就需要重新生成新的坐標(biāo)并繼續(xù)判斷直到新的食物生成成功為止。隨機(jī)函數(shù)在貪吃蛇游戲中的關(guān)鍵代碼如下:

隨機(jī)函數(shù)在貪吃蛇游戲中的主要應(yīng)用是游戲當(dāng)前食物被貪吃蛇吃掉時(shí)隨機(jī)地生成位置坐標(biāo)為貪吃蛇生成新的食物。當(dāng)游戲默認(rèn)的食物被吃掉確認(rèn)需要新生成新的食物時(shí),聯(lián)合使用srand()函數(shù),time()函數(shù)和rand()函數(shù)生成兩個(gè)隨機(jī)數(shù)組合成坐標(biāo),并判斷這個(gè)坐標(biāo)是否生成在蛇身或障礙的坐標(biāo)上,判斷該坐標(biāo)不在蛇身和障礙上后將新食物生成在該坐標(biāo)位置顯示出來(lái)供貪吃蛇食用。游戲過(guò)程中,食物不斷被吃掉的同時(shí)又不斷地生成新的食物,如此循環(huán)直至游戲結(jié)束。游戲過(guò)程中貪吃蛇吃掉食物積分增長(zhǎng)的同時(shí)貪吃蛇的蛇身不斷增長(zhǎng),游戲難度越來(lái)越大,挑戰(zhàn)性越來(lái)越強(qiáng),趣味性也不斷增強(qiáng),極大地提升了玩家的興趣。

2.3隨機(jī)函數(shù)在紙牌游戲系統(tǒng)中的應(yīng)用

紙牌游戲是一款種類繁多、規(guī)則各異、普及最廣的大眾類游戲,windows系統(tǒng)中的蜘蛛紙牌、空當(dāng)接龍這類單人紙牌排序游戲,斗地主、跑得快等聯(lián)機(jī)對(duì)戰(zhàn)游戲都是紙牌類游戲。游戲中的紙牌包括A,2-10、J-K共13種,每種各4張不同花色,力113::大王和小王共54張牌組成一副牌組.程序給撲克牌的每張牌按照規(guī)則編號(hào):黑桃按從小到大依次標(biāo)號(hào)為l到13,紅桃按從小到大為14到26,梅花按從小到大為27到39,方塊按從小到大為40到52,小王為53,大王為54,這54張牌按照從小到大的順序依次存入一維數(shù)組中。以斗地主為列,游戲?qū)?4張牌分發(fā)給3名玩家,每人17張牌,地主玩家另外多拿3張牌并先手出牌,兩名農(nóng)民玩家合作對(duì)抗地主玩家,3人中最先打完手牌的玩家所代表的一方獲勝。

雖然紙牌游戲類型多樣,游戲輸贏的判定規(guī)則也各不相同,但是隨機(jī)函數(shù)在各類紙牌游戲中的作用是大致相同的,主要用于游戲開(kāi)局是進(jìn)行隨機(jī)洗牌和隨機(jī)切牌。隨機(jī)洗牌是指使用隨機(jī)函數(shù)在游戲開(kāi)局時(shí)通過(guò)隨機(jī)交換牌組數(shù)據(jù)元素的位置來(lái)打亂紙牌數(shù)組中的數(shù)據(jù),使得54張牌按照不同的順序存放在紙牌數(shù)組中,完成洗牌。不同于掃雷游戲和貪吃蛇游戲,紙牌游戲只需要用一個(gè)一維數(shù)組來(lái)存儲(chǔ)數(shù)據(jù),創(chuàng)建一維數(shù)組并賦值以區(qū)分不同的紙牌,聯(lián)合使用srand()函數(shù),time()函數(shù)和randO函數(shù)生成一維數(shù)組中的隨機(jī)坐標(biāo),然后數(shù)組從頭開(kāi)始每個(gè)元素都匹配一個(gè)新生成的隨機(jī)坐標(biāo),并將兩個(gè)位置上的元素對(duì)換位置,依次對(duì)換位置后就完成了對(duì)牌組的打亂洗牌。隨機(jī)函數(shù)不僅應(yīng)用于隨機(jī)洗牌,洗牌完成后還會(huì)進(jìn)行隨機(jī)切牌,將隨機(jī)選取出的紙牌分給玩家做手牌。通過(guò)兩次使用隨機(jī)函數(shù)后,即可使玩家每次都能分到不一樣的手牌。隨機(jī)函數(shù)在紙牌游戲中用于隨機(jī)洗牌的關(guān)鍵代碼如下:

void Shuffle_Cards(int card[541)//洗牌函數(shù)的參數(shù)為存儲(chǔ)54張紙牌數(shù)據(jù)的一維數(shù)組

以上洗牌函數(shù)Shuffle_Cards中隨機(jī)函數(shù)的作用是完成洗牌,該函數(shù)的參數(shù)為存放牌組數(shù)據(jù)的一維數(shù)組card,通過(guò)聯(lián)合使用srand()函數(shù),time()函數(shù)和rand()函數(shù)隨機(jī)挑選出牌并調(diào)換位置,通過(guò)循環(huán)交換若干次將撲克牌的順序完全打亂,從而完成隨機(jī)洗牌過(guò)程,得到一個(gè)全新的數(shù)組達(dá)到洗牌的目的,實(shí)現(xiàn)初始化游戲數(shù)據(jù)的效果。隨機(jī)函數(shù)在發(fā)牌過(guò)程中主要用于隨機(jī)地將新產(chǎn)生的數(shù)組分配給三個(gè)玩家,完成隨機(jī)發(fā)牌過(guò)程。當(dāng)游戲進(jìn)入到新一輪時(shí),在洗牌和發(fā)牌的過(guò)程中都有用到隨機(jī)函數(shù),使得玩家每一次都能拿到全新的牌組參與游戲,增強(qiáng)了游戲的趣味性,同時(shí)這類使用最廣的紙牌游戲也給大眾提供了方便快捷的消遣方式。

3隨機(jī)函數(shù)的應(yīng)用總結(jié)

從隨機(jī)函數(shù)在掃雷游戲、貪吃蛇游戲和紙牌游戲中的應(yīng)用實(shí)例可以看出,眾多游戲設(shè)計(jì)過(guò)程中都使用了隨機(jī)函數(shù)。游戲設(shè)計(jì)時(shí)為了真正實(shí)現(xiàn)游戲數(shù)據(jù)的隨機(jī)化,達(dá)到游戲趣味性的效果,需要注意以下兩點(diǎn):

1)注意各個(gè)函數(shù)的使用順序和時(shí)機(jī):先以時(shí)間函數(shù)time(NULL)為參數(shù)調(diào)用srand()函數(shù)來(lái)設(shè)置隨機(jī)數(shù)種子seed的值,再調(diào)用rand()函數(shù)以最新的隨機(jī)數(shù)種子值為基準(zhǔn)根據(jù)遞推公式推算出一個(gè)最新的隨機(jī)數(shù),正確地聯(lián)合使用srand()函數(shù),time()函數(shù)和rand()函數(shù)才能生成游戲軟件真正需要的隨機(jī)序列;

2)注意隨機(jī)數(shù)的數(shù)值范圍:游戲系統(tǒng)中生成的隨機(jī)數(shù)多用于游戲數(shù)據(jù)處理,掃雷游戲界面隨機(jī)布雷和貪吃蛇游戲中生成新的食物都是用隨機(jī)數(shù)作為二維數(shù)組的下標(biāo)對(duì)數(shù)組中的元素進(jìn)行相關(guān)操作,紙牌游戲中隨機(jī)洗牌和隨機(jī)切牌就是用隨機(jī)數(shù)作為一維數(shù)組的下標(biāo)對(duì)數(shù)組元素進(jìn)行處理。要使用隨機(jī)數(shù)作為數(shù)組下標(biāo)就必須注意數(shù)值的范圍,系統(tǒng)生成的隨機(jī)數(shù)必須要使用取余運(yùn)算進(jìn)行相關(guān)處理后方能正確使用。

可見(jiàn),隨機(jī)函數(shù)的正確使用可以實(shí)現(xiàn)游戲數(shù)據(jù)的隨機(jī)化:掃雷游戲中使用隨機(jī)函數(shù)可以實(shí)現(xiàn)游戲界面內(nèi)的隨機(jī)布雷;貪吃蛇游戲使用隨機(jī)函數(shù)可以在當(dāng)前食物被吃掉時(shí)隨機(jī)地為貪吃蛇選擇空白位置坐標(biāo)生成新的食物供貪吃蛇繼續(xù)食用;紙牌游戲使用隨機(jī)函數(shù)可以實(shí)現(xiàn)隨機(jī)洗牌和隨機(jī)切牌。此外,隨機(jī)函數(shù)還在連連看游戲,俄羅斯方塊游戲,拼圖游戲等眾多游戲中有廣泛的應(yīng)用。在各類游戲中,隨機(jī)函數(shù)的使用增進(jìn)了游戲初始數(shù)據(jù)的隨機(jī)性,提高了游戲的趣味性,增強(qiáng)了游戲的挑戰(zhàn)性,更能激發(fā)玩家對(duì)游戲的興趣,可見(jiàn)隨機(jī)函數(shù)在游戲軟件設(shè)計(jì)中有著及其重要的作用。

嵊州市| 河南省| 盈江县| 金沙县| 新野县| 呼和浩特市| 灌云县| 乳源| 峡江县| 华亭县| 化德县| 永定县| 南澳县| 大英县| 嘉义市| 肥乡县| 神池县| 呼和浩特市| 景德镇市| 万盛区| 潮安县| 荆门市| 高安市| 道真| 宁远县| 东平县| 巴里| 大足县| 广宁县| 东辽县| 黄陵县| 威海市| 阆中市| 疏勒县| 铅山县| 西林县| 吉隆县| 双鸭山市| 周口市| 华宁县| 九龙坡区|