-
Notifications
You must be signed in to change notification settings - Fork 0
/
gamegrid.py
113 lines (100 loc) · 2.99 KB
/
gamegrid.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
from tkinter import Frame, Label, CENTER
import numpy as np
from board import Board
from agent import Agent
import constants as c
import time
class GameGrid(Frame):
def __init__(self):
Frame.__init__(self)
self.grid()
self.master.title('2048 designed by Sizzle')
self.master.bind("<Key>", self.key_press)
self.Game = Board()
self.AI = Agent()
self.matrix = np.zeros((4,4))
self.grid_cells = []
self.init_grid()
self.matrix = self.Game.getBoard()
self.update_grid_cells()
self.commands = {c.KEY_UP_ALT: 0, c.KEY_RIGHT_ALT: 1, c.KEY_DOWN_ALT: 2,
c.KEY_LEFT_ALT: 3, c.KEY_UP: 0, c.KEY_RIGHT: 1, c.KEY_DOWN: 2,
c.KEY_LEFT: 3
}
self.score = 0
self.dir = ["Up", "Right", "Down", "Left"]
self.AUTOPLAY = False
self.HINT = False
while True:
while self.AUTOPLAY or self.HINT:
act, r = self.AI.step(self.Game)
if r != -1:
self.score += r
if self.Game.end_game():
break
self.Game.GenRandTile(r)
if self.Game.end_game():
break
self.matrix = self.Game.getBoard()
self.update_grid_cells()
print("\nMove {}".format(self.dir[act]))
print("Current Score: {}".format(self.score))
self.HINT = False
time.sleep(1)
self.update_grid_cells()
self.update()
self.mainloop()
def init_grid(self):
background = Frame(self, bg=c.BACKGROUND_COLOR_GAME,
width=c.SIZE, height=c.SIZE)
background.grid()
for i in range(c.GRID_LEN):
grid_row = []
for j in range(c.GRID_LEN):
cell = Frame(background, bg=c.BACKGROUND_COLOR_CELL_EMPTY,
width=c.SIZE / c.GRID_LEN,
height=c.SIZE / c.GRID_LEN)
cell.grid(row=i, column=j, padx=c.GRID_PADDING,
pady=c.GRID_PADDING)
cell.grid_propagate(False)
t = Label(master=cell, text="",
bg=c.BACKGROUND_COLOR_CELL_EMPTY,
justify=CENTER, font=c.FONT, width=5, height=3)
t.grid()
grid_row.append(t)
self.grid_cells.append(grid_row)
def update_grid_cells(self):
for i in range(c.GRID_LEN):
for j in range(c.GRID_LEN):
new_number = (np.uint32(1) << np.int32(self.matrix[i][j]))
if new_number == 1:
self.grid_cells[i][j].configure(
text="", bg=c.BACKGROUND_COLOR_CELL_EMPTY)
else:
self.grid_cells[i][j].configure(text=str(
new_number), bg=c.BACKGROUND_COLOR_DICT[new_number],
fg=c.CELL_COLOR_DICT[new_number])
self.update_idletasks()
self.update()
def key_press(self, event):
key = repr(event.char)
act = -1
if self.AUTOPLAY == False and key == c.KEY_HINT:
self.HINT = True
elif self.AUTOPLAY == False and key in self.commands:
act = self.commands[repr(event.char)]
r = self.Game.move(act)
if r != -1:
self.score += r
self.Game.GenRandTile(r)
self.matrix = self.Game.getBoard()
self.update_grid_cells()
print("Move {}".format(self.dir[act]))
print("Current Score: {}".format(self.score))
elif key == c.KEY_AUTOPLAY:
if self.AUTOPLAY == False:
self.AUTOPLAY = True
else:
self.AUTOPLAY = False
if __name__ == "__main__":
gamegrid = GameGrid()