2011-10-18 2 views
0

У меня есть большая часть моей версии Python для подключения Four, за исключением функции выигрыша и силы тяжести. Ниже приведен код для определения того, была ли игра выиграна еще. Она не работает, в настоящее время единственным способом окончания игры является то, что все пятна заняты. Есть идеи?Python Connect Four игра win function

winners = [ [1,2,3,4],[2,3,4,5],[3,4,5,6],[4,5,6,7],[8,9,10,11],[9,10,11,12],[10,11,12,13],[11,12,13,14], 
        [15,16,17,18],[16,17,18,19],[17,18,19,20],[18,19,20,21],[22,23,24,25],[23,24,25,26],[24,25,26,27], 
        [25,26,27,28],[29,30,31,32],[30,31,32,33],[31,32,33,34],[32,33,34,35],[36,37,38,39],[37,38,39,40], 
        [38,39,40,41],[39,40,41,42],[1,8,15,22],[8,15,22,29],[15,22,29,36],[2,9,16,23],[9,16,23,30],[16,23,30,37], 
        [3,10,17,24],[10,17,24,31],[17,23,31,38],[4,11,18,25],[11,18,25,32],[18,24,32,39],[5,12,19,26],[12,19,26,33], 
        [19,25,33,40],[6,13,20,27],[13,20,27,34],[20,28,34,41],[7,14,21,28],[14,21,28,35],[21,28,35,42],[1,9,17,25], 
        [9,17,25,33],[17,25,33,41],[8,16,24,32],[16,24,32,40],[15,23,31,39],[2,10,18,26],[10,18,26,34],[18,26,34,42], 
        [3,11,19,27],[11,19,27,35],[4,12,20,28] ] 

    def makeMove(self): 
     self.Player = self.game.Player 

     if self.game.Player == 'Black': 
      self.b.config(image=self.Black, command=self.invalidMove) 
      num = self.num 
      self.game.moves['Black'].append(num) 
      self.game.free.remove(num) 
      w = self.won(self.game.Player) 
      if self.game.moves['Black'] in winners: 
       self.game.turninfo.config(text=self.game.Player+' WON!') 
      elif self.game.free == [ ]: 
       self.game.turninfo.config(text='Game is a draw!') 
      else: 
       self.game.Player = 'Red' 
       self.game.turninfo.config(text=self.game.Player+"'s Turn") 
     elif self.game.Player == 'Red': 
      self.b.config(image=self.Red, command=self.invalidMove) 
      num = self.num 
      self.game.moves['Red'].append(num) 
      self.game.free.remove(num) 
      w = self.won(self.game.Player) 
      if contains(self.game.moves['Red'],winners): 
       self.game.turninfo.config(text=Player+' WON!') 
       for c in self.game.cells: 
        c.freeze() 
      elif self.game.free == [ ]: 
       self.game.turninfo.config(text='Game is a draw!') 
       for c in self.game.cells: 
        c.freeze() 
      else: 
       self.game.Player = 'Black' 
       self.game.turninfo.config(text=self.game.Player+"'s Turn") 
+0

Не вы уже задать этот вопрос, и WASN» Он закрыт? –

+1

Предыдущий вопрос имел примерно в 4 раза больше кода. Это урезанная версия, которая является более кратким и не должна быть опущена/закрыта только потому, что последняя была. –

ответ

1

Я думаю, что ваша проблема заключается в том, что вы проверяете, действительно ли игроки перемещаются в соответствии с одним из условий победы. Это возможно, но, вероятно, этого не произойдет, например, игрок может сделать ход [2, 3, 1, 4], который должен считаться выигрышем, но [2, 3, 1, 4] не находится в winners, поэтому вы не получите матч. Кроме того, если вы когда-либо принимали игрока более четырех ходов, вы бы никогда не получили победителя по той же причине (так как [6, 1, 2, 3, 4] не найдено в winners).

Что вы на самом деле хотите узнать, если для любого из условий выигрыша все ходы состояния выигрыша были сделаны игроком. Это может быть выражено следующим образом:

for winner in winners: 
    won = True 
    for move in winner: 
     if move not in self.game.moves['Black']: 
      won = False 
    if won: 
     # game ending logic 
     break 

Это может быть значительно сокращен до следующего (но это может быть труднее следовать):

if any(all(m in self.game.moves['Black'] for m in w) for w in winners)): 
    # game ending logic 
+0

Эта вторая, более сложная работа. Спасибо огромное! – Jakemmarsh

+0

И извините за предыдущий пост, надеюсь, этот был лучше. – Jakemmarsh

Смежные вопросы