用海龟画棋盘(偶数维失败)

Drawing a chessboard with Turtle (even number dimension fail)

我已经用海龟图形编写了这个 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())

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

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

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

而棋盘是:

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

你看出区别了吗?

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

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

无论如何,这是我的编辑,只是一个简单的布尔值,它每次都会切换,除非转到新行。我还建议使用 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()

具有替代方法的类似的基于标志的解决方案。我不明白你的 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()

对于Python3,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()