1+ class NycharanXOGame :
2+ def __init__ (self ):
3+ self .game_dim = 3
4+ self .game_space = [[None for _ in range (self .game_dim )] for _ in range (self .game_dim )]
5+ self .players = [0 , 1 ]
6+ self .player_turn = 0
7+
8+ def reset (self ):
9+ self .game_space = [[None for _ in range (self .game_dim )] for _ in range (self .game_dim )]
10+ self .player_turn = 0
11+
12+ # turn this into calc_score function coz in 'NycharanXOGame' winner gets the more score than other player
13+
14+ def check_winner (self ):
15+ for i in range (self .game_dim ):
16+ if all (self .game_space [i ][j ] == self .game_space [i ][0 ] for j in range (1 ,self .game_dim )) and self .game_space [i ][0 ] != None :
17+ return self .game_space [i ][0 ]
18+ if all (self .game_space [j ][i ] == self .game_space [0 ][i ] for j in range (1 ,self .game_dim )) and self .game_space [0 ][i ] != None :
19+ return self .game_space [0 ][i ]
20+
21+ if all (self .game_space [j ][j ] == self .game_space [0 ][0 ] for j in range (1 ,self .game_dim )) and self .game_space [0 ][0 ] != None :
22+ return self .game_space [0 ][0 ]
23+ if all (self .game_space [j ][i ] if i + j == (self .game_dim - 1 ) else - 1 == self .game_space [0 ][(self .game_dim - 1 )] for j in range (1 ,self .game_dim )) and self .game_space [0 ][(self .game_dim - 1 )] != None :
24+ return self .game_space [0 ][(self .game_dim - 1 )]
25+
26+ for row in self .game_space :
27+ if None in row :
28+ return None
29+
30+ return "Tie"
31+
32+ def apply_move (self , row , col ):
33+ if self .game_space [row ][col ] != None :
34+ raise ValueError ("square is taken before make another move!" )
35+
36+ self .game_space [row ][col ] = self .players [self .player_turn ]
37+
38+ def switch_player (self ):
39+ self .player_turn = 1 - self .player_turn
40+
41+ def best_approach (self ):
42+ def minimax (game_space , maximize ):
43+ winner = self .check_winner ()
44+ if winner == self .players [1 ]:
45+ return 1
46+ elif winner == self .players [0 ]:
47+ return - 1
48+ elif winner == "Tie" :
49+ return 0
50+
51+ if maximize :
52+ max_score = - 1
53+ for i in range (self .game_dim ):
54+ for j in range (self .game_dim ):
55+ if game_space [i ][j ] == None :
56+ game_space [i ][j ] = self .players [1 ]
57+ score = minimax (game_space , False )
58+ game_space [i ][j ] = None
59+ max_score = max (max_score , score )
60+ return max_score
61+ else :
62+ max_score = - 1
63+ for i in range (self .game_dim ):
64+ for j in range (self .game_dim ):
65+ if game_space [i ][j ] == None :
66+ game_space [i ][j ] = self .players [0 ]
67+ score = minimax (game_space , True )
68+ game_space [i ][j ] = None
69+ max_score = min (max_score , score )
70+ return max_score
71+
72+ max_score = - 1
73+ max_move = (- 1 , - 1 )
74+ for i in range (self .game_dim ):
75+ for j in range (self .game_dim ):
76+ if self .game_space [i ][j ] == None :
77+ self .game_space [i ][j ] = self .players [1 ]
78+ score = minimax (self .game_space , False )
79+ self .game_space [i ][j ] = None
80+ if score > max_score :
81+ max_score = score
82+ max_move = (i , j )
83+ return max_move
84+
85+ game = NycharanXOGame ()
0 commit comments