Advertisement
TheRightGuy

TicTacToe 2.1

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