def initGameSettings(self): self.system = System() self.timer = QTimer(self) self.timer.setInterval(UPDATE_INTERVAL) self.timer.timeout.connect(self.updateGame) self.paintCursor = Vector() #网格绘制光标 self.gameOver = False self.grabKeyboard() #抢夺键盘事件
def MsgNavigate(cls, conn, bodyStr): posList = System.JsonToData(bodyStr) if posList is None: print("[系统] Data数据为空") return pathList = Navigation.Navigate(posList[0], posList[1]) # print(pathList) jsonStr = json.dumps(pathList) conn.send(System.CreatePackage("Navigate", System.ToBytes(jsonStr)))
def dataHandle(self, body): """ 处理接受到的消息,如将json字符串反序列化,消息分发,反射调用事件 :param body: :return: """ name, start = System.GetString(body, 0) bodyStr = body[start:] methodName = "Msg" + name # BasicMsg分发 if name == "Register" or name == "Login" or name == "Disconnect" or name == "HeartBeat": func = getattr(HandleBasicMsg, methodName, None) if not func: print("[警告] HandleMsg没有处理该方法:%s" % methodName) return print("[处理基础消息]", name) func(self.request, bodyStr) # PlayerMsg分发 else: func = getattr(HandlePlayerMsg, methodName, None) if not func: print("[警告] HandleMsg没有处理该方法:%s" % methodName) return print("[处理玩家消息]", name) func(self.request, bodyStr)
def MsgUpdateInfo(cls, conn, bodyStr): data = System.JsonToData(bodyStr) if data is None: print("[系统] Data数据为空") return # data is a dict(python这边都会把json数据解析为dict) print(data["Id"]) print(data["PosX"])
def handle(self): """ 建立连接,接受消息,处理消息,心跳检测,关闭连接 :return: """ sock = self.request print("[服务器] 开始监听客户端消息") while True: try: data = sock.recv(1024) except socket.timeout: # 超时会抛出socket.timeout异常 print("[心跳检测] 超时,断开连接") sock.send(System.CreatePackage("Disconnect")) break except ConnectionResetError: print("[服务器] 远程主机强迫关闭了一个现有的连接") break try: if data: # 判断是否接收到数据 self.processData(data) except ConnectionResetError: print("[服务器] 收到退出消息,客户端正常退出") break sock.close()
class GameInterface(QWidget): #游戏界面widget WIDGET_HEIGHT = 50 #子控件的高 START_BUTTON_GEOMETRY = (GAME_INTERFACE_SIZE.x - BLANK_WIDTH, GAME_INTERFACE_SIZE.y - WIDGET_HEIGHT, BLANK_WIDTH, WIDGET_HEIGHT) RULE_BUTTON_GEOMETRY = (GAME_INTERFACE_SIZE.x - BLANK_WIDTH, GAME_INTERFACE_SIZE.y - 2 * WIDGET_HEIGHT, BLANK_WIDTH, WIDGET_HEIGHT) INFO_BUTTON_GEOMETRY = (GAME_INTERFACE_SIZE.x - BLANK_WIDTH, GAME_INTERFACE_SIZE.y - 3 * WIDGET_HEIGHT, BLANK_WIDTH, WIDGET_HEIGHT) SCORE_GEOMETRY = (MATRIX_SCREEN_SIZE.x, 0, BLANK_WIDTH, WIDGET_HEIGHT) POISONED_HINT_GEOMETRY = (MATRIX_SCREEN_SIZE.x, WIDGET_HEIGHT, BLANK_WIDTH, 2 * WIDGET_HEIGHT) def __init__(self, parent): QWidget.__init__(self, parent) self.initWidgets() self.initGameSettings() def initWidgets(self): self.setFixedSize(GAME_INTERFACE_SIZE.x, GAME_INTERFACE_SIZE.y) self.setWindowTitle("Snake-%s" % VERSION) self.setWindowIcon(QIcon(":/icon")) self.startButton = QPushButton("开始游戏", self) self.startButton.setGeometry(*self.START_BUTTON_GEOMETRY) self.startButton.clicked.connect(self.startGame) self.ruleButton = QPushButton("游戏规则", self) self.ruleButton.setGeometry(*self.RULE_BUTTON_GEOMETRY) self.ruleButton.clicked.connect( lambda: QMessageBox.information(self, "游戏规则", GAME_RULES)) self.infoButton = QPushButton("程序信息", self) self.infoButton.setGeometry(*self.INFO_BUTTON_GEOMETRY) self.infoButton.clicked.connect( lambda: QMessageBox.information(self, "程序信息", PROGRAMME_INFO)) def initGameSettings(self): self.system = System() self.timer = QTimer(self) self.timer.setInterval(UPDATE_INTERVAL) self.timer.timeout.connect(self.updateGame) self.paintCursor = Vector() #网格绘制光标 self.gameOver = False self.grabKeyboard() #抢夺键盘事件 self.gameModeNormal = True #默认游戏模式为标准的 def updateGame(self): #更新游戏实况并重绘 hint = self.system.update() if hint is None: self.update() else: self.timer.stop() self.system.stopPoisonTimer() self.gameOver = True self.startButton.setDisabled(False) self.update() def paintEvent(self, event): #绘制游戏界面和分数 qp = QPainter() qp.begin(self) for self.paintCursor.x in range(System.MATRIX_SIZE.x): for self.paintCursor.y in range(System.MATRIX_SIZE.y): self.drawGamePixel(qp) self.drawScore(qp) if self.gameOver: self.drawGameOverHint(qp) elif self.system.directionReversed: #在游戏结束后不会显示 self.drawPoisonedHint(qp) qp.end() def drawGamePixel(self, qp): qp.setBrush(PIXEL_COLORS[self.system.matrix[self.paintCursor]][int( self.system.directionReversed)]) qp.drawRect(PIXEL_SIDE_LENGTH * self.paintCursor.x, PIXEL_SIDE_LENGTH * self.paintCursor.y, PIXEL_SIDE_LENGTH, PIXEL_SIDE_LENGTH) def drawScore(self, qp): qp.setPen(QColor(0, 0, 0)) qp.setFont(QFont('MicrosoftYahei', 20)) qp.drawText(self.SCORE_GEOMETRY[0], self.SCORE_GEOMETRY[1], self.SCORE_GEOMETRY[2], self.SCORE_GEOMETRY[3], Qt.AlignCenter, "分数:%s" % self.system.foodScore) def drawGameOverHint(self, qp): qp.setPen(QColor(255, 0, 0)) qp.setFont(QFont('MicrosoftYahei', 140, QFont.Bold)) qp.drawText(0, 0, MATRIX_SCREEN_SIZE.x, MATRIX_SCREEN_SIZE.y, Qt.AlignCenter, "GAME OVER") def drawPoisonedHint(self, qp): qp.setPen(QColor(255, 0, 0)) qp.setFont(QFont('MicrosoftYahei', 15)) qp.drawText(self.POISONED_HINT_GEOMETRY[0], self.POISONED_HINT_GEOMETRY[1], self.POISONED_HINT_GEOMETRY[2], self.POISONED_HINT_GEOMETRY[3], Qt.AlignCenter, "蛇中毒了,\n还剩%s个时间单位\n恢复正常" % self.system.poisonTimer) def keyPressEvent(self, event): key = event.key() if key == Qt.Key_Left: self.system.keyEvent(DIRECTIONS.LEFT) elif key == Qt.Key_Right: self.system.keyEvent(DIRECTIONS.RIGHT) elif key == Qt.Key_Up: self.system.keyEvent(DIRECTIONS.UP) elif key == Qt.Key_Down: self.system.keyEvent(DIRECTIONS.DOWN) def startGame(self): self.startButton.setText('再玩一次') self.startButton.setDisabled(True) self.gameOver = False self.system.start() self.timer.start()
def simpleCmd(cmd: str): return System.CreatePackage(cmd)
def login(idStr, pwStr): body = json.dumps(dict(id=idStr, pw=pwStr)) return System.CreatePackage("Login", body)
def register(idStr, pwStr): body = json.dumps(dict(id=idStr, pw=pwStr)) return System.CreatePackage("Register", body)