条件为假时if语句仍执行的Python代码问题排查
问题修复:玩家起始位置的敌人生成判断逻辑错误
核心问题
你代码中用于跳过玩家起始位置的条件逻辑完全错误:
- 预期逻辑:仅当(x,y)恰好是玩家起始坐标时,不执行敌人生成代码
- 现有条件
if x != startPlayerX and y != startPlayerY:的实际效果:只有当x不是起始X 且 y不是起始Y时,才执行敌人生成。这会导致所有x等于起始X或y等于起始Y的位置(除了玩家起始点本身)都被错误跳过,完全不符合需求。
修复方法
将判断条件替换为以下任意一种等价写法,确保仅跳过玩家起始位置:
- 直观写法:
if not (x == startPlayerX and y == startPlayerY): - 简洁写法:
if x != startPlayerX or y != startPlayerY:
修复后的完整代码
import random, os while True: os.system('clear') # 重命名map为game_map,避免覆盖Python内置函数 game_map = [ ['#', '-', '+', '-', '%'], ['+', '#', '|', '#', '+'], ['+', '-', '%', '-', '#'], ['|', '#', '+', '#', '+'], ['+', '%', '-', '+', '+'] ] startPlayerX = round(len(game_map[0])/2) startPlayerY = round(len(game_map)/2) monsterMap = [[0 for x in range(5)] for y in range(5)] for x in range(5): for y in range(5): # 修复后的条件:仅跳过玩家起始位置 if not (x == startPlayerX and y == startPlayerY): monsterChance = random.randint(1, 100) if game_map[x][y] == '#': if monsterChance <= 49: monsterMap[x][y] = '&' elif 49 < monsterChance <= 70: monsterMap[x][y] = '@' elif game_map[x][y] == '%': if monsterChance < 35: monsterMap[x][y] = '&' elif 35 < monsterChance <= 50: monsterMap[x][y] = '@' break for x in range(5): for y in range(5): print(monsterMap[x][y], ' ', end='') print()
额外优化建议
- 避免使用Python内置名称
map作为变量名,已改为game_map - 概率判断可以简化为连续比较(如
49 < monsterChance <=70),比monsterChance >49 and monsterChance <=70更简洁 - 可将怪物生成概率抽离为配置字典,提升代码可维护性:
spawn_config = { '#': {'&': 49, '@': 70}, '%': {'&': 34, '@': 50} }
内容的提问来源于stack exchange,提问作者Lucas Sintim
相关产品推荐
相关产品推荐

