如何实现Tracy的DVD屏保式边缘反弹?代码问题求助
问题分析与解决方案
你的代码核心问题在于移动循环的条件逻辑错误:原代码用or连接坐标判断,导致只要任意一个坐标还在屏幕范围内,Tracy就会继续移动,直到完全超出屏幕才停止。
修正步骤
- 修正循环条件:将
or替换为and,只有当Tracy的x坐标在[-200, 200]范围内且y坐标在[-200, 200]范围内时,才继续移动。 - 补充细节优化:移出屏幕后抬笔,避免下次调整角度时留下多余线条。
修正后的基础版代码
def background(): speed(1) pensize(5) line_count = 0 while line_count < 101: color(random.choice(color_list)) left(random.choice(angle_list)) pendown() # 修正条件:同时满足x和y在屏幕内才继续移动 while (-200 <= xcor() <= 200) and (-200 <= ycor() <= 200): forward(1) penup() # 移出屏幕后抬笔,避免后续移动留痕 line_count += 1
进阶优化(精准停在屏幕边缘)
如果希望Tracy刚好碰到边缘就停止,而非移出一点,可以提前计算下一步坐标,预判是否超出范围:
import math def background(): speed(1) pensize(5) line_count = 0 while line_count < 101: color(random.choice(color_list)) angle = random.choice(angle_list) left(angle) pendown() while True: # 计算下一步的x、y坐标(基于当前朝向) next_x = xcor() + math.cos(math.radians(heading())) * 1 next_y = ycor() + math.sin(math.radians(heading())) * 1 # 若下一步超出屏幕则停止循环 if not (-200 <= next_x <= 200 and -200 <= next_y <= 200): break forward(1) penup() line_count += 1
内容的提问来源于stack exchange,提问作者Samuel Maurer
相关产品推荐
相关产品推荐

