CardPile指数超出范围

时间:2015-04-05 20:30:51

标签: java indexoutofboundsexception

我目前正在尝试将我的代码转换为ArrayList,而我似乎无法使其正常工作。我正在运行整个程序,它告诉我索引输出界限。我确定忘记为卡添加阵列的大小,但我不知道如何添加它。谢谢你的帮助!

编辑:我得到的错误在底部。此外,它告诉我转到removeTop方法。那里看起来很好。

import java.util.Random;
import java.util.List;
import java.util.ArrayList;

public class CardPile {
    private ArrayList<Card> cards = new ArrayList<Card>();
    private static Random r = new Random(1);

    public void addToBottom(Card c) {
        if (this.cards.size() == 52) {
            System.out.println("The CardPile is full. You cannot add any more Card objects.");
        }
        this.cards.add(c);
    }

    public Card removeCard(Card c) {
        if (this.cards.contains(c)) {
            this.cards.remove(c);
        }
        return null;
    }

    public Card removeTop() {
        return this.cards.remove(0);
    }

    public int searchValue(int value) {
        int count = 0,
        for (int i = 0;i < this.cards.size();i++) {  
            if (this.cards.get(i).getValue() == value) {
                count++;
            }
        } 
        //System.out.println("Count = "+count);
        return count;
    }
    public Card[] removeAll(int value) 

        //System.out.println("(removeAll) cards ="+ cards);
        int count = searchValue(value);
        Card[] removed = new Card[count];
        int deletedCount = 0;
        int i = 0;
        while (deletedCount < count) {
            if (this.cards.get(i).getValue() == value) {
                removed[deletedCount] = this.cards.remove(i);
                deletedCount++;
            } else {
                i++;
            }
        }
        return removed;
    }
    public int getNumberCards() {
        return this.cards.size();
    }
    public String toString() {
        if (this.cards.isEmpty()) {
            return "";
        }
        String builder = "";
        for (int i = 0;i < this.cards.size() - 1;i++) {
            builder = builder + this.cards.get(i) + ", ";
        }
        builder = builder + this.cards.get(this.cards.size() - 1);
        return builder;
    }
    public void shuffle() {
        if (this.cards.isEmpty()) {
            return;
        }
        for (int count = 0; count < 100000;count++) {
            int i = r.nextInt(this.cards.size());
            int j = r.nextInt(this.cards.size());
            Card temp = this.cards.get(i);
            this.cards.set(i, this.cards.get(j));
            this.cards.set(j, temp);
        }
    }
    public static CardPile makeFullDeck() {
        CardPile deck = new CardPile();
        for (int suit = 0;suit < 4;suit++) {
            for (int value = 1; value <= 13;value++) {
                deck.addToBottom(new Card(suit, value));
            }
        }
        deck.shuffle();
        return deck;
    }
}

**Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.rangeCheck(ArrayList.java:653)
    at java.util.ArrayList.remove(ArrayList.java:492)
    at CardPile.removeTop(CardPile.java:40)
    at GoFish.dealCards(GoFish.java:112)
    at GoFish.main(GoFish.java:13)**

编辑: 这是Player类:

public class Player {
    private boolean[] books;
    private CardPile pile;

    private static int MAXIMUM_VALUE_CARD = 13;

    public Player()
    {
        this.pile = new CardPile();
        this.books = new boolean[13]; //by default all are false
    }

    public boolean hasCard(int value)
    {
        return this.pile.searchValue(value) > 0;
    }

    public Card[] removeAll(int value)
    {
        return this.pile.removeAll(value);
    }

    public void addAll(Card[] cards)
    {
        for (int i = 0; i < cards.length; i++)
        {
            this.pile.addToBottom(cards[i]);
        }
    }

    //optional additional method
    public void addCard(Card card)
    {
        this.pile.addToBottom(card);
    }

    public int getNumberCards()
    {
        return this.pile.getNumberCards();
    }

    public int countBooks()
    {
        int count = 0;
        for (int i = 0; i < MAXIMUM_VALUE_CARD; i++)
        {
            if (books[i])
            {
                count++;
            }
        }

        return count;
    }

