2013-04-01 141 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課程的一個任務,長篇小說就是這個項目的設置。但我真的很欣賞這個建議,我肯定會嘗試應用更多的技巧:) –