Skip to main content
 首页 » 编程设计

Python:连接四个交替的转弯

2025年05月04日11mfrbuaa

我一直在开发一个实现 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 下棋,如果没有玩家二下棋,我们会检查是否有赢家,依此类推。这会调用一个单独的类:

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() 

如有任何想法、意见或建议,我们将不胜感激!

请您参考如下方法:

问题是,虽然您正在传递 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 中,你拿了一个 board,一个 player1 和一个 player2,但是什么都不用,而是创建新的名为 b、f 和 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 是一个合理的“something falsey”,但 False 更合理——而且,无论哪种方式,都很难想象你为什么要明确地检查它,而不是仅仅检查它是否是假的。 (此外,即使您确实出于某种原因需要专门检查None,也几乎没有充分的理由改用== None的 是 None。)

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

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

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 中这是平局还是输家,但我很确定这不是赢家,对吧?