1

私はPythonクラスのプログラムを書いています。Tic Tac Toe ゲームを作成するには、OOP を使用する必要があります。私が完了したいくつかの要件があります。最後の要件は、コンピューター プレーヤーが「賢く」あることです。つまり、ブロックしたり、可能な場合は連続してスポットを再生したりします。私の教授はこれを行う方法について実際には何の指示も与えなかったので、私は少し困惑しています.

プログラムで私が現在行っているのは、プレイヤーが水平方向の列で勝つまであと 1 手かどうかをチェックすることです。これが私のコードです(非常に面倒で非効率的です、私は知っています)。

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 のクラスで過ごした数日をはるかに超えているからです。反復可能なデータではなく整数を出力している choose または rowabouttowin メソッドのある時点でエラーを犯したと確信しています。

何か助けはありますか?

4

1 に答える 1

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

これは、期待どおりではintなく、(int,int)self.mark()

ところで、mark変数、メソッド、パラメーターの両方に同じ名前 ( など) を使用しないと、コードがはるかに読みやすくなると思います。

于 2012-11-29T23:56:21.787 に答える