2

Connect 4 のゲームを実装するプログラムに取り組んできましたが、問題が発生しました。ここに私の出力があります:

>>> ================================ RESTART ================================
>>> 
Player 1 please pick a column: 5
-----------------------------
| 0 | 1 | 2 | 3 | 4 | 5 | 6 |
-----------------------------
|   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |
|   |   |   |   |   | x |   |
-----------------------------
Player 2 please pick a column: 6
-----------------------------
| 0 | 1 | 2 | 3 | 4 | 5 | 6 |
-----------------------------
|   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |
|   |   |   |   |   |   | o |
-----------------------------

したがって、基本的に、交互にターンするときにボードは「更新」されません。基本的に、私のコードは次のようになります。

-----------------------------
| 0 | 1 | 2 | 3 | 4 | 5 | 6 |
-----------------------------
|   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |
|   |   |   |   |   | x | o |
-----------------------------

ボードを適切に更新するために何をしなければならないのかよくわかりません。印刷機能をいじってみましたが、出力が以前より悪くなってしまいました。これが私のコードです:

プレーヤーのインポートから *

def play_game(board, player1,player2):
    b = ConnectFour()
    f = Human(1)
    g = Human(2)
    while True:
        f.play_turn(1)
        if b.is_game_over() == None:
            g.play_turn(2)
            if b.is_game_over() == None:
                pass
            else:
                print "Player 2 wins"
                break
        else:
            print "Player 1 wins"
            break

基本的に: プレイヤー 1 がプレイし、プレイヤー 2 がプレイしない場合は勝者がいるかどうかを確認します。そして、これは別のクラスを呼び出します:

class Human(Player):
    def play_turn(self,board):
        super(Human, self).play_turn(board)
        b = ConnectFour()   
        x = raw_input("Player %s please pick a column: " % self.playernum)
        b.play_turn(self.playernum, int(x))
        b.print_board()

アイデア、意見、アドバイスをいただければ幸いです。

4

1 に答える 1

1

問題は、boardオブジェクトを渡しているにもかかわらず、それらを無視し、どこにでも新しいオブジェクトを作成することです。

まず、次を見てくださいHuman.play_turn

def play_turn(self,board):
    super(Human, self).play_turn(board)
    b = ConnectFour()   
    x = raw_input("Player %s please pick a column: " % self.playernum)
    b.play_turn(self.playernum, int(x))
    b.print_board()

boardこれはスーパーメソッドに渡されPlayer.play_turnますが、新しいボードが作成b = ConnectFour()され、元のボードではなくそのボードに対して行われます。

同様に、 ではplay_game、 、board、および を使用しますが、それらには何もせず、代わりに、、およびplayer1という名前の新しいものを作成します。player2bfg

したがって、あなたが望むのは次のようなものです:

def play_game(board, player1,player2):
    while True:
        player1.play_turn(board)
        if board.is_game_over() == None:
            player2.play_turn(board)
            if board.is_game_over() == None:
                pass
            else:
                print "Player 2 wins"
                break
        else:
            print "Player 1 wins"
            break

class Human(Player):
    def play_turn(self,board):
        super(Human, self).play_turn(board)
        x = raw_input("Player %s please pick a column: " % self.playernum)
        board.play_turn(self.playernum, int(x))
        board.print_board()

これで差し迫った問題は解決するはずですが、他のすべての機能で非常によく似た問題を抱えていると思います。

一方、あなたのデザインには奇妙な点がいくつかあります。

たとえば、なぜあなたはチェックしていますif b.is_game_over() == None:か?呼び出された関数is_game_overは、ゲームが終了した場合はおそらく true を返し、そうでない場合は false を返す必要があります。whileNoneは合理的な「何か偽物」ですFalseが、さらに合理的です。いずれにせよ、単に偽物であることを確認するのではなく、明示的に確認する必要がある理由を想像するのは困難です。(さらに、何らかの理由で特にチェックする必要がある場合でも、 の代わりに使用する正当な理由はほとんどありません。)None== Noneis None

第二に、関数の外側にboardplayer1、およびを作成する必要があるのはなぜですか? この機能の外では、それらがそれほど役立つとは思えません。player2play_game

最後に、プレイヤーが 2 人しかいない場合でも、共通部分をリファクタリングすると、コードがよりシンプルになると思います。

def play_game(board, player1,player2):
    while True:
        for player in player1, player2:
            player.play_turn(board)
            if board.is_game_over():
                print "Player {} wins".format(player.playernum)
                break

最後にもう 1 つ: あなたのロジックは、現在のプレイヤーが何もできないためにゲームが終了する可能性を考慮していないようです。Connect 4 での引き分けか負けかはわかりませんが、勝ちではないことは確かですよね?

于 2013-04-01T23:54:35.527 に答える