如何在有序列表中找到连续值最长运行的索引?

时间:2013-05-03 13:47:54

标签: java arraylist hashmap artificial-intelligence

我正在为一个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;
    }
}

显然,如果你想要一个笔直,你应该持有每个连续骰子中的一个并重新注册其他骰子,但是我找不到一种方法来找到哪个骰子包含DieList中最长的条纹,因为它可能具有不止一个具有相同价值的骰子。 我想将整数传递给一个新的ArrayList来确定要保留哪个骰子(1用于保持0用于重新滚动)。你能否想到我能做到的一种方式,无论是在计算最长条纹的方法还是其他方式?

由于

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。