Advertisement
TheRightGuy

TicTacToe 2.2

Feb 2nd, 2022
1,121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.86 KB | None | 0 0
  1. package tictactoe;
  2.  
  3. import java.util.*;
  4.  
  5. enum Player {
  6.     HUMAN("X"),
  7.     COMPUTER("O");
  8.  
  9.     private final String symbol;
  10.  
  11.     Player(String symbol) {
  12.         this.symbol = symbol;
  13.     }
  14.  
  15.     String getSymbol() {
  16.         return symbol;
  17.     }
  18.  
  19. }
  20. public class TicTacToe {
  21.  
  22.     private final Player[] grid = new Player[9];
  23.     private final Scanner input = new Scanner(System.in);
  24.  
  25.     public void start(){
  26.         gameLoop();
  27.     }
  28.  
  29.     private void gameLoop() {
  30.         while (hasWinner()) {
  31.             runHumansTurn();
  32.             if (isDraw()){
  33.                 System.out.println("DRAW");
  34.                 return;
  35.             }
  36.             runComputerTurn();
  37.             displayGrid();
  38.         }
  39.         getWinner();
  40.     }
  41.     private boolean hasWinner() {
  42.         if (isWinner(Player.HUMAN)) {
  43.             return false;
  44.         } else return !isWinner(Player.COMPUTER);
  45.     }
  46.  
  47.     private void runHumansTurn() {
  48.         int humanSelectedIndex;
  49.         System.out.println("Pick a number from 1 - 9 ");
  50.         humanSelectedIndex = input.nextInt();
  51.         while (isTileTaken(grid[humanSelectedIndex - 1])) {
  52.             System.out.println("Try again that tile is taken");
  53.             humanSelectedIndex = input.nextInt();
  54.         }
  55.         grid[humanSelectedIndex - 1] = Player.HUMAN;
  56.     }
  57.     private boolean isDraw() {
  58.         return Arrays.stream(grid).distinct().count() == 2 && grid.length == 8 && hasWinner();
  59.     }
  60.  
  61.     private void runComputerTurn() {
  62.         int computerSelectedIndex;
  63.         computerSelectedIndex = (int) (Math.random() * 9 + 1);
  64.         while (isTileTaken(grid[computerSelectedIndex-1])) {
  65.             computerSelectedIndex = (int) (Math.random() * 9 + 1);
  66.         }
  67.         grid[computerSelectedIndex-1] = Player.COMPUTER;
  68.     }
  69.  
  70.     private void displayGrid() {
  71.         for (int i = 0; i < grid.length; i++) {
  72.             if(isLastRowIndex(i)) {
  73.                 System.out.print(grid[i].getSymbol() + "\n");
  74.             }else {
  75.                 System.out.print(grid[i].getSymbol() + "|");
  76.             }
  77.         }
  78.     }
  79.  
  80.     private void getWinner() {
  81.         if(isWinner(Player.HUMAN)){
  82.             System.out.println("Player won");
  83.         }else{
  84.             System.out.println("Computer won");
  85.         }
  86.     }
  87.  
  88.     private boolean isTileTaken(Player playerTile) {
  89.         return  playerTile.equals(Player.HUMAN) || playerTile.equals(Player.COMPUTER);
  90.     }
  91.  
  92.     private boolean isLastRowIndex(int index) {
  93.         return index  == 2 || index == 5 || index == 8;
  94.     }
  95.  
  96.     private boolean isWinner(Player userCharacter) {
  97.         return hasWonHorizontally(userCharacter)
  98.                 || hasWonVertically(userCharacter)
  99.                 || hasWonDiagonally(userCharacter);
  100.     }
  101.  
  102.     private boolean hasWonDiagonally(Player userCharacter) {
  103.         return grid[0].equals(userCharacter) && grid[4].equals(userCharacter) && grid[8].equals(userCharacter)
  104.                 || grid[2].equals(userCharacter) && grid[4].equals(userCharacter) && grid[6].equals(userCharacter);
  105.     }
  106.  
  107.     private boolean hasWonVertically(Player userCharacter) {
  108.         return grid[0].equals(userCharacter) && grid[3].equals(userCharacter) && grid[6].equals(userCharacter)
  109.                 || grid[1].equals(userCharacter) && grid[4].equals(userCharacter) && grid[7].equals(userCharacter)
  110.                 || grid[2].equals(userCharacter) && grid[5].equals(userCharacter) && grid[8].equals(userCharacter);
  111.     }
  112.  
  113.     private boolean hasWonHorizontally(Player userCharacter) {
  114.         return grid[0].equals(userCharacter) && grid[1].equals(userCharacter) && grid[2].equals(userCharacter)
  115.                 || grid[3].equals(userCharacter) && grid[4].equals(userCharacter) && grid[5].equals(userCharacter)
  116.                 || grid[6].equals(userCharacter) && grid[7].equals(userCharacter) && grid[8].equals(userCharacter);
  117.     }
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement