-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAnimation.py
More file actions
152 lines (124 loc) · 4.18 KB
/
Copy pathAnimation.py
File metadata and controls
152 lines (124 loc) · 4.18 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
import pygame
import sys
from pygame.locals import *
import time
pygame.init()
WIDTH = 600
win = pygame.display.set_mode((WIDTH, WIDTH))
pygame.display.set_caption("Tic Tac Toe")
fps = 30
frame = pygame.time.Clock()
# Colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)
PURPLE = (128, 0, 128)
# Window
# initiating_window = pygame.transform.scale(pygame.image.load("background.png"), (WIDTH, WIDTH))
x_img = pygame.transform.scale(pygame.image.load("x.png"), (100, 100))
o_img = pygame.transform.scale(pygame.image.load("o.png"), (100, 100))
# Font
END_FONT = pygame.font.SysFont("Helvetica", 40)
# Functions
def draw_board():
win.fill(WHITE)
# win.blit(initiating_window, (0,0))
pygame.display.update()
time.sleep(1)
# win.fill(WHITE)
# Draw vertical, horizontal lines
for i in range (1, 3):
pygame.draw.line(win, BLACK, (i * WIDTH / 3, 0), (i * WIDTH / 3, WIDTH), 5)
pygame.draw.line(win, BLACK, (0, i * WIDTH / 3), (WIDTH, i * WIDTH / 3), 5)
pygame.display.flip()
def initialize_grid():
global dis_to_cen
dis_to_cen = WIDTH // 3 // 2
grid = [[None for _ in range(3)] for _ in range(3)]
for i in range(3):
for j in range(3):
x = (2 * i + 1) * dis_to_cen
y = (2 * j + 1) * dis_to_cen
grid[i][j] = (x, y, "", True)
return grid
def click(grid, x_turn, o_turn):
r_x, r_y = pygame.mouse.get_pos()
for i in range(3):
for j in range(3):
x, y, char, can_play = grid[i][j]
# calculate distance:
dis = ((r_x - x)**2 + (r_y - y)**2) ** 0.5
if dis <= dis_to_cen and can_play:
if x_turn:
char = "X"
win.blit(x_img, (x - 50, y - 50))
x_turn = False
o_turn = True
else:
char = "O"
win.blit(o_img, (x - 50, y - 50))
x_turn = True
o_turn = False
grid[i][j] = (x, y, char, False)
pygame.display.update()
return grid, x_turn, o_turn
return grid, x_turn, o_turn
def check_win(grid):
winner = None
# Check row
for r in range(3):
if (grid[r][0][2] == grid[r][1][2] == grid[r][2][2]) and (grid[r][0][2] != ""):
winner = grid[r][0][2]
return winner
# Check column
for c in range(3):
if (grid[0][c][2] == grid[1][c][2] == grid[2][c][2]) and (grid[0][c][2] != ""):
winner = grid[0][c][2]
return winner
# Check diagonal
if (grid[0][0][2] == grid[1][1][2] == grid[2][2][2]) and (grid[0][0][2] != ""):
winner = grid[0][0][2]
return winner
if (grid[0][2][2] == grid[1][1][2] == grid[2][0][2]) and (grid[0][2][2] != ""):
winner = grid[0][2][2]
return winner
def check_full(grid):
# Check if all cells are filled
for row in grid:
for cell in row:
if cell[2] == "":
return False
return True
def display_message(text):
win.fill(PURPLE)
text = END_FONT.render(text, True, WHITE)
win.blit(text, (WIDTH // 2 - text.get_width() // 2, WIDTH // 2 - text.get_height() // 2))
pygame.display.update()
time.sleep(3)
def run():
global x_turn, o_turn
x_turn = True
o_turn = False
grid = initialize_grid()
draw_board()
# Main display loop to allow user to quit the game
running = True
while running:
for event in pygame.event.get():
if event.type == QUIT:
# pygame.display.quit()
pygame.quit()
quit()
elif event.type == MOUSEBUTTONDOWN:
grid, x_turn, o_turn = click(grid, x_turn, o_turn)
winner = check_win(grid)
if winner:
display_message(str(winner) + " has won!")
running = False
elif check_full(grid):
display_message("It's a draw!")
running = False
pygame.display.flip()
frame.tick(fps)