134 lines
3.4 KiB
Python
134 lines
3.4 KiB
Python
"""
|
|
----------------------------------------
|
|
Tic Tac Toe
|
|
----------------------------------------
|
|
This game is very popular amongst all of us a
|
|
nd even fun to build as a Python project. I am
|
|
pretty sure most of us know how to play it but
|
|
let me give a quick brush up.
|
|
|
|
It is a two-player game and consists of a nine-square
|
|
grid. Each player chooses their move and with O or X
|
|
and marks their square one at each chance. The player
|
|
who succeeds in making their marks all in one line whether
|
|
diagonally, horizontally, or vertically wins. The challenge
|
|
for the other player is to block the game for their opponent
|
|
and also to make their chain.
|
|
|
|
For building this project in Python who can use the Pygame
|
|
Python library that is loaded with all computer graphics and sounds.
|
|
----------------------------------------
|
|
"""
|
|
|
|
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 do not 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) |