bkimminich/kata-tcg

View on GitHub
tcg-java/src/main/java/de/kimminich/kata/tcg/Game.java

Summary

Maintainability
A
35 mins
Test Coverage
package de.kimminich.kata.tcg;

import de.kimminich.kata.tcg.strategy.AiStrategy;
import de.kimminich.kata.tcg.strategy.ConsoleInputStrategy;

import java.util.Random;
import java.util.logging.Logger;

public class Game {

    private static final Logger logger = Logger.getLogger(Game.class.getName());

    private Player activePlayer;
    private Player opponentPlayer;

    public Game(Player player1, Player player2) {
        this(player1, player2, new StartingPlayerChooser());
    }

    Game(Player player1, Player player2, StartingPlayerChooser startingPlayerChooser) {
        activePlayer = startingPlayerChooser.chooseBetween(player1, player2);
        if (activePlayer == player1) {
            opponentPlayer = player2;
        } else {
            opponentPlayer = player1;
        }
        activePlayer.drawStartingHand();
        opponentPlayer.drawStartingHand();
        opponentPlayer.drawCard(); // extra card to reduce disadvantage from being second to play
    }

    public void beginTurn() {
        activePlayer.giveManaSlot();
        activePlayer.refillMana();
        activePlayer.drawCard();
        logger.info(activePlayer + " plays turn...");
    }

    void switchPlayer() {
        Player previouslyActivePlayer = activePlayer;
        activePlayer = opponentPlayer;
        opponentPlayer = previouslyActivePlayer;
    }

    public void endTurn() {
        logger.info(activePlayer + " ends turn.");
        switchPlayer();
    }

    public Player getWinner() {
        if (activePlayer.getHealth() < 1) {
            return opponentPlayer;
        } else if (opponentPlayer.getHealth() < 1) {
            return activePlayer;
        } else {
            return null;
        }
    }

    public void run() {
        while (true) {
            if (getWinner() == null) {
                beginTurn();
                while (activePlayer.canPlayCards()) {
                    activePlayer.playCard(opponentPlayer);
                }
                endTurn();
            } else {
                logger.info(getWinner() + " wins the game!");
                break;
            }
        }
    }

    public Player getActivePlayer() {
        return activePlayer;
    }

    public Player getOpponentPlayer() {
        return opponentPlayer;
    }

    public static void main(String... args) {
        new Game(new Player("Human", new ConsoleInputStrategy()), new Player("CPU", new AiStrategy())).run();
    }

     static class StartingPlayerChooser {

         private Random random = new Random();

         public Player chooseBetween(Player player1, Player player2) {
            return random.nextBoolean() ? player1 : player2;
         }

     }

}