Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package tictactoe;
- import java.util.*;
- enum Player {
- HUMAN("X"),
- COMPUTER("O");
- private final String symbol;
- Player(String symbol) {
- this.symbol = symbol;
- }
- String getSymbol() {
- return symbol;
- }
- }
- public class TicTacToe {
- private final String[] grid = new String[9];
- private final Scanner input = new Scanner(System.in);
- public TicTacToe() {
- gameLoop();
- }
- private void gameLoop() {
- initializeGrid();
- while (hasWinner()) {
- runHumansTurn();
- if (isDraw()){
- System.out.println("DRAW");
- return;
- }
- runComputerTurn();
- displayGrid();
- }
- getWinner();
- }
- private void initializeGrid() {
- for (int i = 0; i < grid.length; i++) {
- grid[i] = String.valueOf(i + 1);
- }
- }
- private boolean hasWinner() {
- if (isWinner(Player.HUMAN.getSymbol())) {
- return false;
- } else return !isWinner(Player.COMPUTER.getSymbol());
- }
- private void runHumansTurn() {
- int human;
- System.out.println("Pick a number from 1 - 9 ");
- human = input.nextInt();
- while (isTileTaken(grid[human - 1])) {
- System.out.println("Try again that tile is taken");
- human = input.nextInt();
- }
- grid[human - 1] = Player.HUMAN.getSymbol();
- }
- private boolean isDraw() {
- return Arrays.stream(grid).distinct().count() == 2 && hasWinner();
- }
- private void runComputerTurn() {
- int computer;
- computer = (int) (Math.random() * 9 + 1);
- while (isTileTaken(grid[computer-1])) {
- computer = (int) (Math.random() * 9 + 1);
- }
- grid[computer-1] = Player.COMPUTER.getSymbol();
- }
- private void displayGrid() {
- for (int i = 0; i < grid.length; i++) {
- if(isLastRowIndex(i)) {
- System.out.print(grid[i] + "\n");
- }else {
- System.out.print(grid[i] + "|");
- }
- }
- }
- private void getWinner() {
- if(isWinner(Player.HUMAN.getSymbol())){
- System.out.println("Player won");
- }else{
- System.out.println("Computer won");
- }
- }
- private boolean isTileTaken(String playerTile) {
- return playerTile.equals(Player.HUMAN.getSymbol()) || playerTile.equals(Player.COMPUTER.getSymbol());
- }
- private boolean isLastRowIndex(int index) {
- return index == 2 || index == 5 || index == 8;
- }
- private boolean isWinner(String userCharacter) {
- return hasWonHorizontally(userCharacter)
- || hasWonVertically(userCharacter)
- || hasWonDiagonally(userCharacter);
- }
- private boolean hasWonDiagonally(String userCharacter) {
- return grid[0].equals(userCharacter) && grid[4].equals(userCharacter) && grid[8].equals(userCharacter)
- || grid[2].equals(userCharacter) && grid[4].equals(userCharacter) && grid[6].equals(userCharacter);
- }
- private boolean hasWonVertically(String userCharacter) {
- return grid[0].equals(userCharacter) && grid[3].equals(userCharacter) && grid[6].equals(userCharacter)
- || grid[1].equals(userCharacter) && grid[4].equals(userCharacter) && grid[7].equals(userCharacter)
- || grid[2].equals(userCharacter) && grid[5].equals(userCharacter) && grid[8].equals(userCharacter);
- }
- private boolean hasWonHorizontally(String userCharacter) {
- return grid[0].equals(userCharacter) && grid[1].equals(userCharacter) && grid[2].equals(userCharacter)
- || grid[3].equals(userCharacter) && grid[4].equals(userCharacter) && grid[5].equals(userCharacter)
- || grid[6].equals(userCharacter) && grid[7].equals(userCharacter) && grid[8].equals(userCharacter);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement