1

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

我的麻烦来自我的rowabouttowin方法:我做了一个非常复杂的列表理解,但我认为我做得不对。

我想要的是一种检查玩家是否将水平赢得游戏的方法(O _ O,OO _ 或 _ OO,如果标记 = 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
4

1 回答 1

2

一些提示:

  • 您使用的是类变量,而不是实例变量,因此请查看差异。我将您的类更改为使用实例变量,因为您设置的变量应该属于一个实例。

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

  • 用于__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]
于 2012-12-05T23:16:05.003 回答