用海龟画棋盘(偶数维失败)
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()
我已经用海龟图形编写了这个 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()