天天看點

《Android遊戲開發詳解》一2.20 對象的更多實踐——模拟一個色子

本節書摘來異步社群《android遊戲開發詳解》一書中的第2章,第2.20節,譯者: 李強 責編: 陳冀康,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

android遊戲開發詳解

在我們的下一個項目中,将模拟一個六面色子的滾動。色子會出現在許多現代的桌上遊戲中,因為它們增添了不可預期的因素,如圖2-26所示。在本節中,我們将展示在java程式中如何模拟這種随機性。

《Android遊戲開發詳解》一2.20 對象的更多實踐——模拟一個色子

我們首先建立一個名為“diceproject”的新的java項目。其中,建立一個名為dicemaker的新的類,并且像通常一樣給它一個main方法。

要産生一個随機數,我們必須使用java庫中名為random的一個内建類。我們使用熟悉的對象建立文法來建立一個random對象,如程式清單2.22的第4行所示。

程式清單2.22 dicemaker.java

應該注意到,eclipse告訴你在建立random對象的代碼行中有一個錯誤,如圖2.27所示。

一旦将滑鼠移動到關鍵字random上,将會出現如下所示的資訊。

random cannot be resolved to a type

這隻是告訴你,編譯器不能建立一個random類型的對象,因為它不知道random類在哪裡。

《Android遊戲開發詳解》一2.20 對象的更多實踐——模拟一個色子

要修正這個問題,必須提供完整的位址,讓編譯器知道在哪裡找到random。想要的random類可以在java.util.random中找到(這是unitedkingdom.london.221bbakerst形式的位址)。讓我們導入這個類,如程式清單2.23第1行所示。

程式清單2.23 導入java.util.random

既然已經告訴計算機在哪裡找到random,我們就能夠調用這個方法了。我們感興趣的是nextint()方法,它接受一個整數,并且傳回0(包括)到所接受的整數(不包括)之間的一個值。

例如,r.nextint(6)将會随機地産生如下所示的數字之一。

如果我們想要生成1到6之間的數字,直接給結果加上1就行了,如程式清單2.24中的第7行和第8行所示。

程式清單2.24 模拟色子滾動

運作該程式的時候,将會看到如下所示的結果之一。

random類有哪些應用呢?當英雄殺死怪獸的時候,你可以選擇實作一個随機數生成器來決定丢下什麼物品。當在類似minecraft這樣的遊戲中生成地圖的時候,也可以使用随機數生成器。真的有無數種可能性。

java.util.random有多随機

我們已經使用了random類來模拟随機性,但是,它并沒有實作真正的随機性。盡管它似乎産生了随機數,但實際上它遵循了一個公式,該公式生成理論上可以預測的結果。我們将這種現象叫作僞随機數(pseudo-random)。這對我們編寫遊戲不可能有任何影響,但是它引發了一個有趣的讨論。長期來講,你可以肯定地期待這個随機數生成器将會生成所有可能的數字的一個一緻的分布。如果你想要學習有關真正的随機性的更多知識,請通路random.org網站。

關于導入的更多介紹

在上面的示例中,我們必須導入java.util.random。這是我們将要從java庫導入的random類的全名。

java庫組織成包的形式,其中包含了可以在代碼中使用的各種類。無論何時,當你想要使用java庫中的一個類的時候,都必須告訴程式,在哪裡可以找到這個類所在的包(完整名稱)。

并不是所有的對象都需要導入。例如,屬于java.lang包的string,由于它如此常用,實際上會自動導入。下一小節所要介紹的數組,也是不用導入就可以建立。