Advertisement
TheRightGuy

Null

Feb 3rd, 2022
877
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.51 KB | None | 0 0
  1. enum Player {
  2.     HUMAN("X"),
  3.     COMPUTER("O");
  4.  
  5.     private final String symbol;
  6.  
  7.     Player(String symbol) {
  8.         this.symbol = symbol;
  9.     }
  10.  
  11.     String getSymbol() {
  12.         return symbol;
  13.     }
  14.  
  15. }
  16.  
  17. public class TicTacToe {
  18.  
  19.     private final Player[] grid = new Player[ROWS * COLS];
  20.     private final Scanner input = new Scanner(System.in);
  21.     private static final int COLS = 3;
  22.     private static final int ROWS = 3;
  23.  
  24.     public TicTacToe(){
  25.         displayGrid();
  26.     }
  27.  
  28.     public void start() {
  29.         gameLoop();
  30.     }
  31.  
  32.     private void gameLoop() {
  33.         while (hasWinner()) {
  34.             runHumansTurn();
  35.             if (isDraw()) {
  36.                 System.out.println("DRAW");
  37.                 return;
  38.             }
  39.             runComputerTurn();
  40.             displayGrid();
  41.         }
  42.         getWinner();
  43.     }
  44.  
  45.     private boolean hasWinner() {
  46.         if (isWinner(Player.HUMAN)) {
  47.             return false;
  48.         } else return !isWinner(Player.COMPUTER);
  49.     }
  50.  
  51.     private void runHumansTurn() {
  52.         System.out.println("Pick a number from 1 - 9 ");
  53.         int humanSelectedIndex = input.nextInt();
  54.         while (isTileTaken(grid[humanSelectedIndex - 1])) {
  55.             System.out.println("Try again that tile is taken");
  56.             humanSelectedIndex = input.nextInt();
  57.         }
  58.         grid[humanSelectedIndex - 1] = Player.HUMAN;
  59.     }
  60.  
  61.     private boolean isDraw() {
  62.         return Arrays.stream(grid).distinct().count() == 2 && grid.length == 8 && hasWinner();
  63.     }
  64.  
  65.     private void runComputerTurn() {
  66.         int computerSelectedIndex;
  67.         computerSelectedIndex = (int) (Math.random() * 9 + 1);
  68.         while (isTileTaken(grid[computerSelectedIndex - 1])) {
  69.             computerSelectedIndex = (int) (Math.random() * 9 + 1);
  70.         }
  71.         grid[computerSelectedIndex - 1] = Player.COMPUTER;
  72.     }
  73.  
  74.     private void displayGrid() {
  75.         for (int i = 0; i < grid.length; i++) {
  76.             String symbolText = grid[i] == null ? " " : grid[i].getSymbol();
  77.  
  78.             String delimiter = isLastRowIndex(i) ? "\n" : "|";
  79.  
  80.             System.out.print(symbolText + delimiter);
  81.         }
  82.     }
  83.  
  84.     private void getWinner() {
  85.         if (isWinner(Player.HUMAN)) {
  86.             System.out.println("Player won");
  87.         } else {
  88.             System.out.println("Computer won");
  89.         }
  90.     }
  91.  
  92.     private boolean isTileTaken(Player playerTile) {
  93.         return playerTile.equals(Player.HUMAN) || playerTile.equals(Player.COMPUTER);
  94.     }
  95.  
  96.     private boolean isLastRowIndex(int index) {
  97.         return index == 2 || index == 5 || index == 8;
  98.     }
  99.  
  100.     private boolean isWinner(Player userCharacter) {
  101.         return hasWonHorizontally(userCharacter)
  102.                 || hasWonVertically(userCharacter)
  103.                 || hasWonDiagonally(userCharacter);
  104.     }
  105.  
  106.     private boolean hasWonDiagonally(Player userCharacter) {
  107.         for (int col = 0; col < COLS; col++) {
  108.             boolean isColWon = true;
  109.             for (int row = 0; row < ROWS; row++) {
  110.                 int tileIndex = translateIndex(col, row);
  111.                 if (grid[tileIndex] != userCharacter) {
  112.                     isColWon = false;
  113.                     break;
  114.                 }
  115.             }
  116.  
  117.             if (isColWon) {
  118.                 return true;
  119.             }
  120.         }
  121.  
  122.         return false;
  123.     }
  124.  
  125.     private boolean hasWonVertically(Player userCharacter) {
  126.         for (int col = 0; col < COLS; col++) {
  127.             boolean isColWon = true;
  128.             for (int row = 0; row < ROWS; row++) {
  129.                 int tileIndex = translateIndex(row, col);
  130.                 if (grid[tileIndex] != userCharacter) {
  131.                     isColWon = false;
  132.                     break;
  133.                 }
  134.             }
  135.  
  136.             if (isColWon) {
  137.                 return true;
  138.             }
  139.         }
  140.         return false;
  141.     }
  142.  
  143.     private boolean hasWonHorizontally(Player userCharacter) {
  144.         for (int row = 0; row < ROWS; row++) {
  145.             boolean isRowWon = true;
  146.             for (int col = 0; col < COLS; col++) {
  147.                 int tileIndex = translateIndex(row, col);
  148.                 if (grid[tileIndex] != userCharacter) {
  149.                     isRowWon = false;
  150.                     break;
  151.                 }
  152.             }
  153.             if (isRowWon) {
  154.                 return true;
  155.             }
  156.         }
  157.         return false;
  158.     }
  159.  
  160.     private int translateIndex(int row, int col) {
  161.         return row * COLS + col;
  162.     }
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement