【问题标题】:If statement within an if statement in python for chess game国际象棋python中if语句中的if语句
【发布时间】:2017-09-02 22:13:20
【问题描述】:

我正在尝试构建一些 python 脚本,如果有人从 x 位置开始,它可以概述国际象棋游戏中可用的动作。我目前的代码如下:

import argparse, json

chessBoard = [[1, 1, 1, 1, 1, 1, 1, 1] for i in range(8)]

chess_map_from_alpha_to_index = {
    "b" : 0,
    "c" : 1,
    "d" : 2,
    "e" : 3,
    "f" : 4,
    "g" : 5,
    "h" : 6,
    "i" : 7
}

chess_map_from_index_to_alpha = {
    0: "b",
    1: "c",
    2: "d",
    3: "e",
    4: "f",
    5: "g",
    6: "h",
    7: "i"
}


def getRookMoves(pos, chessBoard):
    column, row = list(pos.strip().lower())
    row = int(row) - 1
    column = chess_map_from_alpha_to_index[column]
    i,j = row, column
    solutionMoves = []

    # Compute the moves in Rank
    for j in xrange(8):
        if j != column:
            solutionMoves.append((row, j))

    # Compute the moves in File
    for i in xrange(8):
        if i != row:
           solutionMoves.append((i, column))

    solutionMoves = ["".join([chess_map_from_index_to_alpha[i[1]], str(i[0] + 1)]) for i in solutionMoves]
    solutionMoves.sort()
    return solutionMoves

def getKnightMoves(pos, chessBoard):
    """ A function that returns the all possible moves
        of a knight stood on a given position
    """
    column, row = list(pos.strip().lower())
    row = int(row) - 1
    column = chess_map_from_alpha_to_index[column]
    i,j = row, column
    solutionMoves = []

    try:
        temp = chessBoard[i - 6][j + 1]
        solutionMoves.append([i - 6, j + 1])
    except:
        pass
    try:
        temp = chessBoard[i - 3][j + 2]
        solutionMoves.append([i - 3, j + 2])
    except:
        pass
    try:
        temp = chessBoard[i - 5][j + 3]
        solutionMoves.append([i - 5, j + 3])
    except:
        pass
    try:
        temp = chessBoard[i - 7][j + 4]
        solutionMoves.append([i - 7, j + 4])
    except:
        pass
    try:
        temp = chessBoard[i - 1][j + 5]
        solutionMoves.append([i - 1, j + 5])
    except:
        pass
    try:
        temp = chessBoard[i - 4][j + 6]
        solutionMoves.append([i - 4, j + 6])
    except:
        pass
    try:
        temp = chessBoard[i - 2][j + 7]
        solutionMoves.append([i - 2, j + 7])
    except:
        pass
    # Filter all negative values
    temp = [i for i in solutionMoves if i[0] >=0 and i[1] >=0]
    allPossibleMoves = ["".join([chess_map_from_index_to_alpha[i[1]], str(i[0] + 1)]) for i in temp]
    allPossibleMoves.sort()
    return allPossibleMoves

parser = argparse.ArgumentParser()
parser.add_argument("-p", "--piece", help="chess piece name: ex- rook, knight, pawn etc")
parser.add_argument("-l", "--location", help="chess notation string: ex- E4, D6 etc")
args = parser.parse_args()

piece = args.piece.strip().lower()
location = args.location.strip()
# According to the type of piece adjust function
if (piece == "rook"):
    print (json.dumps({"piece":piece,
                      "current_location": location,
                      "moves": getRookMoves(location, chessBoard)}))
elif (piece == "knight"):
    print (json.dumps({"piece":piece,
                      "current_location": location,
                      "moves": getKnightMoves(location, chessBoard)}))

但理想情况下,我想将 if elif json.dumps 保留在最后,但修改 try: temp = chessBoard[i - 5][j + 3] solutionMoves.append([i - 5, j + 3]) except: pass

部分,因此这也成为一个 if 语句。因此,如果一个人输入 python main.py -p "knight" -l "b8" 然后代码读取`temp = chessBoard[i - 5][j + 3] solutionMoves.append([i - 5, j + 3]) 除了: 通过``

将b8作为一个位置,并基于它输出一个答案。

希望这是有道理的。感谢您在此处提供的任何帮助。

【问题讨论】:

  • 根据您在下面的评论,我认为您应该编辑您的问题以反映您的真正要求。我的回答简化了getKnightMoves 函数,但听起来您希望找到一种方法来简化整个事情。对吗?
  • 我更新了答案的第二部分以使用正确的相对移动列表

标签: python python-3.x


【解决方案1】:

您只是在确认此举不会让您离开董事会吗?你可以这样做:

rf = i - 6
cf = j + 1
if 0 <= rf < 8 and 0 <= cf < 8:
     solutionMoves.append((rf, cf))

虽然我可能遗漏了一些东西,但您可能想看看这个: How do I generate all of a knight's moves?

【讨论】:

  • 感谢您的快速回复。我不确定我最初是否清楚,所以我想我会进一步解释。理想情况下,我想要一个场景,我可以说好的一块(为了方便起见,假设骑士在这里)在 B8 中然后做 x 移动,如果在 B7 中做 y 移动(完全独立的移动)。我的想法是它可以作为一个 if 语句来完成,所以如果 location = b8 返回 x 移动,elif location = b2 返回 y 移动,等等。但是每个返回都独立于最后一个,所以 b8 会有一个可能的移动列表会与 b2 等不同
【解决方案2】:

您依赖list index out of range 异常来触发您的尝试代码。如果您退后一步思考为什么会抛出该异常,您可以将其重新加工成所需的 if 语句。发生该异常是因为其中一个索引大于棋盘中的列表。您的棋盘在任一方向都是 8 个项目,因此您可以同时检查 0 和 8:

if 0 <= i-3 < 8 and 0 <= j+2 < 8:
    solutionMoves.append([i - 3, j + 2])

之前必须有额外的负过滤器的原因是负值是列表的有效索引值。不过,您可以立即摆脱它们。

您可能需要考虑创建一个您正在检查的所有案例的列表(例如 (-6,1)、(-3,2) 等)并将其嵌入到 for 循环中的 if 检查以减少代码重复。像这样的:

# possible_moves are moves relative to current location
possible_moves = [(2, -1), (2, 1), (-1, 2), (1, 2), (-2, -1), (-2, 1), (-1, -2), (1, -2)]
for move in possible_moves:
    new_loc = (i + move[0], j + move[1])
    if 0 <= new_loc[0] < 8 and 0 <= new_loc[1] < 8:
        solutionMoves.append(new_loc)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    相关资源
    最近更新 更多