Python 连接四子游戏胜利函数
我已经写好了大部分的Python版四子棋代码,除了判断胜利的功能和重力效果。下面是用来判断游戏是否已经获胜的代码。不过现在这个功能还不能用,目前游戏结束的唯一方式就是所有的位置都被占满了。有没有什么建议?
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")
1 个回答
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