1 #!/usr/bin/python 2 # -*- coding:utf-8 -*- 3 ''' 4 Created on Mar 24, 2017 5 6 @author: zhengli 7 ''' 8 9 import copy 10 import numpy 11 from PyQt5.QtCore import Qt 12 from PyQt5.QtGui import (QIcon, QFont) 13 from PyQt5.QtWidgets import (Qaction, QDesktopWidget, QGridLayout, QMainWindow, QMessageBox, QToolTip, QWidget) 14 import GameCanvas 15 16 17 class App(QMainWindow): 18 """ 19 Main Window. 20 """ 21 22 # noinspection PyArgumentList 23 def __init__(self): 24 25 QMainWindow.__init__(self) 26 27 # noinspection PyCallByClass,PyTypeChecker 28 QToolTip.setFont(QFont('SansSerif', 10)) 29 self.setGeometry(100, 100, 600, 600) 30 self.frameGeometry().moveCenter(QDesktopWidget().availableGeometry().center()) 31 self.move(self.frameGeometry().topLeft()) 32 self.setWindowTitle('2048') 33 self.setWindowIcon(QIcon('python.png')) 34 self.setWindowFlags(Qt.WindowStaysOnTopHint) 35 36 self.action = dict() 37 self.actionLoad() 38 self.menuBarLoad() 39 40 self.data = dict() 41 self.canvas = 0 42 self.gameImage(4, 4) 43 44 self.statusBar().showMessage('Ready') 45 46 self.show() 47 48 def actionLoad(self): 49 """ 50 set MainData.action 51 """ 52 self.action["4X4"] = QAction('4X4', self) 53 self.action["4X4"].setShortcut('Ctrl+4') 54 self.action["4X4"].setStatusTip('4X4 game') 55 self.action["4X4"].triggered.connect(lambda: self.gameImage(4, 4)) 56 57 self.action["5X5"] = QAction('5X5', self) 58 self.action["5X5"].setShortcut('Ctrl+5') 59 self.action["5X5"].setStatusTip('5X5 game') 60 self.action["5X5"].triggered.connect(lambda: self.gameImage(5, 5)) 61 62 self.action["6X6"] = QAction('6X6', self) 63 self.action["6X6"].setShortcut('Ctrl+6') 64 self.action["6X6"].setStatusTip('6X6 game') 65 self.action["6X6"].triggered.connect(lambda: self.gameImage(6, 6)) 66 67 def menuBarLoad(self): 68 """ 69 set MainWindow.menuBar 70 """ 71 self.statusBar() 72 menubar = self.menuBar() 73 74 gameMenu = menubar.addMenu('&Game') 75 gameMenu.addAction(self.action["4X4"]) 76 gameMenu.addAction(self.action["5X5"]) 77 gameMenu.addAction(self.action["6X6"]) 78 79 def gameImage(self, m, n): 80 """ 81 image draw. 82 """ 83 # noinspection PyBroadException 84 try: 85 data = self.data["%d_%d" % (m, n)] 86 count = self.data["score_%d_%d" % (m, n)] 87 except: 88 self.data["%d_%d" % (m, n)] = numpy.zeros((m, n), dtype=int) 89 data = self.data["%d_%d" % (m, n)] 90 self.data["score_%d_%d" % (m, n)] = 0 91 count = self.data["score_%d_%d" % (m, n)] 92 self.statusBar().showMessage('Score: %d' % count) 93 94 layout = QGridLayout() 95 layout.setSpacing(10) 96 97 widget = QWidget() 98 self.canvas = GameCanvas.GameCanvas(data=data, count=count, parent=widget) 99 self.canvas.fig.canvas.mpl_connect('button_press_event', self.button_press) 100 self.canvas.fig.canvas.mpl_connect('button_release_event', self.button_release) 101 102 layout.addWidget(self.canvas) 103 widget.setLayout(layout) 104 self.setCentralWidget(widget) 105 106 def button_press(self, event): 107 """ 108 Get coordinates 109 """ 110 self.canvas.event_x = event.x 111 self.canvas.event_y = event.y 112 113 # noinspection PyUnresolvedReferences 114 def button_release(self, event): 115 """ 116 :param event: 117 :return: 118 """ 119 data_backup = copy.deepcopy(self.canvas.data) 120 if abs(self.canvas.event_x - event.x) > abs(self.canvas.event_y - event.y): 121 if event.x > self.canvas.event_x: 122 self.canvas.right_operation(data_backup=data_backup) 123 else: 124 self.canvas.left_operation(data_backup=data_backup) 125 else: 126 if event.y > self.canvas.event_y: 127 self.canvas.up_operation(data_backup=data_backup) 128 else: 129 self.canvas.down_operation(data_backup=data_backup) 130 131 self.canvas.fig.clf() 132 self.canvas.axes = self.canvas.fig.add_axes([0, 0, 1, 1], frameon=False) 133 self.canvas.complete_draw() 134 self.canvas.fig.canvas.draw() 135 136 self.data["score_%d_%d" % (self.canvas.m, self.canvas.n)] = self.canvas.count 137 self.statusBar().showMessage('Score: %d' % self.canvas.count) 138 139 # noinspection PyUnresolvedReferences 140 def keyPressEvent(self, event): 141 """ 142 :param event: 143 :return: 144 """ 145 data_backup = copy.deepcopy(self.canvas.data) 146 if event.key() == Qt.Key_Right: 147 self.canvas.right_operation(data_backup=data_backup) 148 elif event.key() == Qt.Key_Left: 149 self.canvas.left_operation(data_backup=data_backup) 150 elif event.key() == Qt.Key_Up: 151 self.canvas.up_operation(data_backup=data_backup) 152 elif event.key() == Qt.Key_Down: 153 self.canvas.down_operation(data_backup=data_backup) 154 elif event.key() == Qt.Key_Escape: 155 self.canvas.data *= 0 156 self.canvas.count = 0 157 elif event.key() == Qt.Key_Delete: 158 print("yes ") 159 160 self.canvas.fig.clf() 161 self.canvas.axes = self.canvas.fig.add_axes([0, 0, 1, 1], frameon=False) 162 self.canvas.complete_draw() 163 self.canvas.fig.canvas.draw() 164 165 self.data["score_%d_%d" % (self.canvas.m, self.canvas.n)] = self.canvas.count 166 self.statusBar().showMessage('Score: %d' % self.canvas.count) 167 168 def closeEvent(self, event): 169 """ 170 exit game. 171 """ 172 # noinspection PyCallByClass,PyTypeChecker 173 reply = QMessageBox.question(self, 'Message', "Are you sure to quit?", 174 QMessageBox.Yes | QMessageBox.No, QMessageBox.No) 175 if reply == QMessageBox.Yes: 176 event.accept() 177 else: 178 event.ignore()