【问题标题】:Is there a way to debug this sorting function?有没有办法调试这个排序功能?
【发布时间】:2019-06-05 02:56:56
【问题描述】:

您好,我目前正在尝试编写一个扑克游戏来训练我的 Java 技能。

为了确定游戏中最好的手牌(以便机器人可以做出正确的决定),我为每手可能的牌分配了一个整数列表,这些整数取决于他们手上的牌和场上的牌 例如,一个玩家拿着同花顺的最大牌为 6 将在列表 [8,6,0] 中列出。

其中 8 代表同花,而 6 代表同花的最高牌(最后一个数字仅用于双对或满堂彩)。 拥有一对 10 的玩家将拥有列表 [1,10,0,0,12,0]。

其中前三个数字代表对子(1代表对子,10代表对子的价值),最后三个数字代表玩家手上最大的牌(0代表最大牌,12代表最大牌)为女王)。

在 straith flush 的情况下,不需要最高牌,因此列表仅包含 3 个整数。

现在,问题是我对它们进行排序的方法工作正常,但有时它会给我错误(这是一种我经常使用的方法,所以它可能只在 10000 中不起作用)并且程序使用了很多随机数,因此程序永远不会执行两次相同的操作,当它不起作用时,同一方法会出现两种类型的错误(有时是一种,有时是另一种):

“java.util.ConcurrentModificationException”和“java.lang.IndexOutOfBoundsException”但是我的java技能还不够好,无法告诉我如何处理。

我尝试使用 print 对其进行调试,但没有发现任何不自然的地方。 系统告诉我错误来自此方法,但我不确定

这是有问题的代码

    public List<Score> meilleurScore(List<Score> scores) {

        int x = 0;
        int y = 0;
        Joueur joueurGagnant;
        List<Score> scoresGagnants = new ArrayList<>();
        List<Score> toutLesScores = new ArrayList<>();
        List<Score> scoresPasEncoreFait = new ArrayList<>();
        List<Score> scoresEnCourse = new ArrayList<>();
        List<Integer> meilleureListe = new ArrayList<>();
        List<Score> scoresAEliminer = new ArrayList<>();

        scoresPasEncoreFait.addAll(scores);
        scoresEnCourse = equilibrerLesScores(scoresEnCourse);
        while (toutLesScores.size() < scores.size()) {

            // System.out.println(meilleureListe);
            meilleureListe.clear();
            // System.out.println(toutLesScores.size());
            // System.out.println(scoresPasEncoreFait.size());
            scoresEnCourse.clear();
            // scoresAEliminer.addAll(scoresEnCourse);
            scoresEnCourse.addAll(scoresPasEncoreFait);

            for (int j = 0; j < scoresEnCourse.get(0).integers.size(); j++) {
                meilleureListe.add(0);
                meilleureListe.add(0);
                meilleureListe.add(0);
            }

            if (scoresEnCourse.get(0).integers.size() > 0) {
                for (int i = 0; i < scoresEnCourse.get(0).integers.size(); i++) {

                    scoresEnCourse.removeAll(scoresAEliminer);
                    // System.out.println("3"+ scoresEnCourse);
                    scoresAEliminer.clear();

                    for (Score score : scoresEnCourse) {
                        // System.out.println(score.integers.get(i));
                        // System.out.println(meilleureListe.get(i));
                        // System.out.println("meilleur "+meilleureListe);

                        if (score.integers.get(i) < meilleureListe.get(i)) {

                            scoresAEliminer.add(score);
                        }
                        if ((score.integers.get(i) == meilleureListe.get(i)) && (!scoresGagnants.contains(score))) {
                            scoresGagnants.add(score);
                        }
                        if (score.integers.get(i) > meilleureListe.get(i)) {
                            for (Score score2 : scoresEnCourse) {
                                {
                                    if (score == score2) {
                                        break;
                                    }
                                    if ((score.integers.get(i) > score2.integers.get(i))
                                            && (!scoresAEliminer.contains(score2))) {
                                        scoresAEliminer.add(score2);
                                    }
                                }

                            }

                            scoresGagnants.clear();
                            scoresGagnants.add(score);
                            meilleureListe = score.integers;

                        }
                        if (scoresEnCourse.size() == 1) {
                            /* System.out.println("size==1 "+scoresEnCourse); */
                            toutLesScores.addAll(scoresEnCourse);
                            scoresPasEncoreFait.removeAll(scoresEnCourse);
                            scoresAEliminer.addAll(scoresEnCourse);

                        }

                    }

                }
                /* System.out.println("else "+scoresGagnants); */
                toutLesScores.addAll(scoresGagnants);
                scoresPasEncoreFait.removeAll(scoresGagnants);
                scoresAEliminer.addAll(scoresEnCourse);

            }

        }

        return toutLesScores;
    }

