class Rules(object): """menu of the game""" def __init__(self, width, height): self.initAttr(width, height); def loadResource(self): self.headMark = pygame.image.load(getFilePath("separators.png")) def initAttr(self, width, height): self.width, self.height = width, height self.loadResource() self.background = Background((width, height)) # 规则文字开始的位置 offLine = 100 offSet = 50 self.content = [] for content in RULES_CONTENT[0 : -1]: offLine += offSet self.content.append(Label(RULES_CONTENT_FONTS, content, (50, offLine), headMark = self.headMark)) self.returnButton = TextButton(RULES_EXIT_FONTS, RULES_CONTENT[-1], (offSet, self.height - offSet), (255, 255, 255)) def draw(self, screen): self.background.draw(screen) [content.draw(screen) for content in self.content] self.returnButton.draw(screen) pygame.display.flip() def clickListener(self): if (pygame.mouse.get_pressed()[0]): mousePos = pygame.mouse.get_pos() if self.returnButton.rect.collidepoint(mousePos): return STATE.menu return STATE.rules
class SetLevel(Div, object): """set level frame""" def __init__(self, width, height): # super(SetLevel, self).__init__() Div.__init__(self, (width, height)) self.initAttr(width, height) def initAttr(self, width, height): self.justClicked = SETLEVEL["JUST_CLICKED"] # 默认 level self.loadResouce() self.setArrow() self.setLevel() self.background = Background((self.width, self.height)) titleOffTop = 150 self.titleText = CenteredText(SETLEVEL["TITLE_FONTS"], SETLEVEL["TITLE_CONTENT"], (self.width / 2, titleOffTop)) offSet = 50 self.beginButton = TextButton(SETLEVEL["BEGIN_FONTS"], SETLEVEL["BEGIN_CONTENT"], (self.width - offSet, self.height - offSet), (255, 255, 255)) self.returnButton = TextButton(SETLEVEL["EXIT_FONTS"], SETLEVEL["EXIT_CONTENT"], (offSet, self.height - offSet), (255, 255, 255)) def loadResouce(self): self.arrowImgRight = pygame.image.load(getFilePath("arrow.png")) def setArrow(self): arrowSize = SETLEVEL["ARROW_SIZE"] levelImageOffTop = 300 coordX, coordY = self.width / 2, levelImageOffTop self.rArrow = ImageButton(self.arrowImgRight, (arrowSize, arrowSize), (coordX + 80, coordY - 10)) self.lArrow = ImageButton(pygame.transform.flip(self.arrowImgRight, True, True), (arrowSize, arrowSize), (coordX - 80, coordY - 10)) def setLevel(self, level = SETLEVEL["DEFAULT_LEVEL"]): if not isinstance(level, int): level = level[0] if (level > SETLEVEL["MAX_LEVEL"]): level = SETLEVEL["MAX_LEVEL"] if (level < SETLEVEL["MIN_LEVEL"]): level = SETLEVEL["MIN_LEVEL"] self.level = level levelTextOffTop = 300 coordX, coordY = self.width / 2, levelTextOffTop self.levelText = CenteredText(SETLEVEL["LEVEL_FONTS"], str(self.level), (coordX, coordY)) def drawLevelSet(self, screen): self.rArrow.draw(screen) self.levelText.draw(screen) self.lArrow.draw(screen) def draw(self, screen): self.background.draw(screen) self.titleText.draw(screen) self.drawLevelSet(screen) self.beginButton.draw(screen) self.returnButton.draw(screen) ret = self.beginButton.click(lambda *args : self.level) if ret != None: return ret ret = self.returnButton.click(lambda *args : STATE.menu) if ret != None: return ret self.rArrow.click(self.setLevel, self.level + 1) self.lArrow.click(self.setLevel, self.level - 1) return STATE.setLevel
class SetLevel(Div, object): """set level frame""" def __init__(self, width, height): # super(SetLevel, self).__init__() Div.__init__(self, (width, height)) self.initAttr(width, height) def initAttr(self, width, height): self.justClicked = SETLEVEL["JUST_CLICKED"] # 默认 level self.loadResouce() self.setArrow() self.setLevel() self.background = Background((self.width, self.height)) titleOffTop = 150 self.titleText = CenteredText(SETLEVEL["TITLE_FONTS"], SETLEVEL["TITLE_CONTENT"], (self.width / 2, titleOffTop)) offSet = 50 self.beginButton = TextButton( SETLEVEL["BEGIN_FONTS"], SETLEVEL["BEGIN_CONTENT"], (self.width - offSet, self.height - offSet), (255, 255, 255)) self.returnButton = TextButton(SETLEVEL["EXIT_FONTS"], SETLEVEL["EXIT_CONTENT"], (offSet, self.height - offSet), (255, 255, 255)) def loadResouce(self): self.arrowImgRight = pygame.image.load(getFilePath("arrow.png")) def setArrow(self): arrowSize = SETLEVEL["ARROW_SIZE"] levelImageOffTop = 300 coordX, coordY = self.width / 2, levelImageOffTop self.rArrow = ImageButton(self.arrowImgRight, (arrowSize, arrowSize), (coordX + 80, coordY - 10)) self.lArrow = ImageButton( pygame.transform.flip(self.arrowImgRight, True, True), (arrowSize, arrowSize), (coordX - 80, coordY - 10)) def setLevel(self, level=SETLEVEL["DEFAULT_LEVEL"]): if not isinstance(level, int): level = level[0] if (level > SETLEVEL["MAX_LEVEL"]): level = SETLEVEL["MAX_LEVEL"] if (level < SETLEVEL["MIN_LEVEL"]): level = SETLEVEL["MIN_LEVEL"] self.level = level levelTextOffTop = 300 coordX, coordY = self.width / 2, levelTextOffTop self.levelText = CenteredText(SETLEVEL["LEVEL_FONTS"], str(self.level), (coordX, coordY)) def drawLevelSet(self, screen): self.rArrow.draw(screen) self.levelText.draw(screen) self.lArrow.draw(screen) def draw(self, screen): self.background.draw(screen) self.titleText.draw(screen) self.drawLevelSet(screen) self.beginButton.draw(screen) self.returnButton.draw(screen) ret = self.beginButton.click(lambda *args: self.level) if ret != None: return ret ret = self.returnButton.click(lambda *args: STATE.menu) if ret != None: return ret self.rArrow.click(self.setLevel, self.level + 1) self.lArrow.click(self.setLevel, self.level - 1) return STATE.setLevel
class Game(Div, object): """main frame of the game""" def __init__(self, controller): # super(game, self).__init__() self.controller = controller self.initAttr() self.initElement() def setLevel(self, level=6): self.boardWidth, self.boardHeight = self.board.setLevel(level) self.height = self.boardHeight + self.edgeWidth * 2 self.width = self.boardWidth + self.hudWidth self.initContext() def initAttr(self): self.turn = True self.hudWidth = HUD["HUD_WIDTH"] self.edgeWidth = GAME["EDGE_WIDTH"] # 先获取 board 部分的大小,再自适应自己的大小 self.board = Board((self.hudWidth, self.edgeWidth)) Div.__init__(self, (self.board.width + self.hudWidth, self.board.height + self.edgeWidth * 2)) # 根据窗口高度设置 HUD 高度 self.hud = Hud((0, self.height), (0, 0)) self.hud.setMark(self.turn) self.board.setTurn(self.turn) self.gameID = 0 self.order = None def initElement(self): # 背景 self.background = Background((self.width, self.height)) backgroundColor = GAME["GAME_BACKGROUND_COLOR"] self.background.setColor(backgroundColor) # 返回按钮 self.returnButton = TextButton(GAME["RETURN_BUTTON_FONTS"], GAME["RETURN_BUTTON_CONTENT"], (30, 30)) def initContext(self): self.screen = pygame.display.set_mode((self.width, self.height), DOUBLEBUF) pygame.display.set_caption("Boxes") self.clock = pygame.time.Clock() def leaveServer(self, *args): self.controller.gameNet.leaveServer(self.gameID) return STATE.menu def placeLine(self, data): if self.hud.started: self.controller.gameNet.placeLine(data, self.gameID, self.order) def placeLineAnswer(self, turn, x, y, h, point, order): self.setTurn(turn) if order == self.order: self.board.placeLine(x, y, h, point, True) else: self.board.placeLine(x, y, h, point, False) def setTurn(self, turn): self.hud.setMark(turn) self.board.setTurn(turn) def setHome(self): self.order = 0 self.board.setHome() self.background.setColor(GAME["HOME_COLOR"]) def setAway(self): self.order = 1 self.board.setAway() self.background.setColor(GAME["AWAY_COLOR"]) def addScore(self): self.hud.addScore() def enemyAddScore(self): self.hud.enemyAddScore() # 对手玩家进入游戏 def enemyComming(self, turn): self.setTurn(turn) self.board.restart() self.hud.startGame() def newHost(self): self.hud.restart() # 数据清零,重新开始游戏 def restart(self): self.board.restart() self.hud.restart() def draw(self): # self.screen.set_clip(None) self.background.draw(self.screen) ret = self.board.draw(self.screen) if ret != None: self.placeLine(ret) self.hud.draw(self.screen) self.returnButton.draw(self.screen) var = self.returnButton.click(self.leaveServer) if var != None: return var return STATE.game
class Game(Div, object): """main frame of the game""" def __init__(self, controller): # super(game, self).__init__() self.controller = controller self.initAttr() self.initElement() def setLevel(self, level = 6): self.boardWidth, self.boardHeight = self.board.setLevel(level) self.height = self.boardHeight + self.edgeWidth * 2 self.width = self.boardWidth + self.hudWidth self.initContext() def initAttr(self): self.turn = True self.hudWidth = HUD["HUD_WIDTH"] self.edgeWidth = GAME["EDGE_WIDTH"] # 先获取 board 部分的大小,再自适应自己的大小 self.board = Board((self.hudWidth, self.edgeWidth)) Div.__init__(self, (self.board.width + self.hudWidth, self.board.height + self.edgeWidth * 2)) # 根据窗口高度设置 HUD 高度 self.hud = Hud((0, self.height), (0, 0)) self.hud.setMark(self.turn) self.board.setTurn(self.turn) self.gameID = 0 self.order = None def initElement(self): # 背景 self.background = Background((self.width, self.height)) backgroundColor = GAME["GAME_BACKGROUND_COLOR"] self.background.setColor(backgroundColor) # 返回按钮 self.returnButton = TextButton(GAME["RETURN_BUTTON_FONTS"], GAME["RETURN_BUTTON_CONTENT"], (30, 30)) def initContext(self): self.screen = pygame.display.set_mode((self.width, self.height), DOUBLEBUF) pygame.display.set_caption("Boxes") self.clock = pygame.time.Clock(); def leaveServer(self, *args): self.controller.gameNet.leaveServer(self.gameID) return STATE.menu def placeLine(self, data): if self.hud.started: self.controller.gameNet.placeLine(data, self.gameID, self.order) def placeLineAnswer(self, turn, x, y, h, point, order): self.setTurn(turn) if order == self.order: self.board.placeLine(x, y, h, point, True) else: self.board.placeLine(x, y, h, point, False) def setTurn(self, turn): self.hud.setMark(turn) self.board.setTurn(turn) def setHome(self): self.order = 0 self.board.setHome() self.background.setColor(GAME["HOME_COLOR"]) def setAway(self): self.order = 1 self.board.setAway() self.background.setColor(GAME["AWAY_COLOR"]) def addScore(self): self.hud.addScore() def enemyAddScore(self): self.hud.enemyAddScore() # 对手玩家进入游戏 def enemyComming(self, turn): self.setTurn(turn) self.board.restart() self.hud.startGame() def newHost(self): self.hud.restart() # 数据清零,重新开始游戏 def restart(self): self.board.restart() self.hud.restart() def draw(self): # self.screen.set_clip(None) self.background.draw(self.screen) ret = self.board.draw(self.screen) if ret != None: self.placeLine(ret) self.hud.draw(self.screen) self.returnButton.draw(self.screen) var = self.returnButton.click(self.leaveServer) if var != None: return var return STATE.game