Building a Tic-Tac-Toe Game in Python
In this tutorial, we’ll create a simple Tic-Tac-Toe game in Python where a user can play against the computer. The computer will make random moves.
Overview
Tic-Tac-Toe is a classic game played on a 3x3 grid. The objective is to place three of your marks in a horizontal, vertical, or diagonal row to win the game.
Prerequisites
- Basic knowledge of Python programming
- Python installed on your machine
Step-by-Step Guide
Step 1: Create the Game Board
First, we’ll create a function to print the game board. The board is a 3x3 grid represented as a list of lists.
def print_board(board):
    for row in board:
        print(" | ".join(row))
        print("-" * 5)
Step 2: Check for a Win
Next, we need to check if a player has won. We’ll create a function that checks all rows, columns, and diagonals.
def check_win(board, player):
    # Check rows
    for row in board:
        if all([spot == player for spot in row]):
            return True
    # Check columns
    for col in range(3):
        if all([board[row][col] == player for row in range(3)]):
            return True
    # Check diagonals
    if all([board[i][i] == player for i in range(3)]):
        return True
    if all([board[i][2 - i] == player for i in range(3)]):
        return True
    return False
Step 3: Check for a Draw
We also need a function to check if the game is a draw (i.e., the board is full and there is no winner).
def check_draw(board):
    return all([spot in ['X', 'O'] for row in board for spot in row])
Step 4: Get Empty Positions
To help the computer make a move, we’ll create a function that returns a list of empty positions on the board.
def get_empty_positions(board):
    empty_positions = []
    for row in range(3):
        for col in range(3):
            if board[row][col] == " ":
                empty_positions.append((row, col))
    return empty_positions
Step 5: Computer’s Move
We’ll create a function for the computer to make a random move from the available positions.
def computer_move(board):
    empty_positions = get_empty_positions(board)
    return random.choice(empty_positions)
Step 6: Main Game Logic
Finally, we’ll combine everything into the main function that handles the game flow, alternating turns between the user and the computer.
import random
def print_board(board):
    for row in board:
        print(" | ".join(row))
        print("-" * 5)
def check_win(board, player):
    # Check rows
    for row in board:
        if all([spot == player for spot in row]):
            return True
    # Check columns
    for col in range(3):
        if all([board[row][col] == player for row in range(3)]):
            return True
    # Check diagonals
    if all([board[i][i] == player for i in range(3)]):
        return True
    if all([board[i][2 - i] == player for i in range(3)]):
        return True
    return False
def check_draw(board):
    return all([spot in ['X', 'O'] for row in board for spot in row])
def get_empty_positions(board):
    empty_positions = []
    for row in range(3):
        for col in range(3):
            if board[row][col] == " ":
                empty_positions.append((row, col))
    return empty_positions
def computer_move(board):
    empty_positions = get_empty_positions(board)
    return random.choice(empty_positions)
def tic_tac_toe():
    board = [[" " for _ in range(3)] for _ in range(3)]
    current_player = "X"  # User is 'X', computer is 'O'
    while True:
        print_board(board)
        if current_player == "X":
            row = int(input("Enter the row (0, 1, or 2): "))
            col = int(input("Enter the column (0, 1, or 2): "))
        else:
            row, col = computer_move(board)
            print(f"Computer chose: {row}, {col}")
        if board[row][col] != " ":
            print("Spot already taken. Try again.")
            continue
        board[row][col] = current_player
        if check_win(board, current_player):
            print_board(board)
            if current_player == "X":
                print("Player wins!")
            else:
                print("Computer wins!")
            break
        if check_draw(board):
            print_board(board)
            print("It's a draw!")
            break
        current_player = "O" if current_player == "X" else "X"
if __name__ == "__main__":
    tic_tac_toe()
Running the Game Save the script to a file, for example, tic_tac_toe.py Run the script using Python 3:
python tic_tac_toe.py
The user plays as “X” and the computer plays as “O”. The game will alternate turns between the user and the computer, and will announce the result once there is a winner or a draw.
Example of playing game
python tic_tac_toe.py
  |   |  
-----
  |   |  
-----
  |   |  
-----
Enter the row (0, 1, or 2): 0
Enter the column (0, 1, or 2): 1
  | X |  
-----
  |   |  
-----
  |   |  
-----
Computer chose: 0, 0
O | X |  
-----
  |   |  
-----
  |   |  
-----
Enter the row (0, 1, or 2): 0
Enter the column (0, 1, or 2): 2
O | X | X
-----
  |   |  
-----
  |   |  
-----
Computer chose: 2, 2
O | X | X
-----
  |   |  
-----
  |   | O
-----
Enter the row (0, 1, or 2): 2
Enter the column (0, 1, or 2): 0
O | X | X
-----
  |   |  
-----
X |   | O
-----
Computer chose: 1, 2
O | X | X
-----
  |   | O
-----
X |   | O
-----
Enter the row (0, 1, or 2): 1
Enter the column (0, 1, or 2): 1
O | X | X
-----
  | X | O
-----
X |   | O
-----
Player wins!
(py38) python tic_tac_toe.py
  |   |  
-----
  |   |  
-----
  |   |  
-----
Enter the row (0, 1, or 2): 0
Enter the column (0, 1, or 2): 0
X |   |  
-----
  |   |  
-----
  |   |  
-----
Computer chose: 2, 2
X |   |  
-----
  |   |  
-----
  |   | O
-----
Enter the row (0, 1, or 2): 0
Enter the column (0, 1, or 2): 1
X | X |  
-----
  |   |  
-----
  |   | O
-----
Computer chose: 1, 2
X | X |  
-----
  |   | O
-----
  |   | O
-----
Enter the row (0, 1, or 2): 1
Enter the column (0, 1, or 2): 1
X | X |  
-----
  | X | O
-----
  |   | O
-----
Computer chose: 1, 0
X | X |  
-----
O | X | O
-----
  |   | O
-----
Enter the row (0, 1, or 2): 0
Enter the column (0, 1, or 2): 0
Spot already taken. Try again.
X | X |  
-----
O | X | O
-----
  |   | O
-----
Enter the row (0, 1, or 2): 2
Enter the column (0, 1, or 2): 0
X | X |  
-----
O | X | O
-----
X |   | O
-----
Computer chose: 0, 2
X | X | O
-----
O | X | O
-----
X |   | O
-----
Computer wins!
Conclusion
Congratulations! You’ve successfully created a Tic-Tac-Toe game in Python. This game can be further enhanced by improving the computer’s strategy or adding a graphical user interface. Happy coding!