Игра Баккара с массивами выдает исключение после нескольких раундов - PullRequest
0 голосов
/ 27 марта 2019

Я почти закончил игру, но я не уверен, почему она падает после нескольких раундов. Я считаю, что это как-то связано с тем, как написан класс колод. Это было предоставлено учителем, но мне, возможно, придется это исправить.

Я подумал, что, возможно, после нескольких раундов массивы слишком переполнены или что-то в этом роде, поэтому я попытался добавить метод, чтобы очистить их. Это не сработало, и я не думаю, что это проблема, но я не уверен.


class deck{

    private String [] cards = {"A","K","Q","J","10","9","8","7","6","5","4","3","2"};
    private int cardCount = 1;
    private boolean isShuffled = false;

    //**********Shuffle cards method****************************
    private void shuffleCards(){//shuffle cards method

        for (int i = 0; i < cards.length; i++) {
            int index = (int)(Math.random() * 13);
            String temp = cards[i];
            cards[i] = cards[index];
            cards[index] = temp;
        }
        isShuffled = true;
    }

    //********Ensure the cards get shuffled before dealing******
    public String getCards(){

        if (isShuffled == true){
            cardCount++;
            return cards[cardCount];
        }
        else {
            shuffleCards();//shuffle if they have not
            cardCount++;
            return cards[cardCount];
        }
    }

    //********Show cards method*********************************
    public void showCards(String [] theirCards){

        for (int i = 0; i < theirCards.length; i++) {
            if(theirCards[i] == null){
                continue;
            }
            System.out.print(theirCards[i] + " ");
        }
    }

    public void clearCards(){
        cards = null;
        cards = null;
    }

    //*******Card value method**********************************
    public int getCardValues(String tempChar){

        int indValues = 1;

        switch (tempChar){
            case "A": indValues = 1; break;
             blah blah blah
            case "3": indValues = 3; break;
            case "2": indValues = 2;

        }
        return indValues;
    }
}

Я ожидаю, что игра будет повторяться до тех пор, пока я не уйду или не закончу деньги из-за ставок, но вместо этого примерно через 3 игры я получаю эту ошибку:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 13
    at deck.getCards(Baccarat.java:248)
    at playerObjects.setComputersCards(Baccarat.java:177)
    at Baccarat.main(Baccarat.java:19)

1 Ответ

0 голосов
/ 27 марта 2019

Две очевидные проблемы:

Во-первых, cardCount инициализируется в 1 (как упоминалось ранее).Во-вторых, в методе getCards () cardCount увеличивается до возврата карты.Чтобы это исправить, вы должны инициализировать cardCount -1, а не 1.

Как и сейчас, вы всегда пропускаете первые две карты в своей колоде, поэтому у вас есть только 11 карт, а не 13, которые вы предполагаете,Вероятно, поэтому вы переходите к индексу примерно в третьем раунде - руки Баккары обычно составляют от 2 до 3 карт для каждого игрока и банка, так что складывается.

Решение

Во-первых, вы должны инициализировать cardCount -1.Во-вторых, в качестве отказоустойчивого вы должны изменить метод getCards () для проверки вашего cardCount, и, если он уже равен 12, рассмотрите возможность установки его в -1 и повторного перетасовки карт перед выполнением карты приращения / возврата.Другими словами, пусть колода сама управляется, чтобы избежать выхода индекса за пределы.

...