    public void addBook(int value)
    {
        this.books[value - 1] = true;
    }

    public void printHand()
    {
        System.out.println("Player's hand is " + this.pile);
    }
}

这是GoFish课程:

import java.util.Scanner;
public class GoFish {
    private static Scanner reader;

    public static void main(String[] args)
    {
        System.out.println("How many players?");
        reader = new Scanner(System.in);
        int numberPlayers = reader.nextInt();
        Player[] players = createPlayersArray(numberPlayers);
        int currentTurn = 0;
        CardPile deck = CardPile.makeFullDeck();
        dealCards(deck, players);
        int maximumRetries = 2;
        int numRetries = 0;
        while(deck.getNumberCards() > 0 && players[currentTurn].getNumberCards() > 0)
        {
            updateBooks(players[currentTurn]);

            if (numRetries == maximumRetries)
            {
                numRetries = 0;
                currentTurn++;

                if (currentTurn == numberPlayers)
                {
                    currentTurn = 0;
                }
            }

            System.out.println("Player " + currentTurn + ", here is your hand. What card would you like to ask for?");
            players[currentTurn].printHand();
            int queryCard = reader.nextInt();
            System.out.println("And from whom would you like to get it from?");
            int queryPlayer = reader.nextInt();

            if (queryCard < 1 || queryCard > 13 || queryPlayer < 0 || queryPlayer >= numberPlayers || queryPlayer == currentTurn)
            {
                System.out.println("Invalid entries. Please retry");
                numRetries++;
            }
            else
            {
                numRetries = 0;
                boolean hasCard = players[queryPlayer].hasCard(queryCard);
                if (hasCard)
                {
                    System.out.println("Cards found!");
                    Card[] removed = players[queryPlayer].removeAll(queryCard);
                    players[currentTurn].addAll(removed);
                }
                else
                {                                    
                    System.out.println("Go fish!");
                    Card top = deck.removeTop();
                    System.out.println("You drew " + top);
                    players[currentTurn].addCard(top);

                    //check to make sure this extra card didn't form a book
                    //Note this could happen even if it doesn't match the card they were asking about
                    updateBooks(players[currentTurn]);

                    if (top.getValue() == queryCard)
                    {
                        System.out.println("You successfully went fishing!");
                    }
                    else
                    {
                        currentTurn++;

                        if (currentTurn == numberPlayers)
                        {
                            currentTurn = 0;
                        }
                    }
                }
            }
        }

        //calculate the winner now
        int maxPlayer = 0;
        int maxPlayerBooks = players[0].countBooks();
        for (int i = 1; i < numberPlayers; i++)
        {
            int currentBooks = players[i].countBooks();
            if (currentBooks > maxPlayerBooks)
            {
                maxPlayer = i;
                maxPlayerBooks = currentBooks;
            }
        }

        System.out.println("Congratulations! Player " + maxPlayer + " you have won the game by accumulating " + maxPlayerBooks + " books!");
    }

    private static Player[] createPlayersArray(int numPlayers)
    {
        Player[] players = new Player[numPlayers];
        for (int i = 0; i < numPlayers; i++)
        {
            players[i] = new Player();
        }

        return players;
    }

    private static void dealCards(CardPile deck, Player[] players)
    {
        final int NUMBER_CARDS_PER_PLAYER = 7;
        for (int i = 0; i < NUMBER_CARDS_PER_PLAYER * players.length; i++)
        {
            Card next = deck.removeTop();
            players[i % players.length].addCard(next);
        }
    }

    private static void updateBooks(Player player)
    {
        for (int i = 1; i <= 13; i++)
        {
            //alternative option would be to modify the hasCard method to return an int instead of boolean. Then we could just count (this is probably better design)
            Card[] valued = player.removeAll(i);
            if (valued.length == 4)
            {
                player.addBook(i);
            }
            else
            {
                player.addAll(valued);
            }
        }
    }
}

0 个答案:

没有答案