我在 python 中制作了一個國際象棋游戲,并試圖使用“if”陳述句生成每個棋子的合法移動,以查看玩家想要移動的空間是否空閑,以及移動實際上是否在棋盤的邊界內。問題是有太多的“if”陳述句以及嵌套的“if”陳述句。這確實使我的檔案看起來像意大利面條式代碼,并使程序過于復雜。
下面是一個例子:
def valid_moves(self, board):
i = self.row
j = self.col
moves = []
if i > 0:
# TOP LEFT
if j > 0:
p = board[i - 1][j - 1]
if p == 0: # checks if space empty
moves.append((j - 1, i - 1,))
elif p.color != self.color:
moves.append((j - 1, i - 1,))
# TOP MIDDLE
p = board[i - 1][j]
if p == 0: # checks if space empty
moves.append((j, i - 1))
elif p.color != self.color:
moves.append((j, i - 1))
# TOP RIGHT
if j < 7:
p = board[i - 1][j 1]
if p == 0: # checks if space empty
moves.append((j 1, i - 1,))
elif p.color != self.color:
moves.append((j 1, i - 1,))
if i < 7:
# BOTTOM LEFT
if j > 0:
p = board[i 1][j - 1]
if p == 0: # checks if space empty
moves.append((j - 1, i 1,))
elif p.color != self.color:
moves.append((j - 1, i 1,))
# BOTTOM MIDDLE
p = board[i 1][j]
if p == 0: # checks if space empty
moves.append((j, i 1))
elif p.color != self.color:
moves.append((j, i 1))
# BOTTOM RIGHT
if j < 7:
p = board[i 1][j 1]
if p == 0: # checks if space empty
moves.append((j 1, i 1))
elif p.color != self.color:
moves.append((j 1, i 1))
# MIDDLE LEFT
if j > 0:
p = board[i][j - 1]
if p == 0: # checks if space empty
moves.append((j - 1, i))
elif p.color != self.color:
moves.append((j - 1, i))
# MIDDLE RIGHT
if j < 7:
p = board[i][j 1]
if p == 0: # checks if space empty
moves.append((j 1, i))
elif p.color != self.color:
moves.append((j 1, i))
return moves
此示例僅適用于 6 個中的 1 個,因此出現了很多“if”陳述句。我怎樣才能將它折射到我不需要使用盡可能多的“if”陳述句的地方?
uj5u.com熱心網友回復:
本地函式有助于避免代碼重復:
def valid_moves(self, board):
i = self.row
j = self.col
moves = []
def move(a: int, b: int) -> None:
p = board[a][b]
if p == 0 or p.color != self.color:
moves.append((b, a))
if i > 0:
# TOP LEFT
if j > 0:
move(i - 1, j - 1)
# TOP MIDDLE
move(i - 1, j)
# TOP RIGHT
if j < 7:
move(i - 1, j 1)
if i < 7:
# BOTTOM LEFT
if j > 0:
move(i 1, j - 1)
# BOTTOM MIDDLE
move(i 1, j)
# BOTTOM RIGHT
if j < 7:
move(i 1, j 1)
# MIDDLE LEFT
if j > 0:
move(i, j - 1)
# MIDDLE RIGHT
if j < 7:
move(i, j 1)
return moves
uj5u.com熱心網友回復:
首先生成所有可能的移動,包括非法移動。然后過濾非法的。您還檢查是否i > 0或i < 7,我認為您的意思是i >= 0,i < 8如果您對 8x8 國際象棋棋盤使用基于零的索引。
def valid_moves(self, board):
i = self.row
j = self.col
destinations = [
(j dj, i di)
for di [-1, 0, 1] for dj in [-1, 0, 1]
# Disallow staying in place - not a move.
if not (di == 0 and dj == 0)
]
legal_moves = [
(mj, mi)
for mj, mi in destinations
# In bounds.
if 0 <= mi < 8 and 0 <= mj < 8
# And empty or enemy occupied.
and (board[mi][mj] == 0 or board[mi][mj].color != self.color)
]
return legal_moves
uj5u.com熱心網友回復:
您似乎只是在尋找一個空間移動,因此可以通過在每個方向的垂直和水平增量上回圈來簡化它:
def valid_moves(self, board):
moves = []
for v,h in [(-1,-1),(0,-1),(0,1),(-1,0),(1,0),(1,1)]: # directions
r,c = self.row v,self.col h # advance by 1
if r not in range(8): continue # vertical bounds
if c not in range(8): continue # horizontal bounds
p = board[r][c]
if p==0 or p.color != self.color: # playable position
moves.append((r,c))
return moves
這不會涵蓋多步移動和非線性移動。存在適用于所有型別的移動戰略在這里。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/369985.html
下一篇:關于回圈后遞減與if連接的問題
