Python战舰游戏:UsedTile列表检测while循环失效,新tiles未添加
问题分析与修复方案
你的代码存在几个关键问题:
- 循环初始条件失效:一开始
FrigateTiles是空列表,any(x in UsedTiles for x in FrigateTiles)会直接返回False,导致while循环根本不会执行,直接跳过生成逻辑。 - 未标记已占用格子:生成合法的护卫舰位置后,没有将
FrigateTiles中的坐标添加到UsedTiles,所以后续生成其他舰船时无法检测到这些已占用的格子。 - 方向未重新随机:
UpOrDown在循环外只生成一次,循环内不会重新随机方向,导致每次尝试生成时只能用同一个方向。 - 垂直方向坐标逻辑错误:垂直方向的
FrigateTiles坐标顺序搞反了,应该是[FrigatePositionX, FrigatePositionY]开头,而不是[FrigatePositionY, FrigatePositionX],这会导致位置不符合预期。
修复后的代码:
import random # 假设UsedTiles是已初始化的列表,比如:UsedTiles = [] # Frigate Generation FrigateTiles = [] # 循环直到生成不重叠的护卫舰位置 while True: # 每次循环重新随机方向 UpOrDown = random.randint(0, 1) if UpOrDown == 0: # 水平方向:X范围0-6(+3后刚好到9,不越界),Y范围0-9 FrigatePositionX = random.randint(0, 6) FrigatePositionY = random.randint(0, 9) # 生成水平排列的4个格子 FrigateTiles = [ [FrigatePositionX, FrigatePositionY], [FrigatePositionX + 1, FrigatePositionY], [FrigatePositionX + 2, FrigatePositionY], [FrigatePositionX + 3, FrigatePositionY] ] else: # 垂直方向:Y范围0-6,X范围0-9 FrigatePositionX = random.randint(0, 9) FrigatePositionY = random.randint(0, 6) # 生成垂直排列的4个格子 FrigateTiles = [ [FrigatePositionX, FrigatePositionY], [FrigatePositionX, FrigatePositionY + 1], [FrigatePositionX, FrigatePositionY + 2], [FrigatePositionX, FrigatePositionY + 3] ] # 检查当前生成的位置是否与已占用格子重叠 if not any(tile in UsedTiles for tile in FrigateTiles): # 没有重叠,退出循环 break # 将护卫舰的格子添加到已占用列表 UsedTiles.extend(FrigateTiles)
关键修改说明:
- 改用
while True无限循环,直到生成合法位置后手动break,避免初始空列表导致循环不执行的问题。 - 每次循环内重新生成
UpOrDown方向,确保每次尝试可以随机不同方向。 - 修正垂直方向的坐标生成逻辑,保持
[X,Y]的统一格式,避免位置混乱。 - 生成位置后检查是否与
UsedTiles重叠,不重叠就退出循环,并通过extend把护卫舰的每个格子单独添加到已占用列表中。 - 确保
UsedTiles是已初始化的空列表,否则会出现未定义错误。
内容的提问来源于stack exchange,提问作者Eckvice
相关产品推荐
相关产品推荐

