我正在用python開發一個井字游戲(為了提高我的python技能),我被以下問題困住了:我有一個像下面這樣的串列,根據所有的值是否垂直、水平或對角線有相同的值來決定玩家是否獲勝。
win_horizontal = [[board[0], board[1], board[2]]。[board[3], board[4], board[5] ]。[board[6], board[7], board[8] ]]
win_vertical = [[board[0], board[3], board[6], [board[1], board[4], board[7]], [board[2], board[5], board[8] ]]
win_diagonal = [[board[0], board[4], board[8] ]。[board[2], board[4], board[6] ]]
因此,目前,我有以下的邏輯:
result = False。
結果 = all(elem == mark for elem in win_horizontal[1] )
if result :
print("All Elements in List are Equal")
else:
print("All Elements in List are Not Equal")
這樣做可以,因為我只檢查串列中的一個串列。然而,我不確定如何檢查所有的串列以確定玩家是否在對角線上、水平線上或垂直線上獲勝。我希望能夠對所有的串列進行檢查。
我嘗試了以下方法
def win_check(board, mark)。
win_horizontal = [[board[0], board[1], board[2]], [board[3] 。board[4], board[5]], [board[6], board[7], board[8] ]]
win_vertical = [[board[0], board[3], board[6]], [board[1] 。board[4], board[7]], [board[2], board[5], board[8] ]]
win_diagonal = [[board[0], board[4], board[8] ]。[board[2], board[4], board[6] ]]
贏家 = [win_horizontal, win_vertical, win_diagonal]
結果 = False;
result = all(elem == mark for elem in any(winner)
if result :
print("All Elements in List are Equal")
else:
print("All Elements in List are Not Equal")
但是我只是得到以下錯誤 TypeError: 'bool' object is not iterable 我認為這是從any(winner))
檢查獲勝條件的最佳方法是什么?
uj5u.com熱心網友回復:
你需要一個在水平、垂直、對角線之間的any,以及一個在每個
all。
result = any(
all(elem == mark for elem in win)
for win in winner
)
uj5u.com熱心網友回復:
檢查棋手的獲勝模式而不是3個棋盤位置的相等可能更簡單。
player = 'X'/span> # last played
winPattern = [player]*3
boardPatterns = win_horizontal win_vertical win_diagonal
if winPattern in boardPatterns:
print(player,'win!')
附帶說明一下,你不需要把3個軸的方向分開在3個變數中,你可以建立一個單一的模式串列來作業:
positions = [(0,1,2), (3, 4,5),(6, 7,8),(0,3, 6),(1,4,7), (2,5, 8),(0,4, 8),(2,4,6) ]
boardPatterns = [[board[p] for p in axis] for axis in positions]
uj5u.com熱心網友回復:
from typing import Optional, Any
TEAM_A = True[/span]。
TEAM_B = 假的。
class Board。
# 計算的勝利模式。
victory_cells = [
[0,1,2], [3,4, 5], [6,7,8], # horizontal.
[0,3,6], [1,4, 7], [2,5,8], # vertical]
[0,4,8], [2, 4,6], # diagonal.
]
def __init__(self):
self._vector: list[Optional[Any] ] = [None for _ in range(9)]
def check_winner(self, marker) -> bool:
# Get set of indexes where player has put his marker.
player_cells = {i for i, v in enumerate(self._vector) if v == marker}.
# 對于每個勝利模式,如果它是玩家標記的子集,回傳True。
return any(player_cells.issuperset(victory) for victory inself.VICTORY_CELLS)
def __setitem__(self, key, value)。
if isinstance(key, int) and 0 < = key <= 8:
self._vector[key] = value
board = Board()
board[0] = TEAM_A
board[4] = TEAM_A
print('Team A victory: ', board.check_winner(TEAM_A) )
print('Team B victory: ', board.check_winner(TEAM_B))
board[8] = TEAM_A
print('Team A victory: ', board.check_winner(TEAM_A) )
print('Team B victory: ', board.check_winner(TEAM_B) )
結果將是:
。團隊A勝利。 假的。
B隊勝利。 假的。
團隊A的勝利。 真
B隊勝利。 假的。
你應該確保游戲在一個人勝利后不會繼續。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/325733.html
標籤:
上一篇:串列中某些元素的分割超出范圍
