我正在爲Python類編寫一個程序。它必須使用OOP來創建一個Tic Tac Toe遊戲。我已經完成了一些要求。最後的要求是,電腦玩家必須是「聰明」的 - 做一些事情,比如阻止,在可能的時候連續播放,等等。我的教授並沒有給我們任何指導如何做到這一點,所以我有點困惑。Python中的面向對象的井字遊戲
我現在在這個程序中正試圖提供一個檢查,以確定玩家是否通過水平行離開獲勝。這是我的代碼(我知道它非常混亂和低效)。
from random import randint
class TTT:
board = [[' ' for row in range(3)] for col in range(3)]
currentgame = []
def print(self):
print("\n-----\n".join(["|".join(row) for row in self.board]))
def mark(self,pos,mark):
x,y = pos
self.board[x][y] = mark
def win(self,mark):
if mark == self.board[0][0] == self.board[1][1] == self.board[2][2]:
return True
if mark == self.board[2][0] == self.board[1][1] == self.board[0][2]:
return True
elif mark == self.board[0][0] == self.board[1][0] == self.board[2][0]:
return True
elif mark == self.board[1][0] == self.board[1][1] == self.board[1][2]:
return True
elif mark == self.board[0][1] == self.board[1][1] == self.board[2][1]:
return True
elif mark == self.board[0][2] == self.board[1][2] == self.board[2][2]:
return True
elif mark == self.board[0][0] == self.board[0][1] == self.board[0][2]:
return True
elif mark == self.board[2][0] == self.board[2][1] == self.board[2][2]:
return True
else:
return False
def choose(self,mark):
if self.board == [[' ', ' ', ' '], [' ', ' ', ' '], [' ', ' ', ' ']]:
self.mark((randint(0,2),randint(0,2)),mark)
def choose(self,mark):
spotx = randint(0,2)
spoty = randint(0,2)
if self.board[spotx][spoty] == ' ':
self.mark((spotx,spoty),mark)
else:
self.choose(mark)
def choose(self,mark):
spotx = randint(0,2)
spoty = randint(0,2)
if self.rowabouttowin(mark) == (0,0) or (0,1) or (0,2) or (1,0) or (1,1) or (1,2) or (2,0) or (2,1) or (2,2):
self.mark((self.rowabouttowin(mark)),mark)
if self.legalspace(spotx,spoty):
self.mark((spotx,spoty),mark)
else:
self.choose(mark)
def legalspace(self,spotx,spoty):
if self.board[spotx][spoty] == ' ':
return True
else:
return False
def rowabouttowin(self,mark):
for row in range(3):
if self.board[row] == [mark,mark,'']:
return (row,2)
if self.board[row] == [mark,'',mark]:
return (row,1)
if self.board[row] == ['',mark,mark]:
return (row,0)
else:
return 4
我的問題是,我得到一個錯誤信息:
Traceback (most recent call last):
File "<pyshell#194>", line 1, in <module>
x.choose('x')
File "/Users/richiehoffman/Documents/Python Programs/Tic Tac Toe.py", line 64, in choose
self.mark((self.rowabouttowin(mark)),mark)
File "/Users/richiehoffman/Documents/Python Programs/Tic Tac Toe.py", line 23, in mark
x,y = pos
TypeError: 'int' object is not iterable
我坦白了我的知識區在這裏,因爲分配是顯著超出了夫妻在上課日的我們花在面向對象的Python上。我確信我在選擇或者輸出整數的rowabouttowin方法中的某個點發生了錯誤,而不是某些可迭代的數據。
任何幫助?
有點偏離主題,但如果你想實現一個真正聰明的IA,請查看[xkcd tic-tac-toe map](http://xkcd.com/832/)。當然,你有時會讓內部審計師做出不理想的舉動,以便可以打敗。 – lucasg