-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsuperTicTacToe.py.py
More file actions
188 lines (164 loc) · 5.34 KB
/
Copy pathsuperTicTacToe.py.py
File metadata and controls
188 lines (164 loc) · 5.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
import time
def printBoard(board):
print()
for k in range(3):
for i in range(0,3):
for j in range(0+3*k,3+3*k):
print(f"{board[j][i][0]}|{board[j][i][1]}|{board[j][i][2]}",end='' )
if (j+1)%3!=0:
print(" | ",end='')
print()
if (i+1)%3==0 and i!=8 and k!=2:
print(" "*7 + "|" + " "*9 + "|" + " "*7)
print("-"*26)
print(" "*7 + "|" + " "*9 + "|" + " "*7)
elif (i+1)%3 !=0:
print("-"*5 + " | " + "-----" + " | " + "-----")
print()
def checkValidMove(board, movePos):
movePos -= 1
i = movePos//3
j = movePos%3
if board[i][j] == ' ':
return True
return False
def updateBoard(board, movePos, turn):
movePos -= 1
i = movePos//3
j = movePos%3
board[i][j] = 'X' if turn else 'O'
def playerInput(board, boardNo):
if boardNo == 0 :
print("You can play in any mini board.")
# take input of board
while True:
try:
boardNo = int(input("Enter the mini board you want to play in(1-9): "))
except ValueError:
print("Invalid Input")
continue
try:
movePos = int(input("Enter the position you want to play in(1-9): "))
except ValueError:
print("Invalid Input")
continue
if 0<boardNo<=9 and 0<movePos<=9 and checkValidMove(board[boardNo-1], movePos):
break
else:
print("Not a valid move.Please enter another move.")
continue
else:
print(f"You have to play in mini board {boardNo}.")
while True:
try:
movePos = int(input("Enter the position you want to play in(1-9): "))
except ValueError:
print("Invalid Input")
continue
if 0<movePos<=9 and checkValidMove(board[boardNo-1], movePos):
break
else:
print("Not a valid move.Please enter another move.")
continue
return boardNo, movePos
def checkWin(board):
arr = [
[[0,0],[0,1],[0,2]],[[1,0],[1,1],[1,2]],[[2,0],[2,1],[2,2]],
[[0,0],[1,0],[2,0]],[[0,1],[1,1],[2,1]],[[0,2],[1,2],[2,2]],
[[0,2],[1,1],[2,0]],[[0,0],[1,1],[2,2]]
]
for i in range(8):
a=arr[i][0][0]
b=arr[i][0][1]
c=arr[i][1][0]
d=arr[i][1][1]
e=arr[i][2][0]
f=arr[i][2][1]
if (board[a][b]==board[c][d] and board[c][d]==board[e][f] and board[c][d]!=' '):
return True
return False
def updateBoardAfterWin(board, turn):
sym = 'X' if turn else 'O'
for i in range(3):
for j in range(3):
board[i][j] = sym
def checkDraw(board):
for mb in board:
for row in mb:
for ele in row:
if ele == ' ':
return False
return True
def checkWinWin(arr):
com = [[1,2,3],[4,5,6],[7,8,9],[1,4,7],[2,5,8],[3,6,9],[1,5,9],[3,5,7]]
if len(arr)<3:
return False
for set in com:
result = True
for ele in set:
if ele not in arr:
result = False
break
if result:
return result
return result
def main():
# essential variables
board = [
[[' ',' ',' '],[' ',' ',' '],[' ',' ',' ']],
[[' ',' ',' '],[' ',' ',' '],[' ',' ',' ']],
[[' ',' ',' '],[' ',' ',' '],[' ',' ',' ']],
[[' ',' ',' '],[' ',' ',' '],[' ',' ',' ']],
[[' ',' ',' '],[' ',' ',' '],[' ',' ',' ']],
[[' ',' ',' '],[' ',' ',' '],[' ',' ',' ']],
[[' ',' ',' '],[' ',' ',' '],[' ',' ',' ']],
[[' ',' ',' '],[' ',' ',' '],[' ',' ',' ']],
[[' ',' ',' '],[' ',' ',' '],[' ',' ',' ']]
]
turn = 1
boardNo = 0
movePos = 0
wins = {True:[], False:[]}
count = 0
# print empty board
printBoard(board)
# main game loop
while True:
if turn:
print(f"Player X's turn.")
else:
print(f"Player O's turn.")
# take player input
boardNo, movePos = playerInput(board, boardNo)
count+=1
print()
updateBoard(board[boardNo-1], movePos, turn)
printBoard(board)
# check if anyone won a mini board
if count>=5:
if checkWin(board[boardNo-1]):
print(f"Player {'X' if turn else 'O'} won one mini board. Updating board.", end='', flush = True)
for i in range(4):
time.sleep(0.5)
print('.', end='', flush = True)
updateBoardAfterWin(board[boardNo-1], turn)
print()
printBoard(board)
wins[turn].append(boardNo)
# check if anyone won the game
if checkWinWin(wins[turn]):
print("Game Over.")
print(f"Result - Player {'X' if turn else 'O'} Won.")
break
# check for draw
if checkDraw(board):
print("Game Over.")
print("Result - DRAW.")
break
if (movePos in wins[True]) or (movePos in wins[False]):
boardNo = 0
else:
boardNo = movePos
turn = not(turn)
if __name__ == "__main__":
main()