Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 4

from tkinter import *

WINDOW_SIZE = 400
GRID LINE WIDTH = 2
SYMBOL_WIDTH = WINDOW_SIZE/80
SYMBOL_SIZE = 0.375
X COLOR = 'deep sky blue'
O COLOR = 'tomato'
DRAW_SCREEN_COLOR = 'light sea green'
GRID_COLOR = 'black'
FIRST PLAYER = 2
CELL_SIZE = WINDOW_SIZE / 3
STATE TITLE SCREEN = 0
STATE_X_TURN = 1
STATE_O_TURN = 2
STATE_GAME_OVER = 3
EMPTY = 0
X = 1
0 = 2

class Game (Tk):

def__init__(self):
Tk.__init__(self)
self.canvas = Canvas(height=WINDOM_SIZE,
width=WINDOW_SIZE, bg='white')
self.canvas. pack()
self.bind('<x>', self.exit)
self.canvas,bind('<Button-1>', self.click)
self.gamestate = STATE_TITLE_SCREEN
self. title_screen()
self. board = [
[EMPTY, EMPTY, EMPTY],
[EMPTY, EMPTY, EMPTY],
[EMPTY, EMPTY, EMPTY]]

def title_screen(self):
self.canvas.delete('all')
self.canvas.create_rectangle(0, 0, WINDOW_SIZE,
WINDOW_SIZE,fill='white',outline='')
self.canvas.create_rectangle( int (WINDOW_SIZE/15),
int (WINDOW SIZE/15),
int (WINDOW_SIZE*14/15),
int (WINDOW SIZE*14/15),
outlines='')
self.canvas.create_rectangle( int (WINDOW_SIZE/10),
int (WINDOW_SIZE/10),
int (WINDOW_SIZE*9/10),
int (WINDOW_SIZE*9/10),
fill='light blue', outline='')

self.canvas.create_text (WINDOW SIZE/2, WINDOW SIZE/3,


text='TIC TAC TOE', fill='black',
font= ('Calibri', int(-WINDOW_SIZE/12),
'bold underline'))
self.canvas. create_text(int (WINDOW SIZE/2).
int (WINDOW SIZE/2.5),
text='[click to play]', fill='purple',
font=('Arial', int(-WINDOW_SIZE/25)) )
def new_board(self):
self.canvas.delete('all')
self. board = [
[EMPTY, EMPTY, EMPTY],
[EMPTY, EMPTY, EMPTY],
[EMPTY, EMPTY, EMPTY] ]
forn in range (1, 3):
self.canvas.create_line (CELL_SIZE*n, 0,
CELL_SIZE*n, WINDOW_SIZE,
width=GRID_LINE_WIDTH,
fill=GRID_COLOR)
self.canvas.create_line (0, CELL_SIZE*n,
WINDOW_SIZE, CELL_SIZE*n,
width=GRID_LINE_WIDTH,fill=GRID_COLOR )

def gameover_screen(self, outcome):


self.canvas.delete('all')
if outcome = 'x WINS' :
wintext = 'X wins'
wincolor = 'light green
elif outcome = 'O WINS':
wintext ='O wins'
wincolor = 'gold2'
elif outcome == 'DRAW':
wintext = 'Draw!'
wincolor = DRAW_SCREEN_COLOR
self.canvas.create_rectangle(0, 0,
WINDOW_SIZE, WINDOW_SIZE,
fill=wincolor, outline='')
self.canvas.create_text(int(WINDOW_SIZE/2), int(WINDOW_SIZE/2),
text=wintext, fill='black',
font=('Calibri',int(-WINDOW_SIZE/6),
bold'))
self.canvas.create_text(int(WINDOW_SIZE/2), int(WINDOW_SIZE/1.65),
text= [click to play again]',
fill=' purple', font=('Arial',
int (-WINDOW_SIZE/25)) )

def click(self, event):


x = self.pixel_to_grid(event. x)
y = self.pixel to grid(event. y)
if self.gamestate == STATE_TITLE_SCREEN:
self.new_board()
self.gamestate = FIRST PLAYER
elif(self.gamestate==STATE_X_TURN and self.board[y][x]==EMPTY):
self.new move (x, x, y)
if self.has_won(X):
self.gamestate = STATE_GAME_OVER
self.game over_screen('X WINS')
elif self.is_a_draw():
self.gamestate = STATE_GAME_OVER
self.gameover_screen('DRAW')

else:
self.gamestate = STATE_O_TURN
elif(self.game state==STATE_O_TURN and self.board [y] [x]==EMPTY) :
self.new move (O, x, y)
if self. has won (O):
self.gamestate = STATE_GAME_OVER
self.gameover_screen('O WINS)
elif self.is_a_draw():
self.gamestate = STATE_GAME_OVER
self.game over_screen('DRAW)
self.gamestate = STATE_X_TURN
elif self.gamestate == STATE_GAME_OVER:
self.new_board()
self.gamestate = FIRST PLAYER

def new_move(self, player, grid_x, grid_y):


if player == X:
self.draw_X(grid_x, grid_y)
self.board [grid_y][grid_x] = x
elif player == 0:
self.draw_o(grid_x, grid_y)
self. board[grid_y] [grid_x] = 0

def draw_X (self,grid_x, grid_y):


x = self.grid_to_pixel(grid_x)
y = self.grid_to_pixel(grid_y)
delta = CELL_SIZE/2. SYMBOL_SIZE selt.canvas.create_line ( x-delta, y-delta,
x+delta, y+delta,
width=SYMBOL_WIDTH, fill=x_COLOR) self.canvas.create_line ( x+delta, y-delta,
x-delta, y+delta, width=SYMBOL_WIDTH, fill=x_COLOR)
131
132 133 134 135 136 137 138 139 140 141
def draw o (self, grid_x, grid_y):
x = self.grid_to_pixel(grid_x) y = self.grid_to_pixel(grid_y) delta = CELL_SIZE/2.
SYMBOL_SIZE self.canvas.create_oval( x-delta, y-delta,
x+delta, y+delta, width=SYMBOL WIDTH, outline=O_COLOR)
142 143
144 145 142 147 148 149 150 151 152
def has won(self, symbol):
for y in range (3):
if self. board[y] == (symbol, gymbol, symbol]:
Ieturn True for x in range (3):
if self.board (0) [x]==self.board[1] [x]==self.board[2][x] == symbol:
return True if self.board[0][0]==self. board[1][1]=gelf. board[2][2]==symbol:
return True elif self. board[0][2]==self.board[1][1]== self.board[2][0]== symbol:
return True return false
in un un
153
154
155
u
15� 157 158 155
def is a draw(self):
for row in self. board:
if EMPTY in row:
Ieturn false return Tile
160
161
31
162 163 def grid to pixel (self, grid_coord): 164
pixel_coord = grid_coord + CELL_SIZE + CELL_SIZE / 2 165
retun pixel_coord 16� 167 def pixel to grid (self, pixel_coord): 168
if pixel_coord >= WINDOW_SIZE: 169
pixel_coord = WINDOW_SIZE - 1 170
grid_coord = int(pixel_coord / CELL_SIZE) 171
return grid_coord 170 173 def exit (self, event): 174
self.destroy() 175 17� def main(): 177 root = Game () 178 root.title("TIC TAC TOE")
179 root.mainloop(). 180 181 main()

You might also like