Skip to content

Instantly share code, notes, and snippets.

@eaorak
Created October 27, 2012 21:18
  • Star 21 You must be signed in to star a gist
  • Fork 19 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save eaorak/3966315 to your computer and use it in GitHub Desktop.
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)
@Calm-Mango
Copy link

amazing content to learn from for beginners like me.

@Avishekp6460
Copy link

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

@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

Very helpful, thanks

@muneerbrohi
Copy link

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

@ErikSamuelVT
Copy link

Thanks 😎✌

@ariaamadeus
Copy link

you know what, you can beat this AI with 4, 2, 5, 8. again and again

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