Projects
This commit is contained in:
134
TikTacToe.py
Normal file
134
TikTacToe.py
Normal file
@@ -0,0 +1,134 @@
|
||||
"""
|
||||
----------------------------------------
|
||||
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)
|
||||
Reference in New Issue
Block a user