diff options
| author | pants <niklasjo2004@gmail.com> | 2026-09-21 14:16:34 -0700 |
|---|---|---|
| committer | pants <niklasjo2004@gmail.com> | 2026-09-21 14:16:34 -0700 |
| commit | 81ba9eb66f8284d8760012973f84cdbe617ceb94 (patch) | |
| tree | 466432644e9e3fd66ee183ec53a1f10abb1b7faa /c1/TicTacToe.java | |
Diffstat (limited to 'c1/TicTacToe.java')
| -rw-r--r-- | c1/TicTacToe.java | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/c1/TicTacToe.java b/c1/TicTacToe.java new file mode 100644 index 0000000..dd2343a --- /dev/null +++ b/c1/TicTacToe.java @@ -0,0 +1,132 @@ +// **THIS IS AN EXAMPLE IMPLEMENTATION!** +// Brett Wortzman +// CSE 123 +// C0: Abstract Strategy Games +// +// A class to represent a game of tic-tac-toe that implements the +// AbstractStrategyGame interface. +import java.util.*; + +public class TicTacToe extends AbstractStrategyGame { + private char[][] board; + private boolean isXTurn; + + // Constructs a new TicTacToe game. + public TicTacToe() { + board = new char[][]{{'-', '-', '-'}, + {'-', '-', '-'}, + {'-', '-', '-'}}; + isXTurn = true; + } + + // Returns whether or not the game is over. + public boolean isGameOver() { + return getWinner() >= 0; + } + + // Returns the index of the winner of the game. + // 1 if player 1 (X), 2 if player 2 (O), 0 if a tie occurred, + // and -1 if the game is not over. + public int getWinner() { + for (int i = 0; i < board.length; i++) { + // check row i + if (board[i][0] == board[i][1] && board[i][0] == board[i][2] && board[i][0] != '-') { + return board[i][0] == 'X' ? 1 : 2; + } + + // check col i + if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != '-') { + return board[0][i] == 'X' ? 1 : 2; + } + } + + // check diagonals + if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != '-') { + return board[0][0] == 'X' ? 1 : 2; + } + if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != '-') { + return board[0][2] == 'X' ? 1 : 2; + } + + // check for tie + for (int i = 0; i < board.length; i++) { + for (int j = 0; j < board[i].length; j++) { + if (board[i][j] == '-') { + // unfilled space; game not over + return -1; + } + } + } + + // it's a tie! + return 0; + } + + // Returns the index of which player's turn it is. + // 1 if player 1 (X), 2 if player 2 (O), -1 if the game is over + public int getNextPlayer() { + if (isGameOver()) { + return -1; + } + return isXTurn ? 1 : 2; + } + + // Given the input, places an X or an O where + // the player specifies. + // Throws an IllegalArgumentException if the position is + // invalid, whether that be out of bounds or already occupied. + // Board bounds are [0, 2] for both rows and cols. + public void makeMove(Scanner input) { + char currPlayer = isXTurn ? 'X' : 'O'; + + System.out.print("Row? "); + int row = input.nextInt(); + System.out.print("Column? "); + int col = input.nextInt(); + + makeMove(row, col, currPlayer); + isXTurn = !isXTurn; + } + + // Private helper method for makeMove. + // Given a row and col, as well as player index, + // places an X or an O in that row and col. + // Throws an IllegalArgumentException if the position is + // invalid, whether that be out of bounds or already occupied. + // Board bounds are [0, 2] for both rows and cols. + private void makeMove(int row, int col, char player) { + if (row < 0 || row >= board.length || + col < 0 || col >= board[0].length) { + throw new IllegalArgumentException("Invalid board position: " + row + "," + col); + } + + if (board[row][col] != '-') { + throw new IllegalArgumentException("Space already occupied: " + row + "," + col); + } + + board[row][col] = player; + } + + // Returns a String containing instructions to play the game. + public String instructions() { + String result = ""; + result += "Player 1 is X and goes first. Choose where to play by entering a row and\n"; + result += "column number, where (0, 0) is the upper left and (2, 2) is the lower right.\n"; + result += "Spaces show as a - are empty. The game ends when one player marks three spaces\n"; + result += "in a row, in which case that player wins, or when the board is full, in which\n"; + result += "case the game ends in a tie."; + return result; + } + + // Returns a String representation of the current state of the board. + public String toString() { + String result = ""; + for (int i = 0; i < board.length; i++) { + for (int j = 0; j < board.length; j++) { + result += board[i][j] + " "; + } + result += "\n"; + } + return result; + } +} |
