【问题标题】:Drawing a chessboard with Turtle (even number dimension fail)用 Turtle 画棋盘(偶数维失败)
【发布时间】:2016-11-13 13:36:49
【问题描述】:

我用海龟图形编写了这个 Python 代码,用于按给定尺寸绘制棋盘。我面临的问题是当我输入一个奇数时一切正常:

  • 最后一个格子也填满了,只是没按时截屏

但是当我输入一个偶数时,它就像:

代码如下:

from turtle import *
import sys


def main():
    dimension = int(input('Enter dimension: '))
    side = 50

    x_coord = -250
    y_coord = 300

    turtle = Turtle()
    turtle.speed('fastest')
    turtle.pensize(5)

    for i in range(dimension ** 2):
        if not i % dimension:
            y_coord -= side
            turtle.penup()
            turtle.setx(x_coord)
            turtle.sety(y_coord)
            turtle.pendown()

        if not i % 2:
            turtle.begin_fill()

        for _ in range(4):
            turtle.forward(side)
            turtle.right(90)

        turtle.forward(side)
        turtle.end_fill()


if __name__ == '__main__':
    sys.exit(main())

【问题讨论】:

    标签: python python-3.x loops turtle-graphics chess


    【解决方案1】:

    具有替代方法的类似基于标志的解决方案。我不明白你的main() 布局给你带来了什么,所以我将它改造成一个潜在的库,测试代码在__main__ 下:

    import turtle
    
    def draw_board(dimension, x_coord, y_coord, side):
    
        parity = False
    
        for i in range(dimension ** 2):
            if i % dimension == 0:
                y_coord -= side
                turtle.penup()
                turtle.setpos(x_coord, y_coord)
                turtle.pendown()
                parity = parity != (dimension % 2 == 0)  # logical XOR
    
            if parity:
                turtle.begin_fill()
    
            for _ in range(4):
                turtle.forward(side)
                turtle.right(90)
    
            if turtle.filling():
                turtle.end_fill()
    
            turtle.forward(side)
    
            parity = not parity
    
    
    if __name__ == '__main__':
        size = int(input('Enter dimension: '))
    
        turtle.speed('fastest')
    
        turtle.pensize(5)
    
        draw_board(size, -250, 300, 50)
    
        turtle.hideturtle()
    
        turtle.exitonclick()
    

    【讨论】:

      【解决方案2】:

      我没有看你的代码,但似乎你遇到的问题是,与真正的棋盘不同,在制作新的正方形线时,你会从白色变为黑色,反之亦然,这个例子:

      黑色,白色,黑色,白色 黑色,白色,黑色,白色 等等

      或黑色、白色、黑色 白色,黑色,白色 等等

      而棋盘是:

      黑色,白色,黑色,白色 白色,黑色,白色,黑色 黑色....等

      你看出区别了吗?

      所以这似乎是问题所在,我也尝试修复您的代码,但我认为您可以解决这个问题

      【讨论】:

        【解决方案3】:

        我建议为何时填充设置一个标志,而不是仅在它是范围中的奇数时才这样做,因为它不会从左到右变成黑白,它到达然后结束然后去右到左。

        无论如何,这是我的编辑,只是一个简单的布尔值,每次都会切换,除非进入新行。我还建议使用turtle.exitonclick 而不是sys.exit

        from turtle import *
        
        def main():
            dimension = int(input('Enter dimension: '))
            side = 50
        
            x_coord = -250
            y_coord = 300
        
            turtle = Turtle()
            turtle.speed('fastest')
            turtle.pensize(5)
        
            fill = False
        
            for i in range(dimension ** 2):
                if not i % dimension:
                    y_coord -= side
                    turtle.penup()
                    turtle.setx(x_coord)
                    turtle.sety(y_coord)
                    turtle.pendown()
                    if not dimension % 2:
                        fill = not fill
        
                if fill:
                    turtle.begin_fill()
        
                for _ in range(4):
                    turtle.forward(side)
                    turtle.right(90)
        
                turtle.forward(side)
                turtle.end_fill()
                fill = not fill
        
        if __name__ == '__main__':
            main()
            exitonclick()
        

        【讨论】:

          【解决方案4】:

          对于 Python 3,7,我会推荐这种方式

          import turtle
          
          turtle.speed(0)
          turtle.up()
          turtle.goto(-200,200)
          turtle.down()
          
          for row in range(8):
          
              for col in range(8):
                  if col % 2 == row % 2:
                      turtle.forward(50)
                      continue
                  turtle.begin_fill()
          
                  for _ in range(4):
                      turtle.forward(50)
                      turtle.right(90)
                  turtle.end_fill()
                  turtle.forward(50)
              turtle.backward(400)
              turtle.right(90)
              turtle.forward(50)
              turtle.left(90)
          
          turtle.width(6)
          
          for _ in range(4):
              turtle.forward(400)
              turtle.left(90)
          
          turtle.hideturtle()
          turtle.done()
          

          【讨论】:

          • OP 的问题是绘制可变尺寸的通用检查模式,该模式适用于奇数尺寸(显示 9 x 9)但不适用于偶数。这仅适用于 one 尺寸 (8 x 8)。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-09-03
          • 2023-04-01
          • 2018-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多