首页 文章

如何找到有序列表中连续值最长的指标?

提问于
浏览
-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中最长的条纹,因为可能有多个骰子死于同样的 Value . 我想将整数传递给一个新的ArrayList来确定要保留哪个骰子(1用于保持0用于重新滚动) . 你能想到我能做到的一种方式,无论是在计算最长条纹的方法还是其他方式?

谢谢

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%,而最长条纹只有两次 .

相关问题