Search code examples
javatic-tac-toe

Suggestion on Tic Tac Toe


I am designing my implementation strategy for Tic-Tac-Toe game. Since this is my 1st game implementation, I am a bit confused and need some general pointers.

Now, the total number of winning combinations in a Tic-Tac-Toe are 8. Currently, I plan to store these winning combinations in an array. Once the end user has made at least 3 moves, I would start checking if the Player has won the game by comparing the current positions used by a Player against this array. However, I am sure this is not an efficient way to check if the player has a winning combination.

Can anyone please suggest me on how to go about with design the logic for the game?


Solution

  • Don't worry about efficiency. I wrote a backtracking solution and there are only 549,945 possible game states. It takes less than 0.25 seconds to run through these on my laptop. Here was my logic to see if the game was over - clearly not very efficient, but it doesn't matter:

    private boolean isWinningMove(int row, int col) {
        int piece = board[row][col];
    
        // check current row
        boolean w = true;
        for (int x = 0; x < 3; x++) { w = w && (board[row][x] == piece); }
        if (w) { return true; }
    
        // check current column
        w = true;
        for (int x = 0; x < 3; x++) { w = w && (board[x][col] == piece); }
        if (w) { return true; }
    
        // check 0,0 diagonal
        w = true;
        for (int x = 0; x < 3; x++) { w = w && (board[x][x] == piece); }
        if (w) { return true; }
    
        // check 0,2 diagonal
        w = true;
        for (int x = 0; x < 3; x++) { w = w && (board[x][2 - x] == piece); }
        return w;
    }
    

    Here were my results, which match data on the Wikipedia page for tic-tac-toe:

    Moves Simulated: 549945
    Draws=46080   Player1-Wins=131184   Player2-Wins=77904
    Perfect Strategy Implies: Always a tie.
    
    Games won in 0 moves? 0
    Games won in 1 moves? 0
    Games won in 2 moves? 0
    Games won in 3 moves? 0
    Games won in 4 moves? 0
    Games won in 5 moves? 1440
    Games won in 6 moves? 5328
    Games won in 7 moves? 47952
    Games won in 8 moves? 72576
    Games won in 9 moves? 81792