Есть ли способ отладки этой функции сортировки? - PullRequest
0 голосов
/ 05 июня 2019

Здравствуйте, я сейчас пытаюсь запрограммировать игру в покер, чтобы обучить своим навыкам Java.

Чтобы определить, какая лучшая возможная рука в игре (чтобы боты могли принимать правильные решения), я назначаю каждой возможной руке список целых чисел, которые зависят от того, какие карты у них в руке и какие карты находятся на поле. например, игрок, у которого стрит-флеш с наивысшей картой a 6, будет иметь список [8,6,0].

в которой 8 представляют стрит-флеш, а 6 - наивысшую карту флеша (последнее число служит только для двойной пары или фулл-хауса). У игрока, у которого есть пара из 10, будет список [1,10,0,0,12,0].

, в котором три первых числа представляют пару (1 представляют пару, а 10 - значение пары), а три последние цифры представляют самую высокую карту на руке игрока (0 для самой высокой карты и 12 для королевы).

в случае стрит-флеша не нужна старшая карта, поэтому список содержит только 3 целых числа.

Теперь проблема в том, что мой метод сортировки работает нормально, но иногда он дает мне ошибки (это метод, который я часто использую, так что, возможно, он не работает только 1 на 10000), и программа использует много случайное число, чтобы программа никогда не выполнялась дважды одинаково, и когда она не работает, есть два типа ошибок для одного и того же метода (иногда это один, а иногда другой):

"java.util.ConcurrentModificationException" и "java.lang.IndexOutOfBoundsException", но мои навыки Java не достаточно хороши, чтобы сказать мне, как с этим справиться.

Я попытался отладить его с помощью печати, но не нашел ничего неестественного. Система говорит мне, что ошибка исходит от этого метода, но я не уверен в этом

вот код, о котором идет речь

    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;

    }

(а карта это карта)

вот 2 ошибки:

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++){

При необходимости я могу показать другие части моего кода.

Спасибо за чтение моей проблемы и извините за мой английский.

1 Ответ

0 голосов
/ 05 июня 2019

Вы должны подумать о функции сравнения в вашем «списке рук», тогда у вас есть руки… (num игроков) и использовать интерфейс Comparable между «руками» и отсортировать «список рук». последний или первый будет победителем в зависимости от того, как вы используете Comparable для функции сортировки (сравните). если я понял цель вашей программы - определить победителя и проигравшего.

"рука" - это набор карт ... каждая рука имеет 5 карт, чтобы проверить, что у игрока есть в руке ... (от нуля до пары, пары, слияния, последовательности, сброса).

рука должна быть сопоставима с другой рукой. и это все.

суа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...