You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:45:03