Advertisement
TheRightGuy

Advice?

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