#-*-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()
结果截图:
最可能出现的情况:
偶尔: