Learn Python the Fun Way

Build a Tic-Tac-Toe Game!

Tic-Tac-Toe

Learn to Create a Tic-Tac-Toe Game in Python!

Are you ready to take your Python skills to the next level? Today, we're going to create a fun and simple Tic-Tac-Toe game in Python. This step-by-step guide is perfect for beginners, and by the end, you'll have a fully functioning game to show off to your friends!

 

What You'll Learn:

  1. Basic Python Syntax: Brush up on variables, loops, and functions.

  2. 2D Lists: Understand how to use lists to create the game board.

  3. User Input: Learn how to get input from players.

  4. Game Logic: Implement the rules and determine the winner.

  5. Code Organization: Structure your code for readability and reusability.

 

Let's get started!

 

Step 1: Setting Up the Game Board

First, we'll create a 3x3 grid to represent the Tic-Tac-Toe board. We'll use a 2D list in Python for this.

 

def create_board():

    return [[' ' for in range(3)] for in range(3)]

 

def print_board(board):

    for row in board:

        print('|'.join(row))

        print('-' * 5)

Explanation:

  • create_board Function: This function creates a 3x3 grid, represented as a list of lists. Each cell in the grid is initially set to a space (' '), indicating it's empty.

  • print_board Function: This function prints the current state of the board. It loops through each row, joins the elements with a vertical bar (|), and prints them. The dashes (-) create separation between the rows for better readability.

Step 2: Player Input

We need a way for players to place their marks ('X' or 'O') on the board.

 

def get_move(player):

    while True:

        try:

            row = int(input(f"Player {player}, enter the row (0-2): "))

            col = int(input(f"Player {player}, enter the column (0-2): "))

            if row in range(3) and col in range(3):

                return row, col

            else:

                print("Invalid input. Please enter numbers between 0 and 2.")

        except ValueError:

            print("Invalid input. Please enter numbers.")

Explanation:

get_move Function: This function asks the player for their move. It uses a loop to repeatedly prompt the player until valid input is received.

  • The try block attempts to convert the player's input to integers.

  • If the input is not within the range (0-2) or is not a number, the function prints an error message and asks for input again.

Step 3: Updating the Board

Next, we'll write a function to update the board with the player's move.

 

def update_board(board, row, col, player):

    if board[row][col] == ' ':

        board[row][col] = player

        return True

    else:

        print("This spot is already taken. Try another one.")

        return False

Explanation:

update_board Function: This function updates the board with the player's move.

  • It first checks if the chosen cell is empty.

  • If it is, the function places the player's mark ('X' or 'O') in the cell and returns True.

  • If the cell is already taken, it prints a message and returns False, prompting the player to choose another cell.

 

Step 4: Checking for a Winner

We need a function to check if there is a winner after each move.

 

def check_winner(board):

    # Check rows and columns

    for i in range(3):

        if board[i][0] board[i][1] board[i][2] != ' ':

            return board[i][0]

        if board[0][i] board[1][i] board[2][i] != ' ':

            return board[0][i]

 

    # Check diagonals

    if board[0][0] board[1][1] board[2][2] != ' ':

        return board[0][0]

    if board[0][2] board[1][1] board[2][0] != ' ':

        return board[0][2]

 

    return None

Explanation:

check_winner Function: This function checks if there's a winner after each move.

  • It first checks all rows and columns to see if any contain the same non-empty mark.

  • It then checks the two diagonals for the same condition.

  • If a winning condition is found, it returns the winner's mark ('X' or 'O'). Otherwise, it returns None.

Step 5: Putting It All Together

Let's combine everything into a main game loop.

 

def tic_tac_toe():

    board = create_board()

    current_player = 'X'

 

    for _ in range(9):

        print_board(board)

        row, col = get_move(current_player)

 

        if update_board(board, row, col, current_player):

            winner = check_winner(board)

            if winner:

                print_board(board)

                print(f"Player {winner} wins!")

                return

            current_player = 'O' if current_player == 'X' else 'X'

 

    print_board(board)

    print("It's a draw!")

 

# Start the game

tic_tac_toe()

Explanation:

tic_tac_toe Function: This is the main function that brings everything together.

  • It starts by creating the board and setting the current player to 'X'.

  • It uses a loop to allow up to 9 moves (the maximum in a 3x3 Tic-Tac-Toe game).

  • Within the loop, it prints the board, gets the player's move, and updates the board.

  • After each valid move, it checks for a winner. If a winner is found, it prints the final board and announces the winner.

  • If no winner is found after 9 moves, it prints the board and declares a draw.

Congratulations!

You've just created a Tic-Tac-Toe game in Python! 🎉 Give yourself a pat on the back. Now you can challenge your friends to a game.

 

Want more fun and educational Python projects? Subscribe to our newsletter and get a FREE Python cheat sheet to boost your coding skills even further!

Happy coding! 🖥️

 

# Sample output when running the game

Tic-Tac-Toe in Python Code