井字棋

本文介绍了一个使用PyQt4实现的井字棋游戏GUI应用,详细展示了如何通过Python进行游戏逻辑开发及图形用户界面的设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#-*-coding:utf-8-*-
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class TicTacToe(QMainWindow):
    def __init__(self,parent=None):
        super(TicTacToe,self).__init__(parent)
        self.board=[['','',''],
                    ['','',''],
                    ['','','']]
        self.isEnd=False #游戏是否结束
        
        self.isFirstStep=True #是否是AI的第一步

        self.newgame=QAction(QIcon('icon/begin.png'),'newGame',self)
        self.connect(self.newgame,SIGNAL('triggered()'),self.restart)
        self.gamebar = self.addToolBar('newGame')
        self.gamebar.addAction(self.newgame)
        

        
        
        self.table=QTableWidget(3,3)
        self.table.verticalHeader().setVisible(False)
        self.table.horizontalHeader().setVisible(False)
        self.table.setEditTriggers(QTableWidget.NoEditTriggers)
        for i in range(3):
            self.table.setColumnWidth(i,90)
            self.table.setRowHeight(i,90)
        self.table.cellClicked.connect(self.handleInput)

        self.setWindowTitle('TicTacToe')
        self.setCentralWidget(self.table)
        self.setFixedSize(300,330)
        self.setWindowIcon(QIcon('icon/3.png'))

    def handleInput(self,x,y):
        if self.isEnd or self.board[x][y]!='':
            return
        #Humam
        self.board[x][y]='X'
        self.paintTable()
        self.whoWin()
        #Machine
        if self.isEnd:
            return
        self.nextStep()
        self.paintTable()
        self.whoWin()

    def nextStep(self):
        #core function
        if self.isFirstStep:
            if self.board[1][1]=='X':
                self.board[0][2]='O'
            else:
                self.board[1][1]='O'
            self.isFirstStep=False
        elif self.offense():#进攻成功,返回
            return
        elif self.defense():#防守成功,返回
            return
        else:
            self.doOther()
            return

    def doOther(self):
        if self.board[1][1]=='O' and ((self.board[0][0]=='X' and self.board[2][2]=='X')\
                                     or   (self.board[2][0]=='X' and self.board[0][2]=='X')):
                self.board[0][1]='O'
        else:
            for i in range(3):
                for j in range(3):
                    if self.board[i][j]=='':
                        self.board[i][j]='O'
                        return
        

    def offense(self):
        #行
        for i in range(3):
            if self.board[i][0]=='O' and self.board[i][1]=='O' and self.board[i][2]=='O':
                self.board[i][2]='O'
                return True
            elif self.board[i][0]=='O' and self.board[i][1]=='' and self.board[i][2]=='O':
                self.board[i][1]='O'
                return True
            elif self.board[i][0]=='' and self.board[i][1]=='O' and self.board[i][2]=='O':
                self.board[i][0]='O'
                return True
        #列
        for i in range(3):
            if self.board[0][i]=='O' and self.board[1][i]=='O' and self.board[2][i]=='':
                self.board[2][i]='O'
                return True
            elif self.board[0][i]=='O' and self.board[1][i]=='' and self.board[2][i]=='O':
                self.board[1][i]='O'
                return True
            elif self.board[0][i]=='' and self.board[1][i]=='O' and self.board[2][i]=='O':
                self.board[0][i]='O'
                return True
        #对角线
        if self.board[0][0]=='O' and self.board[1][1]=='O' and self.board[2][2]=='':
            self.board[2][2]='O'
            return True
        if self.board[0][0]=='' and self.board[1][1]=='O' and self.board[2][2]=='O':
            self.board[0][0]='O'
            return True
        if self.board[0][0]=='O' and self.board[1][1]=='' and self.board[2][2]=='O':
            self.board[1][1]='O'
            return True
        
        if self.board[0][2]=='O' and self.board[1][1]=='O' and self.board[2][0]=='':
            self.board[2][0]='O'
            return True
        if self.board[0][2]=='' and self.board[1][1]=='O' and self.board[2][0]=='O':
            self.board[0][2]='O'
            return True
        if self.board[0][2]=='O' and self.board[1][1]=='' and self.board[2][0]=='O':
            self.board[1][1]='O'
            return True
        return False

    def defense(self):
        #行
        for i in range(3):
            if self.board[i][0]=='X' and self.board[i][1]=='X' and self.board[i][2]=='':
                self.board[i][2]='O'
                return True
            elif self.board[i][0]=='X' and self.board[i][1]=='' and self.board[i][2]=='X':
                self.board[i][1]='O'
                return True
            elif self.board[i][0]=='' and self.board[i][1]=='X' and self.board[i][2]=='X':
                self.board[i][0]='O'
                return True
        #列
        for i in range(3):
            if self.board[0][i]=='X' and self.board[1][i]=='X' and self.board[2][i]=='':
                self.board[2][i]='O'
                return True
            elif self.board[0][i]=='X' and self.board[1][i]=='' and self.board[2][i]=='X':
                self.board[1][i]='O'
                return True
            elif self.board[0][i]=='' and self.board[1][i]=='X' and self.board[2][i]=='X':
                self.board[0][i]='O'
                return True
        #对角线
        if self.board[0][0]=='X' and self.board[1][1]=='X' and self.board[2][2]=='':
            self.board[2][2]='O'
            return True
        if self.board[0][0]=='' and self.board[1][1]=='X' and self.board[2][2]=='X':
            self.board[0][0]='O'
            return True
        if self.board[0][0]=='X' and self.board[1][1]=='' and self.board[2][2]=='X':
            self.board[1][1]='O'
            return True
        
        if self.board[0][2]=='X' and self.board[1][1]=='X' and self.board[2][0]=='':
            self.board[2][0]='O'
            return True
        if self.board[0][2]=='' and self.board[1][1]=='X' and self.board[2][0]=='X':
            self.board[0][2]='O'
            return True
        if self.board[0][2]=='X' and self.board[1][1]=='' and self.board[2][0]=='X':
            self.board[1][1]='O'
            return True
        return False
        
        

    def paintTable(self):
        textFont=QFont("Decorative",24,QFont.Bold)
        for i in range(3):
            for j in range(3):
                if self.board[i][j]!='':
                    newItem=QTableWidgetItem(self.board[i][j])
                    if self.board[i][j]=='O':
                        newItem.setTextColor(Qt.blue)
                    else:
                        newItem.setTextColor(Qt.red)
                    newItem.setTextAlignment(Qt.AlignCenter)
                    newItem.setFont(textFont)
                    self.table.setItem(i,j,newItem)

    def whoWin(self):
        #check 行 列
        for i in range(3):
            if self.board[i][0]==self.board[i][1]==self.board[i][2]:
                if self.board[i][0]=='X':
                    QMessageBox.information(self,"Cong","You Win!")
                    self.isEnd=True
                    return
                if self.board[i][0]=='O':
                    QMessageBox.information(self,"Game Over","You Lose!")
                    self.isEnd=True
                    return
            if self.board[0][i]==self.board[1][i]==self.board[2][i]:
                if self.board[0][i]=='X':
                    QMessageBox.information(self,"Cong","You Win!")
                    self.isEnd=True
                    return
                if self.board[0][i]=='O':
                    QMessageBox.information(self,"Game Over","You Lose!")
                    self.isEnd=True
                    return
        #check 对角线
        if self.board[0][0]==self.board[1][1]==self.board[2][2] or \
           self.board[0][2]==self.board[1][1]==self.board[2][0]:
            if self.board[1][1]=='X':
                QMessageBox.information(self,"Cong","You Win!")
                self.isEnd=True
                return
            if self.board[1][1]=='O':
                QMessageBox.information(self,"Game Over","You Lose!")
                self.isEnd=True
                return
        #check 平局
        isTie=True
        for i in range(3):
            for j in range(3):
                if self.board[i][j]=='':
                    isTie=False
        if isTie:
            QMessageBox.information(self,"End","Tie!")
            self.isEnd=True
            return
        
    def restart(self):
        self.isEnd=False
        self.isFirstStep=True
        for i in range(3):
            for j in range(3):
                self.board[i][j]=''
                newItem=QTableWidgetItem(self.board[i][j])
                self.table.setItem(i,j,newItem)
                
            

def main():
    app=QApplication(sys.argv)
    demo=TicTacToe()
    demo.show()
    app.exec_()
    
if __name__=='__main__':
    main()

结果截图:

最可能出现的情况:


偶尔:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值