Skip to content

Commit 01937fd

Browse files
Merge pull request #643 from ChanderJindal/main
TicTacToe Hard
2 parents 3006b79 + 30fcb0f commit 01937fd

File tree

1 file changed

+200
-0
lines changed

1 file changed

+200
-0
lines changed
Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
class TicTacToe:
2+
def __init__(self,pick,sz=3):
3+
self.pick = pick
4+
self.dim_sz = sz
5+
self.board = self.ClearBoard()
6+
7+
def ClearBoard(self):
8+
board = [['blur' for i in range(self.dim_sz)] for j in range(self.dim_sz)]
9+
# made a 3x3 by-default board
10+
return board
11+
12+
def MoveRecord(self,r,c):
13+
if r > self.dim_sz or c > self.dim_sz:
14+
return "Out of Bounds"
15+
if self.board[r][c] != 'blur':
16+
return "Spot Pre-Occupied"
17+
self.board[r][c] = self.pick
18+
return True
19+
20+
def CheckWin(self):# 1 you won, 0 computer won, -1 tie
21+
22+
#Flag syntax -> first player no. , User is Player#1 ; Check set 1 -> row and '\' diagonal & Check set 2 -> col and '/' diagonal
23+
24+
25+
for i in range(0,self.dim_sz):#Rows
26+
flag11 = True
27+
flag21 = True
28+
29+
flag12 = True
30+
flag22 = True
31+
for j in range(0,self.dim_sz):
32+
33+
ch2 = self.board[i][j]
34+
ch1 = self.board[j][i]
35+
#Row
36+
if ch1 == self.pick:# if it's mine, computer didn't make it
37+
flag21 = False
38+
elif ch1 == 'blur':#if it's blank no one made it
39+
flag11 = False
40+
flag21 = False
41+
else: flag11 = False# else i didn't make it
42+
43+
if ch2 == self.pick:#Same but for Col
44+
flag22 = False
45+
elif ch2 == 'blur':
46+
flag12 = False
47+
flag22 = False
48+
else: flag12 = False
49+
50+
if flag11 is True or flag12 is True:# I won
51+
return 1
52+
if flag21 is True or flag22 is True:#Computer Won
53+
return 0
54+
55+
#Diagonals#
56+
flag11 = True
57+
flag21 = True
58+
59+
flag12 = True
60+
flag22 = True
61+
for i in range(0,self.dim_sz):
62+
63+
ch2 = self.board[i][i]
64+
ch1 = self.board[i][self.dim_sz-1-i]
65+
66+
if ch1 == self.pick:
67+
flag21 = False
68+
elif ch1 == 'blur':
69+
flag11 = False
70+
flag21 = False
71+
else:flag11 = False
72+
73+
if ch2 == self.pick:
74+
flag22 = False
75+
elif ch2 == 'blur':
76+
flag12 = False
77+
flag22 = False
78+
else:flag12 = False
79+
80+
if flag11 or flag12:
81+
return 1
82+
if flag21 or flag22:
83+
return 0
84+
85+
return -1
86+
87+
88+
def NextMove(self):
89+
AvailableMoves = []# will carry all available moves
90+
PlayerWinSpot = []#if player (user Wins)
91+
CompPick = 'O'
92+
if self.pick == 'O':
93+
CompPick = 'X'
94+
for i in range(0,self.dim_sz):
95+
for j in range(0,self.dim_sz):
96+
97+
if self.board[i][j] == 'blur':#BLANK
98+
t = (i,j)
99+
AvailableMoves.append(t)#add it to available moves
100+
self.board[i][j] = CompPick#Check if I (Computer can win)
101+
if self.CheckWin() ==0:#Best Case I(Computer) win!
102+
return i,j;
103+
self.board[i][j] = self.pick
104+
if self.CheckWin() == 1: #Second Best Case, he (player) didn't won
105+
PlayerWinSpot.append(t)
106+
self.board[i][j] = 'blur'
107+
108+
if len(PlayerWinSpot) != 0:
109+
self.board[PlayerWinSpot[0][0]] [PlayerWinSpot[0][1]] = CompPick
110+
return PlayerWinSpot[0][0],PlayerWinSpot[0][1]
111+
#print(AvailableMoves)
112+
if len(AvailableMoves) == 1:
113+
self.board[ AvailableMoves[0][0] ][ AvailableMoves[0][1] ] = CompPick
114+
return [ AvailableMoves[0][0] ],[ AvailableMoves[0][1] ]
115+
if len(AvailableMoves) == 0:
116+
return -1,-1
117+
118+
c1 , c2 = self.dim_sz//2,self.dim_sz//2
119+
#print(c1,c2,self.dim_sz)
120+
if (c1,c2) in AvailableMoves:#CENTER
121+
self.board[c1][c2] = CompPick
122+
return c1,c2
123+
for i in range(c1-1,-1,-1):#IN TO OUT
124+
gap = c1 - i
125+
#checking - 4 possibilities at max
126+
#EDGES
127+
if (c1-gap,c2-gap) in AvailableMoves:
128+
self.board[c1-gap][c2-gap] = CompPick
129+
return c1-gap,c2-gap
130+
if (c1-gap,c2+gap) in AvailableMoves:
131+
self.board[c1-gap][c2+gap] = CompPick
132+
return c1-gap,c2+gap
133+
if (c1+gap,c2-gap) in AvailableMoves:
134+
self.board[c1+gap][c2-gap] = CompPick
135+
return c1+gap,c2-gap
136+
if (c1+gap,c2+gap) in AvailableMoves:
137+
self.board[c1+gap][c2+gap] = CompPick
138+
return c1+gap,c2+gap
139+
140+
#Four Lines
141+
142+
for i in range(0,gap):
143+
if (c1-gap,c2-gap+i) in AvailableMoves:#TOP LEFT TO TOP RIGHT
144+
self.board[c1-gap][c2-gap+i] = CompPick
145+
return c1-gap,c2-gap+i
146+
if (c1+gap,c2-gap+i) in AvailableMoves:#BOTTOM LEFT TO BOTTOM RIGHT
147+
self.board[c1+gap][c2-gap+i] = CompPick
148+
return c1+gap,c2-gap+i
149+
if (c1-gap,c2-gap) in AvailableMoves:#LEFT TOP TO LEFT BOTTOM
150+
self.board[c1-gap+i][c2-gap] = CompPick
151+
return c1-gap+i,c2-gap
152+
if (c1-gap+i,c2+gap) in AvailableMoves:#RIGHT TOP TO RIGHT BOTTOM
153+
self.board[c1-gap+i][c2+gap] = CompPick
154+
return c1-gap+i,c2+gap
155+
156+
def Display(Game : TicTacToe):
157+
line1 = ""
158+
for i in range(0,Game.dim_sz):
159+
for j in range(0,Game.dim_sz-1):
160+
if Game.board[i][j] == 'blur':line1 = line1 + " |"
161+
else:line1 = line1 + " " + Game.board[i][j] + " |"
162+
if Game.board[i][Game.dim_sz-1] == 'blur':line1 = line1 + " \n"
163+
else:line1 = line1 + " " + Game.board[i][Game.dim_sz-1] + " \n"
164+
#line1 = line1 + " " + Game.board[i][Game.dim_sz-1] + "\n"
165+
print(line1,"\n\n")
166+
167+
168+
def play():
169+
Pick = input("Pick 'X' or 'O' ").strip().upper()
170+
if Pick == 'O':
171+
Game = TicTacToe("O")
172+
else: Game = TicTacToe("X")
173+
Display(Game=Game)
174+
while True:
175+
#Display(Game)
176+
temp = False
177+
while temp != True:
178+
move = list(map(int,input("Make A Move in Grid System from (0,0) to (2,2) ").split()) )
179+
temp = Game.MoveRecord(move[0],move[1])
180+
if temp != True:
181+
print(temp)
182+
183+
if Game.CheckWin() == 1:
184+
print("You Won!")
185+
break;
186+
print("Your Move:- ")
187+
Display(Game)
188+
C1,C2 = Game.NextMove()
189+
if C1 == -1 and C2 == -1:
190+
print("Game Tie!")
191+
break;
192+
if Game.CheckWin() == 0:
193+
print("You lost!")
194+
break;
195+
print("Computer's Move :-")
196+
Display(Game)
197+
198+
199+
if __name__ == "__main__":
200+
play()

0 commit comments

Comments
 (0)