2012-12-05 160 views
1

我正在为作业写一个井字棋游戏。它需要使用面向对象的编程,它必须相对聪明 - 它需要阻止玩家的成功。我遇到了很多麻烦。Python - OOP井字游戏

我的问题来自我的rowabouttowin方法:我做了一个非常复杂的列表理解,我认为我没有做到正确。

我想要的是一种方法,用于检查玩家是否将水平赢得比赛(O_O,OO_或OO,如果mark = O),并且如果玩家是,返回位置电脑应该玩。

任何关于如何最好地解决这个问题的帮助或建议?

from random import randint 

class TTT: 
    board = [[' ' for row in range(3)] for col in range(3)] 
    currentgame = [] 

    def print(self): 
    """Displays the current board.""" 
     print("\n-----\n".join("|".join(row) for row in self.board)) 

    def mark(self,pos,mark): 
    """Method that places designated mark at designated position on the board.""" 
     x,y = pos 
     self.board[x][y] = mark 

    def win(self,mark): 
    """Method that checks if someone has won the game.""" 
     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): 
    """The computer chooses a place to play. If the player is not about to win, 
    plays randomly. Otherwise, does a series of checks to see if the player is about 
    to win horizontally, vertically, or diagonally. I only have horizontal done.""" 
     spotx = randint(0,2) 
     spoty = randint(0,2) 
     if self.rowabouttowin(mark): 
      self.mark((self.rowabouttowin(mark)),mark) 
     elif self.legalspace(spotx,spoty): 
      self.mark((spotx,spoty),mark) 
     else: 
      self.choose(mark) 


    def legalspace(self,spotx,spoty): 
    """Returns True if the provided spot is empty.""" 
     if self.board[spotx][spoty] == ' ': 
      return True 
     else: 
      return False 


    def rowabouttowin(self,mark): 
    """If the player is about to win via a horizontal 3-in-a-row, 
    returns location where the computer should play""" 
     for row in range(3): 
      if any(' ' == self.board[row][1] for i in range(3)) and any(self.board[row][i] == self.board[row][j] for i in range(3) for j in range(3)): 
        if self.board[row][i] == ' ' : yield(self.board[row][i % 3], self.board[row][i]) 

目前这给出了这样的错误消息:

Traceback (most recent call last): 
    File "<pyshell#49>", line 1, in <module> 
    x.choose('x') 
    File "/Users/richiehoffman/Documents/Python Programs/Tic Tac Toe.py", line 40, in choose 
    self.mark((self.rowabouttowin(mark)),mark) 
    File "/Users/richiehoffman/Documents/Python Programs/Tic Tac Toe.py", line 11, in mark 
    x,y = pos 
    File "/Users/richiehoffman/Documents/Python Programs/Tic Tac Toe.py", line 61, in rowabouttowin 
    if self.board[row][i] == ' ' : yield(self.board[row][i % 3], self.board[row][i]) 
NameError: global name 'i' is not defined 
+0

如果一个行有三个'for'循环和'yield',你真的应该考虑打破它。 – Blender

+0

好吧,基本上''我在for循环里声明'any(''== self.board [row] [1] for i in range(3))''and'any(self.board [row] [ i] == self.board [row] [j] for i in range(3)for j in range(3)'有一个范围以这些语句结束 您必须使用一个在这两个语句之外的循环,并且在条件体内使用该索引 – SiddharthaRT

+0

并且,你是否指'self.board [row] [i]'in'any(''== self.board [row] [1] ))和......'? – SiddharthaRT

回答

1

一些提示:

  • 您使用类变量,而不是实例变量,所以找差价。我将您的类更改为使用实例变量,因为您设置的变量应该属于实例。

  • 考虑让事情更具可读性。

  • 使用__str__来制作班级的可打印版本。这样,你可以做print(class_instance),它会出来很好。

这是我改变了:

from random import randint 

class TTT(object): 
    def __init__(self): 
     self.board = [[' ' for row in range(3)] for col in range(3)] 
     self.currentgame = [] 

    def __str__(self): 
     """Displays the current board.""" 

     return "\n-----\n".join("|".join(row) for row in self.board) 

    def mark(self, pos, mark): 
     """Method that places designated mark at designated position on the board.""" 

     x, y = pos 
     self.board[x][y] = mark 

    def win(self, mark): 
     """Method that checks if someone has won the game.""" 

     for row in self.board: 
      if row[0] == row[1] == row[2]: 
       return True 

     for i in range(3): 
      if self.board[0][i] == self.board[1][i] == self.board[2][i]: 
       return True 

     if board[0][0] == board[1][1] == board[2][2]: 
      return True 
     elif board[0][2] == board[1][1] == board[2][0]: 
      return True 
     else: 
      return False 



    def choose(self, mark): 
     """The computer chooses a place to play. If the player is not about to win, 
     plays randomly. Otherwise, does a series of checks to see if the player is about 
     to win horizontally, vertically, or diagonally. I only have horizontal done.""" 

     spotx = randint(0, 2) 
     spoty = randint(0, 2) 

     if self.rowabouttowin(mark): 
      self.mark((self.rowabouttowin(mark)), mark) 
     elif self.legalspace(spotx, spoty): 
      self.mark((spotx, spoty), mark) 
     else: 
      self.choose(mark) 


    def legalspace(self, spotx, spoty): 
     """Returns True if the provided spot is empty.""" 

     return self.board[spotx][spoty] == ' ' 


    def rowabouttowin(self, mark): 
     """If the player is about to win via a horizontal 3-in-a-row, 
     returns location where the computer should play""" 

     for row in range(3): 
      check_one = any(' ' == self.board[row][1] for i in range(3)) 
      check_two = any(self.board[row][i] == self.board[row][j] for i in range(3) for j in range(3)) 

      # I have no idea what this code does 

      if self.board[row][i] == ' ' : 
       yield self.board[row][i % 3], self.board[row][i]