Python Turtle:判断蚂蚁是否处于印章位置的问题排查
蚂蚁游戏的位置匹配问题分析与解决
问题根源:浮点坐标的精度误差
你遇到的问题核心是turtle返回的坐标是浮点数元组,加上浮点运算的微小误差,导致蚂蚁回到原位置时,坐标无法和字典里的键匹配。
具体来说:
- 你初始存入字典的坐标是
ant.pos()返回的元组,但turtle的移动计算可能因为浮点精度问题,让蚂蚁回到近似位置时的坐标变成类似(5.0000000001, 5.0)这样的结果,和字典里存储的原始坐标无法完全相等,所以pos_key in kleks_liste.keys()返回False。
注释ant.forward()后的行为解释
当你注释掉else分支里的ant.forward(20.00),蚂蚁在完成盖章操作后不会移动位置,下一次循环时pos_key还是当前的坐标,和刚刚存入字典的键完全一致,所以检查自然返回True。
修复方案
解决思路是统一坐标的存储格式,消除浮点误差,推荐把坐标转换成整数元组作为字典的键:
修改后的完整代码:
from turtle import Turtle, Screen screen = Screen() screen.setup(height=900, width=1000) screen.title("The Ant") ant = Turtle() ant.color("brown") ant.pencolor("black") ant.penup() kleks_liste = {} game_running = True ant.shape("square") ant.setpos(5, 5) # 初始坐标转整数元组存储 init_pos = tuple(map(int, ant.pos())) kleks_liste[init_pos] = ant.stamp() ant.shape("classic") ant.forward(20) while game_running: # 每次获取位置都转成整数元组 pos_key = tuple(map(int, ant.pos())) if pos_key in kleks_liste: ant.clearstamp(kleks_liste[pos_key]) kleks_liste.pop(pos_key) ant.left(90.00) ant.forward(20.00) else: ant.right(90.00) ant.shape("square") kleks_liste[pos_key] = ant.stamp() ant.shape("classic") ant.forward(20.00) screen.exitonclick()
这样不管turtle返回的坐标有多少位小数,都会被转换成整数,保证位置匹配的准确性。
内容的提问来源于stack exchange,提问作者Yfreet
相关产品推荐
相关产品推荐

