2015-08-24 45 views
2

在戰鬥程序隨機挑選兩個不同的項目,我有兩名球員在陣:從一個數組

players = [brad, josh] 

我想隨機選擇兩個不同的球員,其中之一將攻擊對方,示意地像這個:

random_player.attack(other_random_player) 

我想確保玩家不會自己攻擊。如果我這樣做:

players[rand(0..1)].attack(players[rand(0..1)]) 

有一個人可能會自己戰鬥的機會。我如何做到這一點,一旦第一個玩家被選中並與陣列中的其他玩家戰鬥?

+1

這是一個有點混亂。你說你有兩個隊員,然後你想隨機選擇兩個不同的隊員(而不是說你想選擇一個作爲攻擊者而另一個作爲防守隊員)。 @sawa從字面上解釋了這一點;其他人提供的答案假設陣列可能更大。另外,'players'的內容應該是符號或字符串。 「brad」不是Ruby對象,除非你的意思是它是一種我懷疑的方法。 –

回答

9

你可以使用.sample

match = players.sample(2); 
match[0].attack(match[1]); 

這將隨機挑選兩名球員從數組,然後你讓他們互相爭鬥。兩人都不會選擇同一名球員。

更乾淨:

p1, p2 = players.sample(2) 
p1.attack p2 
+3

這是那些只有一個好答案的問題之一,就是這樣。如果你寫了'p1,p2 = players.sample(2)',然後'p1.attack p2',可能會更清楚。你不需要分號。 –

+0

@CarySwoveland - 良好的通話,我沒有寫任何紅寶石在一段時間,它顯示 – dave

-2

你可以做這樣的事情:

players.delete_at(rand(players.length)).attack(players.sample) 

這樣,它會刪除從數組每次1名球員。如果你有兩名以上的球員,並且希望其中一名球員攻擊一名隨機的其他球員,那麼這種方法就行得通了。

或者您也可以做到這一點,如果你只會有2名球員:

players.delete_at(rand(players.length)).attack(players[0]) 
+0

你有什麼相當於'p1 = players.sample; p2 = players.sample; p1.attack p2'。這並不妨礙'p1'和'p2'成爲同一個玩家。 –

+0

「從陣列中移除一個玩家」不是'Array#sample'的事情。 – Amadan

+0

對不起,現在更新我的答案。 –

0

這是一個很好的用例爲Set的幾個原因:

  1. 玩家們的獨特
  2. 元素的順序無差別
  3. 如果您錯誤地嘗試將同一個播放器添加到Set中,您會立即受到保護。

下面是一個例子:

set = Set.new 
set << player1 
set << player2 
set.to_a.sample(2) 
1
attacker, attackee = players.shuffle 
attacker.atack(attackee) 
+1

「攻擊者」是一個很好的接觸。 –

+1

我認爲後衛更合適=) – Finks