Final Project – Cisco NetAcad


What i did

  • A Tic-Tac-Toe game developed in Python featuring an automated bot opponent, created as the final assignment for the Cisco NetAcad course.

Results

A completly fuctional game developed in Python as a Final Project in the “Python Beginners” Cisco NetAcad course.

import time
import random

boardtictactoe = [["1", "2", "3"],
         
                  ["4", "5", "6"],
         
                  ["7", "8", "9"]]


def userletter():
    global usrletter
    usrletter = str(input('which letter do you want to be O or X: ')).upper()
    while usrletter not in ['X', 'O']: 
        print('select a valid Letter(x or o): ')
        usrletter = str(input('which letter do you want to be O or X: ')).upper()
        
        
def display_board(board):
    for row in range(3):
        print("+-------+-------+-------+")
        print("|       |       |       |")
        print(f"|   {board[row][0]}   |   {board[row][1]}   |   {board[row][2]}   |")
        print("|       |       |       |")
        print("+-------+-------+-------+")


def enter_move(board): 
    while True:
        try:
            usermove = int(input("enter your move (between 1-9): "))
            break
        except ValueError:
            print("Please enter a valid number between 1-9.")
            

    while usermove not in range(1, 10):
        print('PLEASE SELECT A VALID FIELD')
        usermove = int(input('enter your move (between 1-9): '))

    row = (usermove - 1) // 3
    col = (usermove - 1) % 3
    
    while board[row][col] in ["X", "O"]:
        print("Please select a free field.")
        usermove = int(input('enter your move (between 1-9): '))
        row = (usermove - 1) // 3
        col = (usermove - 1) % 3
    board[row][col] = usrletter
    

def make_list_of_free_fields(board):
    global freefieldlist
    freefieldlist = []
    count = 0
    for rows in range(0, 3):
        for cols in range(0,3):
            if board[rows][cols] not in ["X", "O"]:
                freefieldlist.append([rows, cols])
            else:
                count += 1
    freefields = 9 - count
    print('there are', freefields,"free fields left in the board")
    for r, c in freefieldlist:
        print('the free fields are: ', boardtictactoe[r][c])


def victory_for(board, sign):
    for row in range(3):
        if board[row][0] == sign and board[row][1] == sign and board[row][2] == sign:
            print(f'The winner is the letter {sign}')
            return True
        
    for col in range(3):
        if board[0][col] == sign and board[1][col] == sign and board[2][col] == sign:
            print(f'The winner is the letter {sign}')
            return True
        
    if board[0][0] == sign and board[1][1] == sign and board[2][2] == sign:
            print(f'The winner is the letter {sign}')
            return True
    if board[0][2] == sign and board[1][1] == sign and board[2][0] == sign:
            print(f'The winner is the letter {sign}')
            return True
        
    return False

def draw_move(board):
    global machineletter
    if usrletter == 'X':
        machineletter = 'O'
    else:
        machineletter = 'X'
    board[1][1] = machineletter
    

def randommachinemove(board):
    rs, cl = random.choice(freefieldlist)
    board[rs][cl] = machineletter
def game():
    print('THE GAME STARTS...')
    userletter()
    time.sleep(1)
    print('MACHINE TURN...')
    draw_move(boardtictactoe)
    display_board(boardtictactoe)
    time.sleep(1)
    while not (victory_for(boardtictactoe, 'X') or victory_for(boardtictactoe, 'O')):
        print('USER TURN...')
        time.sleep(1)
        display_board(boardtictactoe)
        make_list_of_free_fields(boardtictactoe)
        enter_move(boardtictactoe)
        if victory_for(boardtictactoe, 'X') or victory_for(boardtictactoe, 'O'):
            display_board(boardtictactoe)
            break
        if not freefieldlist:
            print("It's a draw!")
            break
        time.sleep(1)
        print('MACHINE TURN...')
        time.sleep(1)
        display_board(boardtictactoe)
        make_list_of_free_fields(boardtictactoe)
        randommachinemove(boardtictactoe)
        time.sleep(1)
        if not freefieldlist:
            print("It's a draw!")
            break


if __name__ == "__main__":
    game()