2014-01-24 15 views
0

我使我的敵人產卵基於隨機數,我寫的第一種方式,有時候玩家可以隱藏在一個角落,什麼都不是一段時間使遊戲變得簡單。我寫的第二種方式稍微好一些,因爲玩家不能坐得太久,但這意味着屏幕上沒有任何東西產生,看起來不正確。尋找關於如何均勻產生我的敵人的想法

第一個是:

public Weight createWeight() { 
     decider = Math.random() * 1; 
     // creates rocks randomly with the lowest chance for l, and the highest chance for m 
     if (decider <= 0.33) { 
      // small weight 
      return new WeightSmall(BitmapFactory.decodeResource(getResources(), R.drawable.weight_s), new Random().nextInt(screenWidth), -10); 
     } else if (decider <= 0.5 && decider > 0.33) { 
      // large weight 
      return new WeightLarge(BitmapFactory.decodeResource(getResources(), R.drawable.weight_l), new Random().nextInt(screenWidth), -10); 
     } else { 
      // medium weight 
      return new WeightMedium(BitmapFactory.decodeResource(getResources(), R.drawable.weight_m), new Random().nextInt(screenWidth), -10); 
     } 
    } 

第二:

public Weight createWeight() { 
     decider = Math.random() * 1; 
     Random random = new Random(); 
     spawnRange = random.nextInt((player.getX() + player.getWidth()) - (player.getX() - player.getWidth())) + (player.getX() - player.getWidth()); 
     // creates rocks randomly with the lowest chance for l, and the highest chance for m 
     if (decider <= 0.33) { 
      // small weight 
      return new WeightSmall(BitmapFactory.decodeResource(getResources(), R.drawable.weight_s), spawnRange, -10); 
     } else if (decider <= 0.5 && decider > 0.33) { 
      // large weight 
      return new WeightLarge(BitmapFactory.decodeResource(getResources(), R.drawable.weight_l), spawnRange, -10); 
     } else { 
      // medium weight 
      return new WeightMedium(BitmapFactory.decodeResource(getResources(), R.drawable.weight_m), spawnRange, -10); 
     } 
    } 

我想,因爲它感覺最自然進步的第二種方法,我只需要在其他地方產卵他們的機會在屏幕上。

+1

不知道如果這就是你想要的東西,但'Random'還支持高斯分佈:http://www.javamex.com/tutorials/random_numbers/gaussian_distribution_2.shtml – zapl

+1

爲有效地寫你的spawnRange數學簡化爲: ' player.getX()+ player.getWidth()' 我不清楚你在問什麼(WeightSmall/Medium/Large實際上做了什麼?),但是你的計算範圍很小。 另外''math.Random()* 1',不知道你打算通過乘以1來完成。 – spartygw

+0

這三種類型的權重是玩家要避免的「跌倒」。我要求更高的機會在我列出的球員範圍內產生重量,但仍然有機會在其他地方產卵,因爲當前權重僅包圍球員。然後乘以1,我認爲它允許一個最大爲1的隨機數。 –

回答

2

我想我明白你的意思了。基本上怪物的產卵位置應該是隨機的,但是更高的部分應該在玩家周圍。嗯,你會想出一個指數方程來計算出玩家的產卵距離。所以,你想把玩家的距離,並隨機選擇一個值。爲了得到這個種子,你想產生一個隨機數,然後乘以它自己。這會讓玩家與玩家產生距離,從而產生暴徒。

例如,如果您的播放廣場是50x50

玩家在0,0

0-5生成一個隨機數,自乘。

0-1 = within 1 block 
1-2 = within 4 blocks 
2-3 = within 9 blocks 
3-4 = within 16 blocks 
4-5 = within 25 blocks 

這意味着你有60%的機率在玩家所在的40%的遊戲區域內產生小怪。

你需要調整你自己使用的確切公式,並且顯然想出一個合適的遊戲區域大小。

這實際上可以很好地工作,因爲這意味着如果玩家站在牆旁邊,一半的玩具箱在遊戲區外面,在這種情況下,您會將暴徒們衝到牆上。所以小怪有一個半體形的區域來產卵,這將有助於防止玩家在角落裏露營(這會給他們一個1/4尺寸的產卵區域)。

+0

spawnRangeTest = random.nextInt(5 - 0); \t \t如果(spawnRangeTest> 0 && spawnRangeTest <1){ \t \t \t \t \t}否則如果(spawnRangeTest> 1 && spawnRangeTest <2){ \t \t \t \t \t}否則如果(spawnRangeTest> 2 && spawnRangeTest <3){ \t \t \t \t } \t否則如果(spawnRangeTest> 3 && spawnRangeTest <4){ \t \t \t \t \t}否則,如果(spawnRangeTest> 4 && spawnRangeTest <5){ \t \t \t \t \t} 我得到了那麼遠,但我不知道要放什麼東西的括號內。然後我會再次隨機,但在一個較小的值之間?比如player.getX到player.getX + player.getWidth? –

+0

不知道你的代碼究竟是如何工作的,很難準確地說出要放在那裏的東西,但是它會像player.getX之間的spawn位置一樣,以「基於你所在的塊的距離爲基礎的距離」。沿着這些線的東西。 – M21B8

+0

好的,謝謝。這就是我的想法,但並非百分之百確定。將測試並取回給您。 –

0

正如指出的那樣,math.random返回一個介於0和1之間的值。乘以1得到相同的值。因此,*1已過時。你可以做的是*100,並投它作爲一個int,給你0到100之間,並

spawnRangeplayer.getX() - player.getWidth()圓整。如果你正確地命名這個,你會遇到一大堆問題。首先,如果玩家在x=0,你會嘗試在屏幕外產生東西。第二,敵人總是會在玩家後面產卵,並且只能在與玩家一樣大的區域產卵,所以你可能一次只能產生一個敵人,其間最多隻有幾個像素。播放器。

你一般想要的是在附近產生敵人,而不是在他的臉上。如果你也想整個地圖內產卵,需要應用以下數學:

Spawnrange是最小player.width從玩家的x(最好寬度爲一些喘息空間的兩倍)以外,在大多數最高x位置。

minimumDistance = player.getX()+player.getWidth(); 
Spawnrange = random.nextInt(screenXSize - minimumDistance)) + minimumDistance; 

這滋生你在屏幕的x範圍內的結果,至少有一個球員的尺寸從玩家的位置了。你當然也可以通過倒轉數學來結合玩家背後的值。

對下一個問題:你想產生敵人和關閉。我會做的,是一次產生兩個敵人:一個靠近,一個遠離。一個從後面,另一個從前面。使用隨機函數來確定它是近還是遠,然後應用適當的random.nextInt()