【问题标题】:Python Turtle CheckerboardPython 海龟棋盘
【发布时间】:2018-04-26 22:48:07
【问题描述】:
import turtle

def main():
     t=turtle
     s=int(input("Enter the length of each square: "))
     t.screensize(2000,2000,"lightblue")
     for row in range(0,5):
         for column in range(0,5):
             if (row+column)%2==0:
                 t.pendown()
                 t.fillcolor("black")
                 t.begin_fill()
                 square(s,row,column)
             else:
                 t.pendown()
                 t.fillcolor("white")
                 t.begin_fill()
                 square(s,row,column)
             t.goto(s+row*s,s+column*s)
def square(s,row,column):
     t=turtle
     t.penup()
     n=0
     for count in range(4):
          t.pendown()
          t.forward(s)
          t.left(90)
     t.end_fill()
     t.penup()
main()

所以今天我得到了一个任务,要求我创建一个 5 x 5 的棋盘。到目前为止,我有这段代码可以创建大部分棋盘格。但是,我在某个地方仍然有错误,或者我遗漏了一些关键信息。

附图显示了程序出现错误时的样子。

程序从创建黑色方块开始,可以在左下角看到。然后一直到右上角,可以看到空白处。

请帮忙。

【问题讨论】:

  • 欢迎来到 StackOverflow!请通过edit提出您的问题来描述预期和观察到的行为。没有它,就很难为您提供帮助。
  • 第一行和第二行的缩进是不同的,还是只是在这里发布问题时出现的格式问题?
  • @das-g 这是发布代码时的一个简单错误。如果让您感到困惑,我很抱歉
  • 没问题,只是想澄清一下,以确保这不是您遇到的问题。

标签: python turtle-graphics


【解决方案1】:

让我们尝试冲压而不是绘图。这让我们加快了速度,同时简化了我们的逻辑。我们在一个大的黑色方块上盖印代表棋盘,然后在上面盖印白色方块:

from turtle import Turtle, Screen

SQUARES_PER_SIDE = 5
CURSOR_SIZE = 20

def main():
    length = int(input("Enter the length of each square: "))

    screen = Screen()
    screen.bgcolor("lightblue")

    turtle = Turtle('square', visible=False)
    turtle.shapesize(SQUARES_PER_SIDE * length / CURSOR_SIZE)
    turtle.speed('fastest')
    turtle.stamp()  # black background

    turtle.shapesize(length / CURSOR_SIZE)
    turtle.fillcolor("white")
    turtle.penup()

    edge = (1 - SQUARES_PER_SIDE) / 2 * length  # center of left or bottom square
    turtle.goto(edge, edge)

    for row in range(SQUARES_PER_SIDE):
        for column in range(SQUARES_PER_SIDE):
            if (row + column) % 2 == 0:
                turtle.stamp()  # white square

            turtle.forward(length)

        turtle.goto(edge, edge + (row + 1) * length)

    screen.exitonclick()

main()

输出

【讨论】:

  • 善用邮票@cdlane
【解决方案2】:

t.goto(s+row*s,s+column*s) 移动到内部 for 循环的开头就可以了。

基本上我们需要先将海龟移动到起始位置,然后再开始绘制。

我还清理了代码以将多余的行放入 square 函数中。 另外,添加了t.penup(),这样乌龟在到达起始位置并开始绘制之前不会显示绘制。

import turtle

def main():
     t=turtle
     t.penup()
     s=int(input("Enter the length of each square: "))
     t.screensize(2000,2000,"lightblue")
     for row in range(0,5):
         for column in range(0,5):              
              t.goto(s+row*s,s+column*s)
              if (row+column)%2==0:
                   square(s,row,column,"black")
              else:
                  square(s,row,column,"white")

def square(s,row,column,color):
     t=turtle
     t.pendown()
     t.fillcolor(color)
     t.begin_fill()
     t.penup()
     n=0
     for count in range(4):
          t.pendown()
          t.forward(s)
          t.left(90)
     t.end_fill()
     t.penup()
main()

【讨论】:

    【解决方案3】:

    Anil_M 领先我几分钟;但我想提供一些额外的代码清理,因为你有太多不必要的penups、pendowns 和不必要的参数传递。

    试试这个:

    import turtle
    
    t = turtle.Turtle()
    t.speed(0)
    
    def main():
         s=int(input("Enter the length of each square: "))
         for row in range(5):
             for column in range(5):
                 if (row+column)%2==0:
                     color = "black"
                 else:
                     color = "white"
                 t.penup()
                 t.goto(row*s,column*s)
                 t.pendown()
                 filled_square(s, color)
    
    def filled_square(s, color):
         t.fillcolor(color)
         t.begin_fill()
         for count in range(4):
              t.forward(s)
              t.left(90)
         t.end_fill()
    
    main()
    

    【讨论】:

    • 另外,请注意对方便的speed 方法的调用,该方法用于将绘图加速到最大值。 (您可以重新调用screensize;我在repl.it 上测试我的代码,它不支持该命令。)
    • 在您的代码清理中,您认为t = turtle 做了什么?它不是将海龟分配给t,而是为海龟包创建别名。因此,考虑到这个目标,执行import turtle as t 可以节省一行代码并使您正在做的事情更加明确。
    • @cdlane 很好。我的意思是通过t = turtle.Turtle()初始化一个特定的实例。
    猜你喜欢
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多