-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 表示重新滚动)。你们有谁能想到我可以做到这一点的方法,无论是在计算最长连胜的方法中还是其他方式?

谢谢

4

1 回答 1

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 次。

于 2013-05-03T13:55:09.110 回答