Python if...else语句判断棋盘空位的逻辑表达式异常问题
问题原因
你的代码出现逻辑错误是因为误用了or逻辑运算符,违背了逻辑判断的基本规则:
你要实现的校验逻辑是当位置既不是空格也不是下划线时,判定为非法移动,但你写的(board[x][y] != ' ') or (board[x][y] != '_')条件永远为真:
- 如果当前位置是空格:满足
!= '_'的条件,整个or表达式返回真 - 如果当前位置是下划线:满足
!= ' '的条件,整个or表达式返回真 - 如果当前位置是其他字符:两个条件都满足,or表达式也返回真
只有当一个字符同时是空格和下划线时这个表达式才会返回假,不可能存在这种情况,所以所有移动都会被判定为非法。
修正方案
方案1:将or替换为and
while not valid_move: # check for unoccupied position if (board[x][y] != ' ') and (board[x][y] != '_'): valid_move = False print('Invalid move detected.') print(board[x][y]) get_user_input() getCoordinates(position) else: print('Valid move...') valid_move = True # update board with player position board[x][y] = player
方案2:先判断合法条件再取反(可读性更高,符合直觉)
while not valid_move: # check for unoccupied position if not (board[x][y] == ' ' or board[x][y] == '_'): valid_move = False print('Invalid move detected.') print(board[x][y]) get_user_input() getCoordinates(position) else: print('Valid move...') valid_move = True # update board with player position board[x][y] = player
方案3:用in运算符简化判断(最简洁不易出错)
while not valid_move: # check for unoccupied position if board[x][y] not in (' ', '_'): valid_move = False print('Invalid move detected.') print(board[x][y]) get_user_input() getCoordinates(position) else: print('Valid move...') valid_move = True # update board with player position board[x][y] = player
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

