Yes, we can do fun stuffs with python; it’s not always about the black screen. Tic-Tac-Toe, or Noughts and Crosses (as the British call it), is one of the simplest fun games to play. You can either play it online against a computer or enjoy it with a friend.
Here we have shown how to create the game in python. What we have here are three code buckets. The first one is for automatic tit-tac-toe: the computer plays against itself and you just watch. The second code lets you play against the computer, and the last code runs for you to play with a friend.
If you understand the python syntax already then the codes would not present much difficulty to grasp, just the numpy and random libraries were used.
Related article
How to use math functions in Python
Check out our guide on how to use Python functions if you want to refresh your knowledge about Python functions.
So let us look at the three code classes.
Table of Contents
Automatic Tic-Tac-Toe
I derive pleasure in watching my computer play against itself, it makes me feel like a robotics engineer.
# Tic-Tac-Toe Program using # random number in Python # importing all necessary libraries import numpy as np import random from time import sleep # Creates an empty board def create_board(): return(np.array([[0, 0, 0], [0, 0, 0], [0, 0, 0]])) # Check for empty places on board def possibilities(board): l = [] for i in range(len(board)): for j in range(len(board)): if board[i][j] == 0: l.append((i, j)) return(l) # Select a random place for the player def random_place(board, player): selection = possibilities(board) current_loc = random.choice(selection) board[current_loc] = player return(board) # Checks whether the player has three # of their marks in a horizontal row def row_win(board, player): for x in range(len(board)): win = True for y in range(len(board)): if board[x, y] != player: win = False continue if win == True: return(win) return(win) # Checks whether the player has three # of their marks in a vertical row def col_win(board, player): for x in range(len(board)): win = True for y in range(len(board)): if board[y][x] != player: win = False continue if win == True: return(win) return(win) # Checks whether the player has three # of their marks in a diagonal row def diag_win(board, player): win = True for x in range(len(board)): if board[x, x] != player: win = False return(win) # Evaluates whether there is # a winner or a tie def evaluate(board): winner = 0 for player in [1, 2]: if (row_win(board, player) or col_win(board,player) or diag_win(board,player)): winner = player if np.all(board != 0) and winner == 0: winner = -1 return winner # Main function to start the game def play_game(): board, winner, counter = create_board(), 0, 1 print(board) sleep(2) while winner == 0: for player in [1, 2]: board = random_place(board, player) print("Board after " + str(counter) + " move") print(board) sleep(2) counter += 1 winner = evaluate(board) if winner != 0: break return(winner) # Driver Code print("Winner is: " + str(play_game()))
Playing Tic-Tac-Toe with your Computer
They say humans are smarter than computers? Let a game be the judge.
(This code was written by Benjamin Ononugbu)
import time import random as r def makeboard(board): print(board[0],'|',board[1],'|',board[2]) print('--+---+--') print(board[3],'|',board[4],'|',board[5]) print('--+---+--') print(board[6],'|',board[7],'|',board[8]) def winning_checker(board,tom,user): row1 = [board[0],board[1],board[2]] row2 = [board[3],board[4],board[5]] row3 = [board[6],board[7],board[8]] col1 = [board[0],board[3],board[6]] col2 = [board[1],board[4],board[7]] col3 = [board[2],board[5],board[8]] dia1 = [board[0],board[4],board[8]] dia2 = [board[2],board[4],board[6]] for row in [row1,row2,row3,col1,col2,col3,dia1,dia2]: if row == [user,user,user]: return 'you win' break if row == [tom,tom,tom]: return 'computer wins' break def AI_simulator(board,tom,user,u): row1 = [board[0],board[1],board[2]] row2 = [board[3],board[4],board[5]] row3 = [board[6],board[7],board[8]] col1 = [board[0],board[3],board[6]] col2 = [board[1],board[4],board[7]] col3 = [board[2],board[5],board[8]] dia1 = [board[0],board[4],board[8]] dia2 = [board[2],board[4],board[6]] tabs = [row1,row2,row3,col1,col2,col3,dia1,dia2] for row in tabs: if row == [' ',tom,tom]: x = tabs.index(row) if x == 0: board[0] = tom if x == 1: board[3] = tom if x == 2: board[6] = tom if x == 3: board[0] = tom if x == 4: board[1] = tom if x == 5: board[2] = tom if x == 6: board[0] = tom if x == 7: board[2] = tom print('tom played:') makeboard(board) break elif row == [tom,' ',tom]: x = tabs.index(row) if x == 0: board[1] = tom if x == 1: board[4] = tom if x == 2: board[7] = tom if x == 3: board[3] = tom if x == 4: board[4] = tom if x == 5: board[5] = tom if x == 6: board[4] = tom if x == 7: board[4] = tom print('tom played:') makeboard(board) break elif row == [tom,tom,' ']: x = tabs.index(row) if x == 0: board[2] = tom if x == 1: board[5] = tom if x == 2: board[8] = tom if x == 3: board[6] = tom if x == 4: board[7] = tom if x == 5: board[8] = tom if x == 6: board[8] = tom if x == 7: board[6] = tom print('tom played:') makeboard(board) break if (row != [' ',tom,tom] and row != [tom,' ',tom] and row != [tom,tom,' ']): time.sleep(1) AI_block(board,tom,user) def AI_block(board,tom,user): row1 = [board[0],board[1],board[2]] row2 = [board[3],board[4],board[5]] row3 = [board[6],board[7],board[8]] col1 = [board[0],board[3],board[6]] col2 = [board[1],board[4],board[7]] col3 = [board[2],board[5],board[8]] dia1 = [board[0],board[4],board[8]] dia2 = [board[2],board[4],board[6]] tabs = [row1,row2,row3,col1,col2,col3,dia1,dia2] for row in tabs: if row == [' ',user,user]: x = tabs.index(row) if x == 0: board[0] = tom if x == 1: board[3] = tom if x == 2: board[6] = tom if x == 3: board[0] = tom if x == 4: board[1] = tom if x == 5: board[2] = tom if x == 6: board[0] = tom if x == 7: board[2] = tom print('tom played:') makeboard(board) break elif row == [user,' ',user]: x = tabs.index(row) if x == 0: board[1] = tom if x == 1: board[4] = tom if x == 2: board[7] = tom if x == 3: board[3] = tom if x == 4: board[4] = tom if x == 5: board[5] = tom if x == 6: board[4] = tom if x == 7: board[4] = tom print('tom played:') makeboard(board) break elif row == [user,user,' ']: x = tabs.index(row) if x == 0: board[2] = tom if x == 1: board[5] = tom if x == 2: board[8] = tom if x == 3: board[6] = tom if x == 4: board[7] = tom if x == 5: board[8] = tom if x == 6: board[8] = tom if x == 7: board[6] = tom print('tom played:') makeboard(board) break if (row != [' ',user,user] and row != [user,' ',user] and row != [user,user,' ']): AI_decisionbox(board,tom,user) def AI_decisionbox(board,tom,user): count = 0 for posn in range(9): if board[posn] == ' ': board[posn] = user row1 = [board[0],board[1],board[2]] row2 = [board[3],board[4],board[5]] row3 = [board[6],board[7],board[8]] col1 = [board[0],board[3],board[6]] col2 = [board[1],board[4],board[7]] col3 = [board[2],board[5],board[8]] dia1 = [board[0],board[4],board[8]] dia2 = [board[2],board[4],board[6]] tabs = [row1,row2,row3,col1,col2,col3,dia1,dia2] for row in tabs: if (row == [' ',user,user]) or (row == [user,' ',user]) or (row == [user,user,' ']): count += 1 if count >= 2: board[posn] = tom print('tom played:') makeboard(board) break else: board[posn] = ' ' count = 0 if count < 2: while True: n = r.choice([0,2,6,8]) if board[n] == ' ': board[n] = tom print('tom played: ') makeboard(board) break else: nu = r.randint(0,8) if board[nu] == ' ': board[nu] = tom print('tom played: ') makeboard(board) break while True: entry = input('choose between O and X: ') user = entry.upper() while user not in ['X','O','x','o']: print('X and O are the recommended markers') entry = input() user = entry.upper() if (user == 'X') or (user == 'x'): tom = 'O' else: tom = 'X' board = [' ',' ',' ',' ',' ',' ',' ',' ',' '] k = 0 u = 0 t = 0 corners = [0,2,6,8] while True: if k == 0: makeboard(board) num = int(input('choose a number between 0 and 8: ')) while True: if num > 8: print('number must be from 1 to 8') num = int(input('enter number again')) break while True: if board[num] != ' ': print('this number has been chosen please choose another') num =int(input()) else: board[num] = user print('you played:') makeboard(board) break if u >= 2: winning_checker(board,tom,user) if winning_checker(board,tom,user) == 'you win': time.sleep(1) print('you win') break u += 1 if k == 4: print('the game ends in a draw') break print('its tom turn') time.sleep(1) if t == 0: while True: if board[4] == ' ': board[4] = tom print('tom played:') makeboard(board) break elif board[4] != ' ': p = r.choice(corners) if board[p] == ' ': board[p] = tom print('tom played:') makeboard(board) break #else: #nu = r.randint(0,8) #if board[nu] == ' ': #board[nu] = tom #print('tom played: ') #makeboard(board) #break if t > 0: if t == 1: if (board[0] == user and board[8] == user) or (board[2] == user and board[6] == user): while True: q = r.choice([1,3,5,7]) if board[q] == ' ': board[q] = tom print('tom played:') makeboard(board) break else: AI_simulator(board,tom,user,u) winning_checker(board,tom,user) else: AI_simulator(board,tom,user,u) winning_checker(board,tom,user) if winning_checker(board,tom,user) == 'computer wins': print('tom wins') break t += 1 k += 1 time.sleep(1) print('Do you want to play again') time.sleep(1) reply = input('enter yes to play again: ') reply = reply.lower() if reply == 'yes': continue else: time.sleep(1) print('thank you for playing') break
Playing Tic-Tac-Toe with your friend
Do you have a friend around? Why not share the fun?
def tic_tac_toe(): board = [1, 2, 3, 4, 5, 6, 7, 8, 9] end = False win_commbinations = ((0, 1, 2), (3, 4, 5), (6, 7, 8), (0, 3, 6), (1, 4, 7), (2, 5, 8), (0, 4, 8), (2, 4, 6)) def draw(): print(board[0], board[1], board[2]) print(board[3], board[4], board[5]) print(board[6], board[7], board[8]) print() def p1(): n = choose_number() if board[n] == "X" or board[n] == "O": print("\nYou can't go there. Try again") p1() else: board[n] = "X" def p2(): n = choose_number() if board[n] == "X" or board[n] == "O": print("\nYou can't go there. Try again") p2() else: board[n] = "O" def choose_number(): while True: while True: a = input() try: a = int(a) a -= 1 if a in range(0, 9): return a else: print("\nThat's not on the board. Try again") continue except ValueError: print("\nThat's not a number. Try again") continue def check_board(): count = 0 for a in win_commbinations: if board[a[0]] == board[a[1]] == board[a[2]] == "X": print("Player 1 Wins!\n") print("Congratulations!\n") return True if board[a[0]] == board[a[1]] == board[a[2]] == "O": print("Player 2 Wins!\n") print("Congratulations!\n") return True for a in range(9): if board[a] == "X" or board[a] == "O": count += 1 if count == 9: print("The game ends in a Tie\n") return True while not end: draw() end = check_board() if end == True: break print("Player 1 choose where to place a cross") p1() print() draw() end = check_board() if end == True: break print("Player 2 choose where to place a nought") p2() print() if input("Play again (y/n)\n") == "y": print() tic_tac_toe() tic_tac_toe()
There you have it. The game is afoot!