此方法使用“equilibrerLesScores”,即:

public List<Score> equilibrerLesScores(List<Score> scores){
    int x=0;
    for (Score score : scores){
        if (score.integers.size()>x){
            x=score.integers.size();
        }
    }
    for (Score score : scores){
        while (score.integers.size()<x){
            score.integers.add(0);
        }
    }
    return scores;
}

在我的代码中,分数定义为:

public Score(Carte carte1, Carte carte2, List<Integer> integers){
        this.carte1=carte1;
        this.carte2=carte2;
        this.integers=integers;

    }

(Carte 是一张卡片)

这里有两个错误:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
    at java.util.ArrayList$Itr.next(Unknown Source)
    at Table.meilleurScore(Table.java:596)
    at Table.trouverLeRangDeCetteMain(Table.java:656)
    at Table.chanceDeGagnerPlusTard(Table.java:1025)
    at Table.caractereDevin(Table.java:806)
    at Table.faireLesMises(Table.java:688)
    at Main.main(Main.java:60)

和

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.rangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at Table.meilleurScore(Table.java:582)
    at Table.trouverLeRangDeCetteMain(Table.java:656)
    at Table.chanceDeGagnerPlusTard(Table.java:997)
    at Table.caractereDevin(Table.java:806)
    at Table.faireLesMises(Table.java:688)
    at Main.main(Main.java:53)

(索引和大小不总是0) 第 596 行是:

for (Score score : scoresEnCourse){

第 582 行是:

    for (int i=0;i<scoresEnCourse.get(0).integers.size();i++){

如果需要,我可以显示我的代码的其他部分。

感谢您阅读我的问题并为我的英语感到抱歉。

【问题讨论】:

  • 在循环中,您有一个scoresEnCourse.clear();。如果执行,那么它将导致您看到的异常。也许通过添加到 scoresAEliminer 来替换该语句。
  • 我更改了它,但它仍然显示错误
  • 感谢您更改它 - 基本上,每当您迭代列表时,请避免在循环中更改该列表的元素。还要粘贴更新的代码,以便我们可以看到当前状态。正确格式化它会有很大帮助,正确缩进 - 这应该是你 IDE 中的一个简单按键(例如,在 windows 上的 eclipse 上,它只是 Ctrl-Shift-F)。
  • 我在帖子中编辑了它。

标签: java list sorting


【解决方案1】:

您应该在“手牌列表”上考虑一个比较器函数,然后您有手牌..(玩家人数)并使用“手牌”之间的 Comparable 接口并对“手牌列表”进行排序。最后一个或第一个将成为赢家,具体取决于您如何使用 Comparable 进行排序功能(比较)。如果我理解你的程序的目标是确定赢家和输家。

“手”是牌的集合...每手有 5 张牌来检查玩家手头的牌。(从无到对、对、满、顺序、同花)。

一只手必须与另一只手相当。就是这样。

是的。

【讨论】:

  • 每手牌都有一个分数,也就是视野……分数就是牌的组合。我想扑克游戏中复杂的是得分功能。因为也取决于每个西装。
猜你喜欢
  • 2021-06-22
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多