-
Notifications
You must be signed in to change notification settings - Fork 1
/
maze_ui.py
139 lines (108 loc) · 4.6 KB
/
maze_ui.py
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
'''
Graphical component for rendering the Pacman mazes.
'''
import tkinter as tk
from tkinter import *
from PIL import Image, ImageTk
from pprint import pprint
from constants import Constants
from ui.pacman_ui import PacmanUI
from ui.ghost_ui import GhostUI
class MazeUI:
def __init__(self, window, maze, debug=False):
# Save the window to add buttons later
self.window = window
self._debug = debug
if self._debug:
print("MAZE UI INIT")
self._maze = maze
self._rows = len(maze)
self._cols = len(maze[0])
if self._debug:
print("ROWS: ", self._rows)
print("COLS: ", self._cols)
self._block_size = 80
self.canvas_width = self._cols * self._block_size
self.canvas_height = self._rows * self._block_size
self.controls_height = 100
# Leave room for buttons at the bottom
self.canvas_height += self.controls_height
w = self.canvas_width
h = self.canvas_height
# get screen width and height
ws = window.winfo_screenwidth() # width of the screen
hs = window.winfo_screenheight() # height of the screen
# Calculate x and y coordinates for the *centered* Tk root window
x = (ws/2) - (w/2)
y = (hs/2) - (h/2)
if self._debug:
print("MAZE UI x: ", x)
print("MAZE UI y: ", y)
# set the dimensions of the screen
# and where it is placed
window.geometry('+%d+%d' % (x, y))
self.window = window
self._canvas = tk.Canvas(
self.window, height=self.canvas_height, width=self.canvas_width)
# self._canvas.grid(row=0, column=0, sticky='w')
self._canvas.pack()
# Draw controls
self.btn_var = tk.IntVar()
self.btn = Button(self.window, text='Step forward', width=40,
height=5, bd='10', command=lambda: self.btn_var.set(1))
self.exit_button = Button(self.window, text='Exit', width=40,
height=5, bd='10', command=self.destroy)
# Initialize Pacman UI
self.pacman = PacmanUI(self._canvas)
self.ghost = GhostUI(self._canvas)
self.window.update()
def destroy(self):
self.window.destroy()
def draw_maze(self):
if self._debug:
pprint(self._maze)
self._canvas.delete('all')
for row in range(self._rows):
for col in range(self._cols):
# Get the symbol
token = self._maze[row][col]
color = "black"
if token == Constants.PLR_BLOCK:
color = "yellow"
elif token == Constants.SAFE_BLOCK:
color = "black"
elif token == Constants.GHOST_BLOCK:
color = "pink"
elif token == Constants.PELLET_BLOCK:
color = "white"
elif token == Constants.DEATH_BLOCK:
color = "red"
elif token == Constants.WALL_BLOCK:
color = "blue"
x1 = (col * self._block_size)
y1 = row * self._block_size
x2 = x1 + self._block_size
y2 = y1 + self._block_size
if token == Constants.PELLET_BLOCK:
margin = 25
self._canvas.create_rectangle(x1, y1, x2, y2, fill="black")
self._canvas.create_oval(
[x1 + margin, y1 + margin, x2 - margin, y2 - margin],
fill=color)
elif token == Constants.PLR_BLOCK or token == Constants.DEATH_BLOCK:
self._canvas.create_rectangle(x1, y1, x2, y2, fill="black")
self.pacman.draw(token, (x2 - x1) / 2 + x1, (y2 - y1) / 2 + y1)
elif token == Constants.GHOST_BLOCK:
self._canvas.create_rectangle(x1, y1, x2, y2, fill="black")
self.ghost.draw(x1, y1, self._block_size, self._block_size)
else:
self._canvas.create_rectangle(
x1, y1, x2, y2, fill=color, outline="black", width=3, tags="area")
# Draw controls
self._canvas.create_rectangle(
0, self.canvas_height - self.controls_height, self.canvas_width, self.canvas_height,
fill="black")
self.btn.place(x=100, y=(self.canvas_height - self.controls_height))
# Force the update so the window shows immediately
# https://python-forum.io/thread-34564.html
self.window.update()