Python turtle绘制骰子时如何用其他方法将圆点准确绘制在正方形内
骰子圆点出界问题修复方案
核心问题原因
你对绘制的正方形坐标范围判断错误:
你从(x,y)起点朝右、向上绘制正方形,因此正方形的实际坐标范围为:
- X轴:
x ~ x + die_width - Y轴:
y ~ y + die_width
你使用y - 系数*die_width计算圆点Y坐标,所有点都会落在正方形下方,自然出界。同时原有代码还存在几个小错误:3点的最后一个圆点未调用绘制方法、4点的第四个圆点坐标重复、绘制正方形前未落下画笔导致正方形无法正常绘制。
修复后的坐标逻辑
以正方形左下角(x,y)为基准,圆点的标准位置计算规则:
- 横向三列位置:左列
x + 0.25*die_width、中列x + 0.5*die_width、右列x + 0.75*die_width - 纵向三行位置:底部行
y + 0.25*die_width、中行y + 0.5*die_width、顶部行y + 0.75*die_width
完整修复代码
import turtle # 定义主函数 def main(): # turtle设置/窗口设置 win_x=1000 win_y=1000 turtle.setup(win_x, win_y) win = turtle.Screen() win.bgcolor("black") # 变量定义 ax=turtle.Turtle() ax.speed(0) # 加快绘制速度 ax.hideturtle() die_width=100 dievalue=1 x=-500 y=200 dotsize=die_width // 6 ax.penup() # 绘制正方形的循环 for i in range(6): ax.goto(x,y) ax.pencolor("white") ax.fillcolor("white") ax.begin_fill() ax.pendown() # 落下画笔绘制正方形 for l in range (4): ax.forward(die_width) ax.left(90) ax.end_fill() ax.penup() # 抬笔移动绘制圆点 # 修复后的圆点绘制逻辑 if dievalue == 1: ax.goto(x + 0.5*die_width, y + 0.5*die_width) ax.dot(dotsize, "black") # 圆点设置为黑色更清晰 elif dievalue == 2: ax.goto(x + 0.25*die_width, y + 0.75*die_width) ax.dot(dotsize, "black") ax.goto(x + 0.75*die_width, y + 0.25*die_width) ax.dot(dotsize, "black") elif dievalue == 3: ax.goto(x + 0.25*die_width, y + 0.75*die_width) ax.dot(dotsize, "black") ax.goto(x + 0.5*die_width, y + 0.5*die_width) ax.dot(dotsize, "black") ax.goto(x + 0.75*die_width, y + 0.25*die_width) ax.dot(dotsize, "black") elif dievalue == 4: ax.goto(x + 0.25*die_width, y + 0.75*die_width) ax.dot(dotsize, "black") ax.goto(x + 0.75*die_width, y + 0.75*die_width) ax.dot(dotsize, "black") ax.goto(x + 0.25*die_width, y + 0.25*die_width) ax.dot(dotsize, "black") ax.goto(x + 0.75*die_width, y + 0.25*die_width) ax.dot(dotsize, "black") elif dievalue == 5: ax.goto(x + 0.25*die_width, y + 0.75*die_width) ax.dot(dotsize, "black") ax.goto(x + 0.75*die_width, y + 0.75*die_width) ax.dot(dotsize, "black") ax.goto(x + 0.5*die_width, y + 0.5*die_width) ax.dot(dotsize, "black") ax.goto(x + 0.25*die_width, y + 0.25*die_width) ax.dot(dotsize, "black") ax.goto(x + 0.75*die_width, y + 0.25*die_width) ax.dot(dotsize, "black") else: ax.goto(x + 0.25*die_width, y + 0.75*die_width) ax.dot(dotsize, "black") ax.goto(x + 0.75*die_width, y + 0.75*die_width) ax.dot(dotsize, "black") ax.goto(x + 0.25*die_width, y + 0.5*die_width) ax.dot(dotsize, "black") ax.goto(x + 0.75*die_width, y + 0.5*die_width) ax.dot(dotsize, "black") ax.goto(x + 0.25*die_width, y + 0.25*die_width) ax.dot(dotsize, "black") ax.goto(x + 0.75*die_width, y + 0.25*die_width) ax.dot(dotsize, "black") x = x + 1.5 * die_width dievalue += 1 if __name__ == "__main__": main() turtle.mainloop()
更易维护的实现方案
可以预定义每个点数对应的偏移量字典,避免重复的if判断逻辑:
# 预存每个点数对应的(横向偏移比例,纵向偏移比例) dot_offset = { 1: [(0.5, 0.5)], 2: [(0.25, 0.75), (0.75, 0.25)], 3: [(0.25, 0.75), (0.5, 0.5), (0.75, 0.25)], 4: [(0.25, 0.75), (0.75, 0.75), (0.25, 0.25), (0.75, 0.25)], 5: [(0.25, 0.75), (0.75, 0.75), (0.5, 0.5), (0.25, 0.25), (0.75, 0.25)], 6: [(0.25, 0.75), (0.75, 0.75), (0.25, 0.5), (0.75, 0.5), (0.25, 0.25), (0.75, 0.25)] } # 绘制圆点时代码可以简化为: for dx, dy in dot_offset[dievalue]: ax.goto(x + dx*die_width, y + dy*die_width) ax.dot(dotsize, "black")
内容的提问来源于stack exchange,提问作者user16959208
相关产品推荐
相关产品推荐

