【问题标题】:Trying to draw a checkerboard using Turtle in Python - how do I fill in every other square?尝试在 Python 中使用 Turtle 绘制棋盘格 - 我如何填充其他正方形?
【发布时间】:2014-03-10 03:29:18
【问题描述】:

我正在尝试绘制棋盘。

我画了棋盘,但现在我必须定义一个函数(一个循环),用黑色填充所有其他方格。我一直在尝试编写一个循环来执行此操作,有人可以帮忙吗?

这是我的代码:

import turtle


def drawGrid():
turtle.penup()
turtle.goto(-300, 250)
turtle.pendown()
turtle.forward(300)
turtle.right(90)
turtle.forward(300)
turtle.right(90)
turtle.forward(300)
turtle.right(90)
turtle.forward(300)

def drawColumns():
for i in range(4):
    turtle.right(90)
    turtle.forward(37.5)
    turtle.right(90)
    turtle.forward(300)
    turtle.left(90)
    turtle.forward(37.5)
    turtle.left(90)
    turtle.forward(300)

def drawRows():
turtle.left(180)
rows = 0 
while rows <= 3:
    rows += 1
    turtle.forward(37.5)
    turtle.right(90)
    turtle.forward(300)
    turtle.left(90)
    turtle.forward(37.5)
    turtle.left(90)
    turtle.forward(300)
    turtle.right(90)

def main():
drawGrid()
drawColumns()
drawRows()
if __name__ == "__main__":
main()

【问题讨论】:

    标签: python loops turtle-graphics


    【解决方案1】:

    海龟填充方法适用于形状,即完全有界的区域。因此,您需要考虑绘制一系列正方形,而不是绘制网格。

    让我们从定义一个简单的函数来绘制一个填充的正方形开始。它需要一个海龟对象和一个边长。

    import turtle
    
    def draw_filled_square(this_turtle, size):    
        """Draw a square by drawing a line and turning through 90 degrees 4 times"""
        this_turtle.pendown()
        this_turtle.fill(True)
        for _ in range(4):
            this_turtle.forward(size)
            this_turtle.right(90)
        this_turtle.fill(False)
        this_turtle.penup()
    

    我们可以这样称呼它:

    window = turtle.Screen()
    myturtle = turtle.Turtle()
    square_size = 90
    myturtle.goto(-300, 200)
    
    draw__filled_square(myturtle, square_size)
    

    绘制一个正方形。请注意,它会将其放回起始位置,因此我们需要在绘制下一个正方形之前将其移动。

    现在,在实践中,只要我们画出盒子的轮廓,我们只需要画实心正方形,未填充的正方形可以表示为负空间。但为了解释的目的,我也会画出它们。

    为未填充的正方形定义函数很简单——只需复制现有函数,但在开头设置this_turtle.fill(False)

    任何时候需要在重复序列(1、2、3、4、1、2、3、4,...)中计数时,都需要使用模(余数)。模表示余数,所以如果xy0,则意味着x 可以被y 整除。这翻译成代码就像x % y == 0:

    这是一个简单的鼓机来演示:

    def drum_loop(x):
         # go bang on the fourth beat
         if x % 4 == 0:
             print("bang!")
         else:
             print("tish")
    
    # prints tish, tish, tish, bang! tish, tish, tish, bang!
    for i in range(1,9):
       drum_loop(i)
    

    交替就像重复数 0, 1, 0, 1。

    所以我们可以像这样画一行:

    for i in range(8): 
        if i % 2 == 0:
            draw_filled_square(myturtle, square_size)
        else:
            draw_unfilled_square(myturtle, square_size)
        # move to start of next square
        myturtle.forward(square_size)
    

    现在只是重复这一点并不能解决问题,但应该清楚的是,您可以再次使用模 2 来使行正确交替。

    通过定义一个行函数来执行此操作,该函数将在以黑色开始和以白色方块开始之间交替,然后从另一个循环中调用它。 (每次开始一行时不要忘记回到开头并向下移动)。

    【讨论】:

      【解决方案2】:

      这是另一个例子,绘图 比简单的冲压 为可怜的乌龟创造了更多的工作。与其考虑绘制和填充框,不如将板本身视为一个填充的正方形,在上面印上其他填充的正方形:

      from turtle import Turtle, Screen
      
      NUMBER_SQUARES = 8
      SQUARE_SIZE = 40
      BOARD_SIZE = SQUARE_SIZE * NUMBER_SQUARES
      BORDER_FRACTION = 1.025  # add a slight edge to board
      
      STAMP_SIZE = 20  # size of turtle square image
      
      turtle = Turtle(shape='square', visible=False)
      turtle.shapesize(BOARD_SIZE / STAMP_SIZE * BORDER_FRACTION)
      turtle.color('black')
      turtle.stamp()
      
      turtle.shapesize(SQUARE_SIZE / STAMP_SIZE)
      turtle.color('white')
      turtle.penup()
      
      for y in range(-NUMBER_SQUARES//2, NUMBER_SQUARES//2):
          parity = y % 2 == 0
      
          for x in range(-NUMBER_SQUARES//2, NUMBER_SQUARES//2):
              if parity:
                  turtle.goto(x * SQUARE_SIZE + SQUARE_SIZE//2, y * SQUARE_SIZE + SQUARE_SIZE//2)
                  turtle.stamp()
      
              parity = not parity
      
      Screen().exitonclick()
      

      此解决方案可以打印任意两种颜色(例如黑色和红色)的板,它不假定白色背景。这只是通过冲压改善生活的另一个例子。

      【讨论】:

        【解决方案3】:
        import turtle
        
        turtle.pensize(2)
        turtle.penup()
        turtle.goto(-160,-160)
        turtle.pendown()
        turtle.color("black")
        
        for i in range(4):
            turtle.forward(320)
            turtle.left(90)
        
        for y in range(-160,160,80):
            for x in range(-160,160,80):
                turtle.begin_fill()
                turtle.penup()
                turtle.goto(x,y)
                turtle.pendown()
        
                for k in range(4):
                    turtle.forward(40)
                    turtle.left(90)
        
                turtle.end_fill()       
        
        for y in range(-120,160,80):
            for x in range(-120,160,80):
                turtle.begin_fill()
                turtle.penup()
                turtle.goto(x,y)
                turtle.pendown()
                for k in range(4):
                    turtle.forward(40)
                    turtle.left(90)
                turtle.end_fill()   
        
        turtle.done()
        

        【讨论】:

          【解决方案4】:

          我们来看看之字形的做法(里面注释了代码的解释)

          import turtle
          
          def drawGrid(rows, cols, size):
              turtle.sety(turtle.ycor() + size * rows) # Draw the initial line
              f = size * 2
              turtle.begin_fill()
              for j in range(cols): # Make the columns
                  if j % 2:
                      turtle.backward(f) # Make room for the zig-zag up and zig-zag down
                  for i in range(rows * 2): # rows * 2 because there will be both zig-zag down and a zig-zag up for each row
                      turtle.forward(size)
                      turtle.right(90)
                      if i % 2:
                          turtle.left, turtle.right = turtle.right, turtle.left # Switch the zig-zag direction
                  turtle.left(180)
              turtle.end_fill()
              turtle.sety(turtle.ycor() - size * rows) # Draw the final line
              
          turtle.penup()
          turtle.goto(-300, -50) # Set the bottom-left position of the grid
          turtle.pendown()
          turtle.speed("fastest") # Because I have no patience
          drawGrid(8, 8, 40)
          

          输出:

          请注意,行数和列数必须是偶数才能正常工作。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-10-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-05
            相关资源
            最近更新 更多