Возникли проблемы с кодом, как повторно инициализировать плеер

Поэтому, когда я запускаю код (есть еще 5 файлов, которые идут с этим), предполагается, что карточная игра будет длиться до 10 раундов и определить победителя. Однако я дохожу только до первого раунда, а затем он заканчивается. Мне помогли разобраться в том, что могло быть не так. Мне нужно повторно инициализировать мой плеер, чтобы он перестал Исключение нулевого указателя

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

public class Game
{
    private static deckOfCards deck = new deckOfCards();
    private static ArrayList<Card> table = new ArrayList<>();
    private static Card topCard;
    private static Player p1 = new Player("Player One");
    private static Player p2 = new Player("Player Two");
    private static Player currentPlayer = p1;

    private static int rounds = 1;
    private static boolean gameOver = false;
  
    public static void startGame()
    {
        System.out.println("Starting game now:");
        
        dealCards();
        chooseFirstPlayer();
        playRounds();
        declareWinner();
    }

    public static void dealCards()
    {
        for (int i = 0; i < 26; i++)
        {
            p1.takeCard(deck.deal());
            p2.takeCard(deck.deal());
        }
    }

    public static void chooseFirstPlayer()
    {
        Random r = new Random();
        int n = r.nextInt(2);
        
        if (n == 1)
        {
            Player temp = p1;
            p1 = p2;
            p2 = temp;
        }
    }

    public static void playRounds()
    {
        while (rounds <= 10 && (gameOver == false))
        {
            System.out.println("Round " + rounds);
            System.out.println();
            showHand();
            playRound();
            rounds++;
        }
    }

    public static void playRound()
    {
        boolean suitMatch = false;
        Card cardToPlay;

        if ((p1.handSize() == 52) || (p2.handSize() == 52))
        {
            gameOver = true;
        }

        while (suitMatch == false)
        {
            cardToPlay = currentPlayer.playCard();
            table.add(cardToPlay);
            suitMatch = checkSuitMatch();

            if (suitMatch == false)
                switchCurrentPlayer();
        }
        collectCards();
        System.out.println();


        try
        {
            Thread.sleep(500);
        }

        catch (InterruptedException e){
        }
    }

    public static void switchCurrentPlayer()
    {
        if (currentPlayer == p1)
            currentPlayer = p2;
        else if (currentPlayer == p2)
            currentPlayer = p1;
    }

    public static boolean checkSuitMatch()
    {
        int tableSize = table.size();
        int lastSuit;
        int topSuit;

        if (tableSize < 2)
        {
            return false;
        }
        
        else
        {
            lastSuit = table.get(tableSize - 1).getSuit();
            topSuit = table.get(tableSize - 2).getSuit();
        }

        if (lastSuit == topSuit)
        {
            System.out.println();
            System.out.println(currentPlayer.getName() + " wins the round!");
            System.out.println();
            
            return true;
        }
        return false;
    }

    public static void collectCards()
    {
        System.out.print(currentPlayer.getName() + " takes the table (" + table.size() + "): ");
        displayTable();

        for (int i = 0; i < table.size(); i++)
        {
            Card cardToTake = table.get(i);
            currentPlayer.takeCard(cardToTake);
        }
        table.clear();
    }

    public static void displayTable()
    {
        for (int i = 0; i < table.size(); i++)
        {
            if (table.get(i) != null)
            {
                System.out.print(table.get(i).getName() + " ");
            }
        }
        System.out.println();
        System.out.println();
    }

    public static void showHand()
    {
        p1.showHand();
        p2.showHand();
    }

    public static void declareWinner()
    {
        if (p1.handSize() > p2.handSize())
        {
            System.out.println(p1.getName().toUpperCase() + " wins " + "by having " + p1.handSize() + " cards!");
        }
        
        else if (p2.handSize() > p1.handSize())
        {
            System.out.println(p2.getName().toUpperCase() + " wins " + "by having " + p2.handSize() + " cards!");
        }

        else
        {
            System.out.println("It's a draw.");
        }
        System.out.println();
    }

    public static void main(String[] args)
    {
        startGame();
    }
}

Вот мой класс игрока на всякий случай:


public class Player
{
    private Hand hand; //for the player's hand
    private String name;
    
    //Constructors
    public Player(String name)
    {
        hand = new Hand();
        this.name = name;
    }
    
    //prints and determines the card the player will play
    public Card playCard()
    {
        Card playerCard = hand.playCard();
        System.out.println(String.format("%5s", name) + playerCard.getName());
        return playerCard;
    }
    
    //takes the card if player can match
    public void takeCard(Card card)
    {
        hand.addCard(card);
    }
    
    public String getName()
    {
        return name;
    }
    
    //how the hand of player
    public void showHand()
    {
        System.out.println(name + " hand " + hand.getSize() + ":");
        hand.show();
        System.out.println();
    }
    
    //get the size of players' hand
    public int handSize()
    {
        return hand.getSize();
    }
    
}

Добро пожаловать в SO. Пожалуйста, прочтите Как спросить и особенно обратите внимание, что когда вы спрашиваете об исключениях (например, о вашем NullPointerException), вам необходимо опубликовать трассировку стека (укажите, какие строки кода, которые вы опубликовали, перечислены там).

Thomas 30.03.2021 08:30

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

Jack Flamp 30.03.2021 08:34
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
26
0

Другие вопросы по теме