1
+ from tkinter import *
2
+ from tkinter import messagebox
3
+
4
+ root = Tk ()
5
+ root .title ('Tic Tac Toe Game' )
6
+
7
+ # Player 1 [X] starts first, Player 2 [O] continues
8
+ clicked = True
9
+ count = 0
10
+
11
+ # To disable all the buttons when someone has won the game
12
+ def disableButtons ():
13
+ button1 .config (state = DISABLED )
14
+ button2 .config (state = DISABLED )
15
+ button3 .config (state = DISABLED )
16
+
17
+ button4 .config (state = DISABLED )
18
+ button5 .config (state = DISABLED )
19
+ button6 .config (state = DISABLED )
20
+
21
+ button7 .config (state = DISABLED )
22
+ button8 .config (state = DISABLED )
23
+ button9 .config (state = DISABLED )
24
+
25
+ # To check whether did anyone won the game and restart the game when someone won the game
26
+ def checkWinner ():
27
+ global winner
28
+ winner = False
29
+
30
+ # Player 1 [X] winning patterns
31
+ if button1 ["text" ] == "X" and button2 ["text" ] == "X" and button3 ["text" ] == "X" :
32
+ button1 .config (bg = "#80ffaa" ) #[X][X][X]
33
+ button2 .config (bg = "#80ffaa" ) #[O][O][ ]
34
+ button3 .config (bg = "#80ffaa" ) #[ ][ ][ ]
35
+ winner = True
36
+ messagebox .showinfo ("Tic Tac Toe" , "Player 1 is the Winner!" )
37
+ disableButtons
38
+ start ()
39
+
40
+ elif button4 ["text" ] == "X" and button5 ["text" ] == "X" and button6 ["text" ] == "X" :
41
+ button4 .config (bg = "#80ffaa" ) #[O][O][ ]
42
+ button5 .config (bg = "#80ffaa" ) #[X][X][X]
43
+ button6 .config (bg = "#80ffaa" ) #[ ][ ][ ]
44
+ winner = True
45
+ messagebox .showinfo ("Tic Tac Toe" , "Player 1 is the Winner!" )
46
+ disableButtons
47
+ start ()
48
+
49
+ elif button7 ["text" ] == "X" and button8 ["text" ] == "X" and button9 ["text" ] == "X" :
50
+ button7 .config (bg = "#80ffaa" ) #[ ][ ][ ]
51
+ button8 .config (bg = "#80ffaa" ) #[O][O][ ]
52
+ button9 .config (bg = "#80ffaa" ) #[X][X][X]
53
+ winner = True
54
+ messagebox .showinfo ("Tic Tac Toe" , "Player 1 is the Winner!" )
55
+ disableButtons
56
+ start ()
57
+
58
+ elif button1 ["text" ] == "X" and button4 ["text" ] == "X" and button7 ["text" ] == "X" :
59
+ button1 .config (bg = "#80ffaa" ) #[X][O][ ]
60
+ button4 .config (bg = "#80ffaa" ) #[X][O][ ]
61
+ button7 .config (bg = "#80ffaa" ) #[X][ ][ ]
62
+ winner = True
63
+ messagebox .showinfo ("Tic Tac Toe" , "Player 1 is the Winner!" )
64
+ disableButtons
65
+ start ()
66
+
67
+ elif button2 ["text" ] == "X" and button5 ["text" ] == "X" and button8 ["text" ] == "X" :
68
+ button2 .config (bg = "#80ffaa" ) #[O][X][ ]
69
+ button5 .config (bg = "#80ffaa" ) #[O][X][ ]
70
+ button8 .config (bg = "#80ffaa" ) #[ ][X][ ]
71
+ winner = True
72
+ messagebox .showinfo ("Tic Tac Toe" , "Player 1 is the Winner!" )
73
+ disableButtons
74
+ start ()
75
+
76
+ elif button3 ["text" ] == "X" and button6 ["text" ] == "X" and button9 ["text" ] == "X" :
77
+ button3 .config (bg = "#80ffaa" ) #[ ][O][X]
78
+ button6 .config (bg = "#80ffaa" ) #[ ][O][X]
79
+ button9 .config (bg = "#80ffaa" ) #[ ][ ][X]
80
+ winner = True
81
+ messagebox .showinfo ("Tic Tac Toe" , "Player 1 is the Winner!" )
82
+ disableButtons
83
+ start ()
84
+
85
+ elif button1 ["text" ] == "X" and button5 ["text" ] == "X" and button9 ["text" ] == "X" :
86
+ button1 .config (bg = "#80ffaa" ) #[X][O][ ]
87
+ button5 .config (bg = "#80ffaa" ) #[ ][X][ ]
88
+ button9 .config (bg = "#80ffaa" ) #[ ][O][X]
89
+ winner = True
90
+ messagebox .showinfo ("Tic Tac Toe" , "Player 1 is the Winner!" )
91
+ disableButtons
92
+ start ()
93
+
94
+ elif button3 ["text" ] == "X" and button5 ["text" ] == "X" and button7 ["text" ] == "X" :
95
+ button3 .config (bg = "#80ffaa" ) #[ ][O][X]
96
+ button5 .config (bg = "#80ffaa" ) #[ ][X][ ]
97
+ button7 .config (bg = "#80ffaa" ) #[X][O][ ]
98
+ winner = True
99
+ messagebox .showinfo ("Tic Tac Toe" , "Player 1 is the Winner!" )
100
+ disableButtons
101
+ start ()
102
+
103
+ # Player 2 [O] winning patterns
104
+ elif button1 ["text" ] == "O" and button2 ["text" ] == "O" and button3 ["text" ] == "O" :
105
+ button1 .config (bg = "#80ffaa" ) #[O][O][O]
106
+ button2 .config (bg = "#80ffaa" ) #[X][X][ ]
107
+ button3 .config (bg = "#80ffaa" ) #[X][ ][ ]
108
+ winner = True
109
+ messagebox .showinfo ("Tic Tac Toe" , "Player 2 is the Winner!" )
110
+ disableButtons
111
+ start ()
112
+
113
+ elif button4 ["text" ] == "O" and button5 ["text" ] == "O" and button6 ["text" ] == "O" :
114
+ button4 .config (bg = "#80ffaa" ) #[X][X][ ]
115
+ button5 .config (bg = "#80ffaa" ) #[O][O][O]
116
+ button6 .config (bg = "#80ffaa" ) #[X][ ][ ]
117
+ winner = True
118
+ messagebox .showinfo ("Tic Tac Toe" , "Player 2 is the Winner!" )
119
+ disableButtons
120
+ start ()
121
+
122
+ elif button7 ["text" ] == "O" and button8 ["text" ] == "O" and button9 ["text" ] == "O" :
123
+ button7 .config (bg = "#80ffaa" ) #[X][ ][ ]
124
+ button8 .config (bg = "#80ffaa" ) #[X][X][ ]
125
+ button9 .config (bg = "#80ffaa" ) #[O][O][O]
126
+ winner = True
127
+ messagebox .showinfo ("Tic Tac Toe" , "Player 2 is the Winner!" )
128
+ disableButtons
129
+ start ()
130
+
131
+ elif button1 ["text" ] == "O" and button4 ["text" ] == "O" and button7 ["text" ] == "O" :
132
+ button1 .config (bg = "#80ffaa" ) #[O][X][X]
133
+ button4 .config (bg = "#80ffaa" ) #[O][X][ ]
134
+ button7 .config (bg = "#80ffaa" ) #[O][ ][ ]
135
+ winner = True
136
+ messagebox .showinfo ("Tic Tac Toe" , "Player 2 is the Winner!" )
137
+ disableButtons
138
+ start ()
139
+
140
+ elif button2 ["text" ] == "O" and button5 ["text" ] == "O" and button8 ["text" ] == "O" :
141
+ button2 .config (bg = "#80ffaa" ) #[X][O][X]
142
+ button5 .config (bg = "#80ffaa" ) #[X][O][ ]
143
+ button8 .config (bg = "#80ffaa" ) #[ ][O][ ]
144
+ winner = True
145
+ messagebox .showinfo ("Tic Tac Toe" , "Player 2 is the Winner!" )
146
+ disableButtons
147
+ start ()
148
+
149
+ elif button3 ["text" ] == "O" and button6 ["text" ] == "O" and button9 ["text" ] == "O" :
150
+ button3 .config (bg = "#80ffaa" ) #[X][X][O]
151
+ button6 .config (bg = "#80ffaa" ) #[ ][X][O]
152
+ button9 .config (bg = "#80ffaa" ) #[ ][ ][O]
153
+ winner = True
154
+ messagebox .showinfo ("Tic Tac Toe" , "Player 2 is the Winner!" )
155
+ disableButtons
156
+ start ()
157
+
158
+ elif button1 ["text" ] == "O" and button5 ["text" ] == "O" and button9 ["text" ] == "O" :
159
+ button1 .config (bg = "#80ffaa" ) #[O][X][X]
160
+ button5 .config (bg = "#80ffaa" ) #[ ][O][ ]
161
+ button9 .config (bg = "#80ffaa" ) #[ ][X][O]
162
+ winner = True
163
+ messagebox .showinfo ("Tic Tac Toe" , "Player 2 is the Winner!" )
164
+ disableButtons
165
+ start ()
166
+
167
+ elif button3 ["text" ] == "O" and button5 ["text" ] == "O" and button7 ["text" ] == "O" :
168
+ button3 .config (bg = "#80ffaa" ) #[X][X][O]
169
+ button5 .config (bg = "#80ffaa" ) #[ ][O][ ]
170
+ button7 .config (bg = "#80ffaa" ) #[O][X][ ]
171
+ winner = True
172
+ messagebox .showinfo ("Tic Tac Toe" , "Player 2 is the Winner!" )
173
+ disableButtons
174
+ start ()
175
+
176
+ # To check whether the game is a draw
177
+ def checkDraw ():
178
+ global count , winner
179
+
180
+ if count == 9 and winner == False :
181
+ messagebox .showerror ("Tic Tac Toe" , "Draw, play again!" )
182
+ start ()
183
+
184
+ # To determine the buttons that Player 1 or Player 2 has clicked on
185
+ def buttonClicked (button ):
186
+ global clicked , count
187
+
188
+ if button ["text" ] == " " and clicked == True :
189
+ button ["text" ] = "X"
190
+ clicked = False
191
+ count += 1
192
+ checkWinner ()
193
+ checkDraw ()
194
+ elif button ["text" ] == " " and clicked == False :
195
+ button ["text" ] = "O"
196
+ clicked = True
197
+ count += 1
198
+ checkWinner ()
199
+ checkDraw ()
200
+ else :
201
+ messagebox .showerror ("Tic Tac Toe" , "Please select another box." )
202
+
203
+ # To start or restart the game
204
+ def start ():
205
+ global button1 , button2 , button3 , button4 , button5 , button6 , button7 , button8 , button9
206
+ global clicked , count
207
+ clicked = True
208
+ count = 0
209
+
210
+ # Building the buttons for the game
211
+ button1 = Button (root , text = " " , font = ("Helvetica, 20" ), height = 3 , width = 7 , bg = "SystemButtonFace" , command = lambda : buttonClicked (button1 ))
212
+ button2 = Button (root , text = " " , font = ("Helvetica, 20" ), height = 3 , width = 7 , bg = "SystemButtonFace" , command = lambda : buttonClicked (button2 ))
213
+ button3 = Button (root , text = " " , font = ("Helvetica, 20" ), height = 3 , width = 7 , bg = "SystemButtonFace" , command = lambda : buttonClicked (button3 ))
214
+
215
+ button4 = Button (root , text = " " , font = ("Helvetica, 20" ), height = 3 , width = 7 , bg = "SystemButtonFace" , command = lambda : buttonClicked (button4 ))
216
+ button5 = Button (root , text = " " , font = ("Helvetica, 20" ), height = 3 , width = 7 , bg = "SystemButtonFace" , command = lambda : buttonClicked (button5 ))
217
+ button6 = Button (root , text = " " , font = ("Helvetica, 20" ), height = 3 , width = 7 , bg = "SystemButtonFace" , command = lambda : buttonClicked (button6 ))
218
+
219
+ button7 = Button (root , text = " " , font = ("Helvetica, 20" ), height = 3 , width = 7 , bg = "SystemButtonFace" , command = lambda : buttonClicked (button7 ))
220
+ button8 = Button (root , text = " " , font = ("Helvetica, 20" ), height = 3 , width = 7 , bg = "SystemButtonFace" , command = lambda : buttonClicked (button8 ))
221
+ button9 = Button (root , text = " " , font = ("Helvetica, 20" ), height = 3 , width = 7 , bg = "SystemButtonFace" , command = lambda : buttonClicked (button9 ))
222
+
223
+ # Arranging the buttons on the screen for the game
224
+ button1 .grid (row = 0 , column = 0 )
225
+ button2 .grid (row = 0 , column = 1 )
226
+ button3 .grid (row = 0 , column = 2 )
227
+
228
+ button4 .grid (row = 1 , column = 0 )
229
+ button5 .grid (row = 1 , column = 1 )
230
+ button6 .grid (row = 1 , column = 2 )
231
+
232
+ button7 .grid (row = 2 , column = 0 )
233
+ button8 .grid (row = 2 , column = 1 )
234
+ button9 .grid (row = 2 , column = 2 )
235
+
236
+ # Create game menu
237
+ gameMenu = Menu (root )
238
+ root .config (menu = gameMenu )
239
+
240
+ # Create game options menu
241
+ optionMenu = Menu (gameMenu , tearoff = False )
242
+ gameMenu .add_cascade (label = "Options" , menu = optionMenu )
243
+ optionMenu .add_command (label = "Restart Game" , command = start )
244
+
245
+
246
+ start ()
247
+ root .mainloop ()
0 commit comments