Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Python - TicTacToe Game
#!/usr/bin/python3
# Simple TicTacToe game in Python - EAO
import random
import sys
board=[i for i in range(0,9)]
player, computer = '',''
# Corners, Center and Others, respectively
moves=((1,7,3,9),(5,),(2,4,6,8))
# Winner combinations
winners=((0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6))
# Table
tab=range(1,10)
def print_board():
x=1
for i in board:
end = ' | '
if x%3 == 0:
end = ' \n'
if i != 1: end+='---------\n';
char=' '
if i in ('X','O'): char=i;
x+=1
print(char,end=end)
def select_char():
chars=('X','O')
if random.randint(0,1) == 0:
return chars[::-1]
return chars
def can_move(brd, player, move):
if move in tab and brd[move-1] == move-1:
return True
return False
def can_win(brd, player, move):
places=[]
x=0
for i in brd:
if i == player: places.append(x);
x+=1
win=True
for tup in winners:
win=True
for ix in tup:
if brd[ix] != player:
win=False
break
if win == True:
break
return win
def make_move(brd, player, move, undo=False):
if can_move(brd, player, move):
brd[move-1] = player
win=can_win(brd, player, move)
if undo:
brd[move-1] = move-1
return (True, win)
return (False, False)
# AI goes here
def computer_move():
move=-1
# If I can win, others don't matter.
for i in range(1,10):
if make_move(board, computer, i, True)[1]:
move=i
break
if move == -1:
# If player can win, block him.
for i in range(1,10):
if make_move(board, player, i, True)[1]:
move=i
break
if move == -1:
# Otherwise, try to take one of desired places.
for tup in moves:
for mv in tup:
if move == -1 and can_move(board, computer, mv):
move=mv
break
return make_move(board, computer, move)
def space_exist():
return board.count('X') + board.count('O') != 9
player, computer = select_char()
print('Player is [%s] and computer is [%s]' % (player, computer))
result='%%% Deuce ! %%%'
while space_exist():
print_board()
print('# Make your move ! [1-9] : ', end='')
move = int(input())
moved, won = make_move(board, player, move)
if not moved:
print(' >> Invalid number ! Try again !')
continue
#
if won:
result='*** Congratulations ! You won ! ***'
break
elif computer_move()[1]:
result='=== You lose ! =='
break;
print_board()
print(result)
@88amit77
Copy link

88amit77 commented Nov 15, 2019

osm logic.

@tamaa019
Copy link

tamaa019 commented Jan 22, 2020

Nice program!

@Calm-Mango
Copy link

Calm-Mango commented Jan 28, 2020

amazing content to learn from for beginners like me.

@Avishekp6460
Copy link

Avishekp6460 commented Apr 10, 2020

its showing error in move = int(input())
when ever we put any char value its shows error

@pd2399
Copy link

pd2399 commented Apr 12, 2020

Can you please help me with my code for tic-tac-toe (2 player). The output gets printed three times.
Here is the link to the code.
https://gist.github.com/pd2399/1d01dc31f87bd92ea8b674ad60e2430b

@PandaTobi
Copy link

PandaTobi commented Apr 24, 2020

@Avishekp6460 why are you inputting char values? if you wish to fix that (even there's no reason to), just implement a try-except statement.

@CaylusYT
Copy link

CaylusYT commented Aug 8, 2020

well this was useful!

@hariramn
Copy link

hariramn commented Sep 7, 2020

Hey can someone give me a logic walkthrough? or some resources that can be refered to?

@westernlabz
Copy link

westernlabz commented Oct 21, 2020

Very helpful, thanks

@muneerbrohi
Copy link

muneerbrohi commented Jun 14, 2021

can you use in this program that works restart the program use the if else condition or Y/N

@ErikVillarreal-bit
Copy link

ErikVillarreal-bit commented Nov 12, 2021

Thanks 😎

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment