999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

隨機函數在游戲軟件開發中的應用

2019-12-16 01:48:12趙海國
電腦知識與技術 2019年29期

趙海國

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

關鍵詞:隨機函數;掃雷游戲;貪吃蛇游戲;紙牌游戲

中圖分類號:TP311 文獻標識碼:A

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

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

1隨機函數的概念

1.1rand()函數的概念

在以C/C++語言為基礎的編程環境中,隨機函數是rand()函數。添加頭文件后,可使用該函數來產生隨機數。rand()函數的使用格式為:int rand(void)。

例如以下程序用幾行代碼就可以生成一個隨機數并打印出來

以上程序中rand()函數產生的隨機數并不是真正的隨機數,而是一個偽隨機數,因為反復調用程序發現,每次得到隨機數都是同樣的數,沒有真正達到隨機的效果。因為rand()函數的實現是以一個被稱為隨機數種子seed的值為基準,根據某個遞推公式推算出來的。計算機開機后隨機數種子seed的值會默認為1,rand()函數在每次被調用時會查看隨機數種子seed的值,若隨機數種子seed的值系統一直默認為1而沒有被改變,得到的隨機數就會是重復的。可見要想得到不同的隨機序列,可以在程序運行開始時通過改變隨機數種子seed的值來實現。故而系統又引入了srand()函數,用來設置隨機數種子seed的值,rand()函數調用時使用不同的隨機數種子seed值便可生成游戲軟件系統所需要的隨機序列。

1.2srand()函數的概念

srand0函數稱為初始化隨機數發生器,它是C/C++語言環境下用來設置隨機數種子seed的值的一個函數,其正確的使用格式為:void srand(unsigned int seed)。

通過srand()函數可以重新“播種”修改隨機數種子seed的值,程序先調用srand()函數設置一個最新的隨機數種子seed值,然后再調用隨機函數rand()函數,它會以最新的種子seed值為基準,根據遞推公式推算出一個當前的隨機數。由于每次設置的隨機數種子seed的值是不同的,故而每次推算出來的隨機數就實現了真正隨機的效果。為了使得程序每次重新運行調用srand()函數時能夠設置一個可變的隨機數種子seed值,常常使用系統時間函數time()的返回值作為srand()函數的參數,正確使用格式為:srand((unsigned)time(NULL))或者srand((un-signed)time(O)。

程序每次被調用的時間都是不同的,語句srand((unsigned)time(O)相當于對用一個全新的時間參數對隨機數種子seed進行重新“播種”,rand()函數調用時使用不同的隨機數種子seed值推算出不同的隨機數,反復調用即可得到不同的隨機數序列。時間函數time()以秒為單位,加上頭文件就可使用。由此可見,stand()函數,time()函數和rand0函數聯合使用,程序生成的隨機數序列就真正有了隨機性,具體使用方法請看下面的程序實例。

多次運行上面這段程序,發現每次程序運行調用srand()函數被調用的時間不同,相當于每次設置的隨機數種子seed的值不同,rand()函數每次推算出來的隨機數便不同,故而程序每次運行都可以得到不同的隨機序列。

2隨機函數在游戲軟件開發中的應用

2.1隨機函數在掃雷游戲系統中的應用

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

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

可見,隨機函數在掃雷游戲中的主要應用就是初始化游戲界面。先利用隨機函數在二維數組中游戲界面區域生成隨機坐標,判斷坐標為空白時將此坐標置為雷,總雷數減一再繼續生成新地雷,直到完成所有地雷的布置。因為隨機函數的使用,掃雷游戲每一次重新開始后都有不同的游戲開局,給玩家帶來了全新的游戲體驗,游戲過程中的趣味性和挑戰性對玩家有極大的吸引力。

2.2隨機函數在貪吃蛇游戲系統中的應用

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

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

隨機函數在貪吃蛇游戲中的主要應用是游戲當前食物被貪吃蛇吃掉時隨機地生成位置坐標為貪吃蛇生成新的食物。當游戲默認的食物被吃掉確認需要新生成新的食物時,聯合使用srand()函數,time()函數和rand()函數生成兩個隨機數組合成坐標,并判斷這個坐標是否生成在蛇身或障礙的坐標上,判斷該坐標不在蛇身和障礙上后將新食物生成在該坐標位置顯示出來供貪吃蛇食用。游戲過程中,食物不斷被吃掉的同時又不斷地生成新的食物,如此循環直至游戲結束。游戲過程中貪吃蛇吃掉食物積分增長的同時貪吃蛇的蛇身不斷增長,游戲難度越來越大,挑戰性越來越強,趣味性也不斷增強,極大地提升了玩家的興趣。

2.3隨機函數在紙牌游戲系統中的應用

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

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

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

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

3隨機函數的應用總結

從隨機函數在掃雷游戲、貪吃蛇游戲和紙牌游戲中的應用實例可以看出,眾多游戲設計過程中都使用了隨機函數。游戲設計時為了真正實現游戲數據的隨機化,達到游戲趣味性的效果,需要注意以下兩點:

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

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

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

主站蜘蛛池模板: 久久亚洲国产视频| 欧洲亚洲一区| 久久五月视频| 亚洲日产2021三区在线| 国产精品播放| 中文国产成人精品久久一| 香蕉伊思人视频| 成人一区专区在线观看| 午夜福利亚洲精品| 久久这里只有精品23| 久久久久夜色精品波多野结衣| 东京热高清无码精品| 午夜天堂视频| 国产网友愉拍精品视频| 黑色丝袜高跟国产在线91| 美女一区二区在线观看| 一级成人a毛片免费播放| 久久久久久国产精品mv| 国产激情无码一区二区免费| 久久久久久尹人网香蕉| 国产高清在线观看91精品| 丁香六月综合网| 国产成人永久免费视频| 一级毛片在线免费视频| 国产亚洲精久久久久久无码AV| 伊人五月丁香综合AⅤ| 国产成人精品三级| 99人体免费视频| 精品视频一区二区观看| 午夜在线不卡| 中文字幕第4页| 在线观看无码a∨| 久热中文字幕在线观看| 色网站在线视频| 日韩无码视频专区| 亚洲国产精品无码久久一线| 四虎成人在线视频| 777国产精品永久免费观看| 狠狠色狠狠综合久久| 综合五月天网| 免费毛片全部不收费的| 日本欧美精品| 中文字幕人成人乱码亚洲电影| 日本久久久久久免费网络| 国产尤物视频在线| 男女性午夜福利网站| 色综合天天综合中文网| 九九精品在线观看| 久久综合色88| 亚洲成a人片| 亚洲日韩AV无码精品| 亚洲黄色网站视频| 国产精品第| 亚洲欧洲日本在线| 中文字幕在线观| 91午夜福利在线观看| 午夜啪啪网| 亚洲成aⅴ人片在线影院八| 国产成人精品三级| 午夜电影在线观看国产1区| 天天色天天综合| 久久香蕉国产线看精品| 久久精品午夜视频| 就去吻亚洲精品国产欧美| 2021天堂在线亚洲精品专区| 国产精品毛片在线直播完整版| 亚洲一欧洲中文字幕在线| 噜噜噜综合亚洲| 国产在线一二三区| 亚洲第一页在线观看| 就去色综合| 国产青青操| 国产精品白浆在线播放| 国产极品美女在线| 欧美精品亚洲精品日韩专区va| 刘亦菲一区二区在线观看| 国产黑丝一区| 日韩精品久久无码中文字幕色欲| 精品国产成人高清在线| 国产AV无码专区亚洲精品网站| 一级毛片免费不卡在线| 亚洲一区二区在线无码|