python - python:简单的方形网格
问题描述
最近,我一直在尝试找出一个 20 x 20 的方格。到目前为止,我只知道如何绘制 4,无论我将什么作为我的 # of。如果有人能找出我在代码中的缺陷,将不胜感激!
我想要达到的目标
我的代码
import turtle
turtle.hideturtle()
t = turtle.Turtle()
t.hideturtle()
def draw_square(t, size, num, angle):
for i in range(num):
for x in range(4):
turtle.forward(size)
turtle.left(90)
turtle.right(angle)
draw_square(t, 25, 4, 90)
解决方案
您的代码有一对嵌套循环。但是,考虑到您绘制网格的方式,您确实需要三个嵌套循环。试图找出从你所在的地方到你想去的地方的最少代码量,我想出了以下内容:
from turtle import Screen, Turtle
def draw_square(turtle, size, num):
for y in range(num):
for x in range(num):
for _ in range(4):
turtle.forward(size)
turtle.left(90)
turtle.forward(size)
parity = y % 2 == 0
turn = turtle.left if parity else turtle.right
turn(90)
turtle.forward(size * 2 * parity)
turn(90)
screen = Screen()
yertle = Turtle(visible=False)
yertle.speed('fastest') # because I have no patience
draw_square(yertle, 25, 20)
screen.exitonclick()
此代码在绘图方面效率低下,因为要重新绘制相同的行,这是要避免的。对于这个问题,我个人最喜欢的解决方案是使用生成器的Tholian Web方法:
from turtle import Turtle, Screen
UNIT_SIZE, GRID_SQUARES = 25, 20
GRID_SIZE = GRID_SQUARES * UNIT_SIZE
def half_grid(turtle):
speed = turtle.speed()
for brick in range(GRID_SQUARES):
direction = [turtle.right, turtle.left][brick % 2 == 1]
for _ in range(0, GRID_SIZE, speed):
turtle.forward(speed)
yield(0)
direction(90)
for _ in range(0, UNIT_SIZE, speed):
turtle.forward(speed)
yield(0)
direction(90)
for _ in range(0, GRID_SIZE, speed):
turtle.forward(speed)
yield(0)
heckle = Turtle(shape='arrow')
heckle.speed(5) # speed needs to be a factor of UNIT_SIZE
heckle.penup()
heckle.goto(-GRID_SIZE / 2, -GRID_SIZE / 2)
heckle.pendown()
heckle.left(90)
jeckle = Turtle(shape='arrow')
jeckle.speed(5)
jeckle.penup()
jeckle.goto(GRID_SIZE / 2, -GRID_SIZE / 2)
jeckle.pendown()
jeckle.left(180)
generator1, generator2 = half_grid(heckle), half_grid(jeckle)
while (next(generator1, 1) + next(generator2, 1) < 2):
pass
heckle.hideturtle()
jeckle.hideturtle()
screen = Screen()
screen.exitonclick()
但这对于您的目的来说可能是矫枉过正...
推荐阅读
- python - python urwidtrees 删除 SimpleTree 节点会引发异常
- javascript - 无法在反应中修复轮播算法
- python - 开始和停止命令以打破循环
- azure-functions - java.lang.NoSuchMethodError: reactor.netty.http.client.HttpClient.request(Lshadow/netty/handler/codec/http/HttpMethod;)
- asp.net-core - 在 EF Core 3 中重命名 IdentityRole 表
- c++ - 将成员函数指针与参数包一起使用
- python - Discord.py 使用嵌入显示字典中的信息
- python - SciKit-Learn - 在 ColumnTransfer 中使用 OneHotEncoding 时出错
- visual-studio-code - VSCode 中是否有调试内存窗口?
- virtualization - DPDK中关于Virtio PMD的查询