2012-11-29 31 views
1

我正在爲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方法中的某個點發生了錯誤,而不是某些可迭代的數據。

任何幫助?

+0

有點偏離主題,但如果你想實現一個真正聰明的IA,請查看[xkcd tic-tac-toe map](http://xkcd.com/832/)。當然,你有時會讓內部審計師做出不理想的舉動,以便可以打敗。 – lucasg

回答

2
def rowabouttowin(self,mark): 
    [...] 
    return 4 

這將返回int,而不是(int,int)如預期self.mark()

順便說一句,我相信你的代碼將是到目前爲止,如果你沒有爲這兩個使用相同的名稱(如mark)更具可讀性變量,方法和參數。

+0

如上面關於命名一樣,你也有3個稱爲選擇的功能。 – timc