Example #1
0
 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()  #抢夺键盘事件
Example #2
0
 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)))
Example #3
0
	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)
Example #4
0
 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"])
Example #5
0
	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()
Example #6
0
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()
Example #7
0
def simpleCmd(cmd: str):
    return System.CreatePackage(cmd)
Example #8
0
def login(idStr, pwStr):
    body = json.dumps(dict(id=idStr, pw=pwStr))
    return System.CreatePackage("Login", body)
Example #9
0
def register(idStr, pwStr):
    body = json.dumps(dict(id=idStr, pw=pwStr))
    return System.CreatePackage("Register", body)