/
gui.py
124 lines (97 loc) · 3.58 KB
/
gui.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
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QLabel, \
QFrame, QWidgetItem
import sys
from game import State
class Tile(QLabel):
tile_size = 70
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setFixedSize(self.tile_size, self.tile_size)
self.setAlignment(Qt.AlignCenter)
class Grid(QWidget):
def __init__(self, game):
super().__init__()
self.game = game
self.width, self.height = game.grid_dimensions()
grid = QGridLayout()
self.setLayout(grid)
grid.setSpacing(5)
def draw(self):
grid = self.layout()
width, height = self.width, self.height
for x in range(height):
for y in range(width):
value = self.game.get_value_at((x, y))
if value:
tile = Tile(str(value))
else:
tile = Tile(str(''))
tile.value = value
tile.position = (x, y)
tile.setFrameShape(QFrame.Box)
tile.setStyleSheet("""QLabel { font : 20pt;}""")
tile.setLineWidth(3)
grid.addWidget(tile, x, y)
score_label = QLabel('Score: {}'.format(self.game.score()))
score_label.setStyleSheet("""QLabel { font : 14pt;}""")
undo_label = QLabel('Undo: {}'.format(self.game.undos_left()))
undo_label.setStyleSheet("""QLabel { font : 14pt;}""")
grid.addWidget(score_label, height, 0, 1, width)
grid.addWidget(undo_label, height + 1, 0, 1, width)
def keyPressEvent(self, event):
if self.game.get_state() != State.running:
if self.game.get_state() == State.game_won:
self.show_game_won()
else:
self.show_game_over()
return
if event.key() == Qt.Key_A:
self.game.slide_to('left')
if event.key() == Qt.Key_S:
self.game.slide_to('down')
if event.key() == Qt.Key_W:
self.game.slide_to('up')
if event.key() == Qt.Key_D:
self.game.slide_to('right')
if event.key() == Qt.Key_R:
self.game.reset()
if event.key() == Qt.Key_Z:
self.game.undo()
self.clear_layout(self.layout())
self.draw()
def show_game_over(self):
self.clear_layout(self.layout())
game_over_label = QLabel('Game Over!')
game_over_label.setStyleSheet(
"""QLabel { font : 25pt; color : red;}""")
top_score_label = QLabel('Your score is within the top 10!')
top_score_label.setStyleSheet(
"""QLabel { font : 25pt;}""")
self.layout().addWidget(game_over_label)
if self.game.check_score():
self.layout().addWidget(game_over_label)
def show_game_won(self):
pass
def show_high_scores(self):
self.game.get_top_players()
def clear_layout(self, layout):
for i in reversed(range(layout.count())):
item = layout.itemAt(i)
if isinstance(item, QWidgetItem):
item.widget().close()
else:
self.clear_layout(item.layout())
layout.removeItem(item)
class GraphicUserInterface():
def __init__(self, game):
self.__game = game
def main_loop(self):
app = QApplication(sys.argv)
w = Grid(self.__game)
self.__game.load_top_scores('data.bin')
self.__game.start()
w.setWindowTitle('Clumsy')
w.draw()
w.show()
app.exec_()