2013-04-01 94 views
2

我一直在研究一个实现连接4游戏的程序,我碰到了一个障碍。这里是我的输出:Python:连接四个轮流轮流

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

任何想法,输入或建议将不胜感激!

+3

看来你的代码是不完整的。它是从早期版本粘贴的吗? 特别是,董事会对象的通过不明确。 'play_game'和'play_turn'需要一个电路板参数,但它没有通过,然后他们使用'b = ConnectFour()',这是没有显示。 请详细说明。 – yoniLavi

+1

它看起来像你创造了一个新的'ConnectFour'转向。你不应该只在整个游戏中创建一个吗? – ApproachingDarknessFish

回答

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,你把boardplayer1player2,但什么都不做与他们,而是创建新的名为bfg

所以,你要的是这样的:

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

其次,为什么你需要创建boardplayer1,和player2以外的play_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中的一场胜败,但我很确定这不是一场胜利,是吗?

+0

非常感谢您的帮助!我将你告诉我的和我的程序运行得很好!至于你对无事件的担忧 - 这个计划是我CS课程的一个任务,长篇小说就是这个项目的设置。但我真的很欣赏这个建议,我肯定会尝试应用更多的技巧:) –