2013-05-03 29 views
-1

我正在構建一個yahtzee遊戲的AI播放器,我現在要做的就是評估給予它的5個骰子(在一個已排序的ArrayList中),以決定獲得低/從當前位置直線高(例如,有1或2個滾筒);以及作爲結果持有哪個骰子。目前,我通過查找連續數字的最長連線並從那裏計算概率來實現概率。我遇到的問題是告訴計算機要保存哪些骰子。基本上我無法找到連勝的開始和結束。如何查找有序列表中最長連續值的標記?

我爲獲得最長的連勝方法是這樣的:

public Class checkStraight{ 

    private HashMap<Integer, Integer> dieFreq = new HashMap<Integer, Integer>();  
    private ArrayList<Die> dice = new ArrayList<Die>(); //Die has a method "getValue()" 
    // which returns the face value and a method roll() which assigns a random value. 

    public checkStraight(){ 
     for(Die d : dice){ 
      d.roll();  
     } 
     for(int i = 1; i<7; i++){ 
      dieFreq.put(i, 0); 
     } 
     buildMap(); 
    }  

    public void buildMap(){ 
     for(int i = 0; i<5; i++){ 
      dieFreq.put(dice.get(i).getValue(), dieFreq.get(dice.get(i).getValue()) + 1); 
     } 
    } 

    public int longestStreak(){ 
     int count = 1; 
     int highCount = 1; 
     for(int i = 1; i<6; i++){ 
      if(dieFreq.get(i) != 0 && dieFreq.get(i+1) != 0){ 
       count++; 
      } 
      else{ 
       if(count>highCount){ 
        highCount = count; 
       } 
      count = 1; 
     } 
     return highCount; 
    } 
} 

顯然,如果你打算爲一條直線,你應該保持每個連續的芯片之一,重擲別人,但我看不到一種方法來查找哪個骰子包含了Die的ArrayList中最長的條紋,因爲可能有多個骰子具有相同的值。 我想將整數傳遞到一個新的ArrayList來確定哪個骰子要保留(1爲保留0重新)。你能想到我能做到這一點的一種方法,無論是在計算最長連勝的方法還是其他方法?

感謝

回答

0

您的longestStreak()方法這些錯誤

1)計數應該在開始(和重置)零,沒有之一。

2)你的循環不包括6

for(int i=1; i<6; i++) { 

應該

for(int i=1; i<=6; i++) { 

戰略,即使是正確的最長連勝方法不會幫助你和你正在試圖解決的問題,因爲1,2,4,5每次得到直線的機率爲33%,而最長的連勝僅爲2。