def createEngine(self): if self.game != 'Carcassonne': raise Exception("No engine for game {}".format(self.game)) return self.engine = CarcassonneEngine()
class CarcassonneWidget(GameWidget): bgcolors = [0xFFCC99, 0xCCCCCC, 0xFFFF99, 0xCCFF99, 0xCCFFCC, 0xFFB6C1] def createEngine(self): if self.game != 'Carcassonne': raise Exception("No engine for game {}".format(self.game)) return self.engine = CarcassonneEngine() def initUI(self): super(CarcassonneWidget, self).initUI() self.finishButton = QPushButton(self.roundGroup) self.buttonGroupLayout.addWidget(self.finishButton) self.finishButton.clicked.connect(self.finish) self.gameInput = CarcassonneInputWidget( self.engine, self.bgcolors, self) self.gameInput.enterPressed.connect(self.commitRound) self.focussc = QShortcut( QtGui.QKeySequence("Ctrl+A"), self, self.gameInput.setFocus) self.roundLayout.addWidget(self.gameInput) self.gameInput.placeCommitButton(self.commitRoundButton) self.detailGroup = CarcassonneEntriesDetail( self.engine, self.bgcolors, self) self.widgetLayout.addWidget(self.detailGroup, 1, 0) self.detailGroup.edited.connect(self.updatePanel) self.playerGroup = QGroupBox(self) self.widgetLayout.addWidget(self.playerGroup, 1, 1) self.playerGroup.setStyleSheet( "QGroupBox { font-size: 18px; font-weight: bold; }") self.playersLayout = QVBoxLayout(self.playerGroup) self.playersLayout.addStretch() self.playerGroupBox = {} dealer = self.engine.getDealer() for i, player in enumerate(self.engine.getListPlayers()): pw = GamePlayerWidget(player, PlayerColours[i], self.playerGroup) if self.engine.getNumRound() == 1 and player == dealer: pw.setDealer() pw.updateDisplay(self.engine.getScoreFromPlayer(player)) self.playersLayout.addWidget(pw) self.playerGroupBox[player] = pw self.playersLayout.addStretch() self.retranslateUI() QtCore.QTimer.singleShot(1000, self.gameInput.setFocus) def retranslateUI(self): super(CarcassonneWidget, self).retranslateUI() self.finishButton.setText( i18n("GameWidget", "&Finish Game")) self.gameInput.retranslateUI() self.detailGroup.retranslateUI() def getPlayerExtraInfo(self, player): kind = self.gameInput.getKind() if kind: return {'kind': kind} else: return None def updatePanel(self): super(CarcassonneWidget, self).updatePanel() self.updateScores() if self.engine.getWinner(): self.finishButton.setDisabled(True) self.detailGroup.updateStats() else: self.detailGroup.updateRound() def checkPlayerScore(self, player, score): if score > 0: return True else: return False def commitRound(self): player = self.gameInput.getPlayer() kind = self.gameInput.getKind() score = self.gameInput.getScore() if player == "": msg = i18n( "CarcassonneWidget", "You must select a player") QMessageBox.warning(self, self.game, msg) return if kind == "": msg = i18n( "CarcassonneWidget", "You must select a kind") QMessageBox.warning(self, self.game, msg) return if not self.checkPlayerScore(player, score): msg = i18n( "GameWidget", "{0} score is not valid").format(player) QMessageBox.warning(self, self.game, msg) return # Everything ok so far, let's confirm title = i18n( "CarcassonneWidget", 'Commit Entry') msg = i18n( "CarcassonneWidget", "Are you sure you want to commit this entry?") ret = QMessageBox.question(self, title, msg, QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) if ret == QMessageBox.No: return # Once here, we can commit round try: self.playerGroupBox[self.engine.getDealer()].unsetDealer() except KeyError: pass self.engine.addEntry(player, score, {'kind': kind}) self.engine.printStats() self.updatePanel() def finish(self): title = i18n( "CarcassonneWidget", 'Finish game') msg = i18n( "CarcassonneWidget", "Are you sure you want to finish the current game?") ret = QMessageBox.question(self, title, msg, QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) if ret == QMessageBox.No: return self.engine.finishGame() self.updatePanel() def updateScores(self): for player in self.players: score = self.engine.getScoreFromPlayer(player) self.playerGroupBox[player].updateDisplay(score) def setWinner(self): super(CarcassonneWidget, self).setWinner() winner = self.engine.getWinner() if winner in self.players: self.playerGroupBox[winner].setWinner() def unsetDealer( self): self.playerGroupBox[self.engine.getDealer()].unsetDealer() def setDealer( self): self.playerGroupBox[self.engine.getDealer()].setDealer() def updatePlayerOrder(self): GameWidget.updatePlayerOrder(self) trash = QWidget() trash.setLayout(self.playersLayout) self.playersLayout = QVBoxLayout(self.playerGroup) self.playersLayout.addStretch() for i, player in enumerate(self.engine.getListPlayers()): trash.layout().removeWidget(self.playerGroupBox[player]) self.playersLayout.addWidget(self.playerGroupBox[player]) self.playerGroupBox[player].setColour(PlayerColours[i]) self.playersLayout.addStretch() self.detailGroup.updateRound()