Пример #1
0
class View(QWidget):
    def __init__(self):
        super().__init__(parent=None)
        self.initUI()

    def initUI(self):
        self.grid = 7
        self.line =  50
        self.model = Model()
        self.color = {0:"Player",1:"AI"}
        self.player = [0,1]
        self.setGeometry(300,300,700,800)
        self.setWindowTitle("五子棋")
        self.show()

    def paintEvent(self,e):
        painter = QPainter()
        painter.begin(self)

        self.drawLines(painter)
        self.drawCircles(painter)
        painter.end()
        QApplication.processEvents()


    # 画棋盘
    def drawLines(self,qp):
        pen = QPen(Qt.black, 2, Qt.SolidLine)
        qp.setPen(pen)

        for i in range(self.grid):
            additional_width = self.line * i
            x_cord = 100 + additional_width
            y_cord = 100 + additional_width
            max_length = self.line * (self.grid - 1) + 100
            qp.drawLine(x_cord,100,x_cord,max_length)
            qp.drawLine(100,y_cord,max_length,y_cord)

    # 画棋子
    def drawCircles(self,qp):
        pen = QPen(Qt.black, 2, Qt.SolidLine)
        qp.setPen(pen)
        player_state,ai_state = get_player_and_avaiable(self.model.state)

        for i,piece_center in enumerate(player_state):
            piece_center = QPoint(piece_center[0], piece_center[1])
            qp.setBrush(QColor(Qt.black))
            qp.drawEllipse(piece_center, 20, 20)
        for i,piece_center in enumerate(ai_state):
            piece_center = QPoint(piece_center[0], piece_center[1])
            qp.setBrush(QColor(Qt.white))
            qp.drawEllipse(piece_center, 20, 20)

    # 鼠标点击,触发player下子和ai下子
    def mousePressEvent(self,event):
        click_location = (event.x(),event.y())
        player_select = self.model.player_move(click_location)

        if player_select is None:
            print("Pleace Reselect Location")
        else:
            # Player 走子
            if self.run_process(player_select):
                self.game_end()
                return
            self.player = self.player[::-1]

            # AI 走子
            player_select = self.model.AI_move()
            if self.run_process(player_select):
                self.game_end()
            self.player = self.player[::-1]
        self.update()

    #更新棋盘,判断赢家
    def run_process(self,player_select):
        self.model.board_update(player_select,self.player[0])
        terminal = is_terminal(self.model.state)
        return terminal

    # 游戏结束
    def game_end(self):
        buttonReply = QMessageBox.question(self, 'PyQt5 message', "{} is the winner.Play Again?".format(self.color[self.player[0]]),
                                           QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
        if buttonReply == QMessageBox.Yes:
            self.close()
            self.initUI()
        else:
            self.close()