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给 super 方法Player.play_turn,但随后它创建了一个新板b = ConnectFour(),并且它所做的一切都是针对板,而不是原始板。

同样,在 中play_game,您采用 a board、 aplayer1和 a player2,但对它们不做任何事情,而是创建名为bf和的新值g

所以,你想要的是这样的:

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应该返回一些真实的东西,否则返回一些虚假的东西。虽然None是一个合理的“虚假的东西”,False但更合理——而且,无论哪种方式,很难想象你为什么要明确地检查它,而不是仅仅检查它是否是虚假的。(另外,即使您出于某种原因确实需要专门检查None,也几乎没有充分的理由使用== None而不是is None.)

其次,为什么需要在函数之外创建board、、player1和?在此功能之外,它们似乎并没有那么有用。player2play_game

最后,即使只有两个玩家,我认为如果您重构公共部分,您的代码会更简单:

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

最后一件事:你的逻辑似乎没有考虑到游戏可能结束的可能性,因为当前玩家没有行动。我不确定这在 Connect 4 中是平局还是失败,但我很确定这不是胜利,是吗?

于 2013-04-01T23:54:35.527 回答