Python random.randint异常行为:蛇形模拟程序边界守卫失效问题
蛇形滑动程序边界守卫Bug修复
负值问题的核心成因
你遇到的left_side出现负值,本质是两个代码层面的疏漏:
- 分支结构完全没有做互斥绑定,守卫逻辑直接失效
你写的循环判断存在语法层面的结构错误:第一个左边界判断是独立if,和后面的if(left_side == width)、对应的else分支完全没有逻辑绑定。也就是说,只要left_side ==0触发了左边界守卫、完成0或1的偏移修正后,程序根本不会停在这个分支,会继续向下执行到右边界判断——只要修正后的值不等于宽度值,就一定会走全局else分支,给已经经过守卫修正的位置再叠加一次-1~1的随机偏移,直接把合法值打穿边界变成负数。
举个一定会触发bug的运行流程:某轮循环初始
left_side = 0,命中左边界判断,随机取偏移0,此时left_side保持0不变。程序继续向下执行,检查当前值是否等于路径宽度:显然不等于,于是走else分支,随机取偏移-1,直接把left_side改成-1,之前的左边界守卫完全白做。 - 路径绘制函数存在作用域和重复拼接问题
自定义的path函数没有使用传入的path_width参数,反而直接引用全局变量width,加上内部的绘制判断没有做互斥,会导致边框、蛇身、空格被重复拼接,输出的路径图案错位。
具体修复方案
- 把所有边界判断改成互斥的
if-elif-else结构,保证同一轮循环只匹配一个移动规则,不会出现分支穿透:- 当
left_side到左边界(值为0):仅允许加0或+1的右向偏移,匹配完成后直接跳过后续所有移动判断 - 当
left_side到右边界(值为路径宽度):仅允许加-1或0的左向偏移,匹配完成后直接跳过后续移动判断 - 处于轨道中间位置时,再允许±1的随机自由移动
- 当
- 修正
path函数逻辑:统一使用传入的路径宽度参数,所有绘制判断做互斥处理,避免字符重复拼接。
可直接运行的修正代码
import random import time def path(path_width, snake_pos): path_str = "" for space in range(path_width + 1): # 绘制左边界 if space == 0: path_str += "|" # 绘制蛇身位置 elif space == snake_pos: path_str += "()" # 绘制右边界 elif space == path_width: path_str += "|" # 绘制轨道中间的空白区域 else: path_str += " " return path_str width = int(input("How wide is your course? ")) length = int(input("How long is your course? ")) # 初始位置保证在轨道内部,不直接贴边界 left_side = random.randint(1, width - 1) i = 1 while i < length: # 互斥分支完成边界守卫,避免逻辑穿透 if left_side == 0: # 左边界只能向右移动 left_side += random.randint(0, 1) elif left_side == width: # 右边界只能向左移动 left_side += random.randint(-1, 0) else: # 轨道中间位置自由随机移动 left_side += random.randint(-1, 1) print(path(width, left_side) + " : leftside = " + str(left_side)) i += 1 time.sleep(.05)
内容的提问来源于stack exchange,提问作者Brewcious
相关产品推荐
相关产品推荐

