[英]Python: Connect Four Alternating turns
我一直在研究实现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()
任何想法,意见或建议将不胜感激!
问题是,尽管您要传递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
和一个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
是一个合理的“虚假信息”,但“ False
则更为合理,而且无论哪种方式,都很难想象您为什么要显式地检查它,而不仅仅是检查它是否是虚假的。 (此外,即使出于某些原因确实需要专门检查None
,也几乎没有理由使用== None
而不是is None
。)
其次,为什么需要在play_game
函数之外创建board
, player1
和player2
? 在此功能之外,它们似乎并没有那么有用。
最后,即使只有两个参与者,我认为如果重构公共部分,您的代码也会更简单:
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中是平局还是输局,但我很确定这不是胜利,是吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.