Récemment, j'ai essayé de trouver une grille carrée de 20 sur 20. Jusqu'à présent, j'ai seulement compris comment dessiner 4, peu importe ce que j'ai mis comme mon # de. il serait grandement apprécié que quelqu'un puisse découvrir mes défauts dans le code!
ce que j'essaie de réaliser
mon code
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)
5 Réponses :
Votre principal problème est que vous tournez la tortue de 90 degrés vers la gauche après chaque carré. Cela signifie que vous allez simplement créer les 4 mêmes carrés encore et encore.
Au lieu de cela, vous devez avancer les unités de taille de la tortue et dessiner le carré suivant. Faites cela 20 fois; alors vous pouvez passer à la ligne suivante.
Pour cela, je vous suggère d'écrire une boucle pour dessiner une ligne. Ensuite, écrivez quelques lignes pour revenir au point de départ, mais en diminuant les unités de taille . Bouclez 20 fois ce processus.
Il y a plusieurs façons de dessiner une grille 20 x 20 avec Python, en voici quelques-unes:
En utilisant la tortue:
from PIL import Image, ImageDraw
def main():
steps = 25
height = 600
width = 600
img = Image.new(mode='L', size=(height, width), color=255) # create blank image
# img = Image.open('filename.png') # or load an image
draw = ImageDraw.Draw(img)
y_start = 0
y_end = img.height
step_size = int(img.width / steps)
for x in range(0, img.width, step_size):
line = ((x, y_start), (x, y_end))
draw.line(line, fill='black')
x_start = 0
x_end = img.width
for y in range(0, img.height, step_size):
line = ((x_start, y), (x_end, y))
draw.line(line, fill='black')
del draw
img.show()
if __name__ == '__main__':
main()
En utilisant l'oreiller (PIL):
import turtle
def draw_box(t,x,y,size,fill_color):
t.penup() # don't draw
t.goto(x,y) # move to position
t.pendown() # draw
t.fillcolor(fill_color)
t.begin_fill() # set fill color
for i in range(0,4):
grid.forward(size) # move forward
grid.right(90) # turn right 90 degrees
t.end_fill()
def draw_grid():
fill_color = 'white'
start_x = -320 # starting x position of the grid
start_y = -100 # starting y position of the grid
box_size = 30 # pixel size of each square in the grid
for i in range(0,20): # 20x20 grid
for j in range(0,20):
draw_box(grid,start_x+j*box_size,start_y+i*box_size,box_size,fill_color)
grid = turtle.Turtle()
draw_grid()
turtle.done()
Voici une approche intéressante que j'ai faite qui dessine des lignes puis des colonnes:
import turtle as tur
def make_grid(rows, columns):
tur.color('black', 'white')
tur.begin_fill()
dir = 1
tur.forward(20 * columns)
for _ in range(rows):
if dir > 0:
tur.right(90)
tur.forward(20)
tur.right(90)
tur.forward(20 * columns)
else:
tur.left(90)
tur.forward(20)
tur.left(90)
tur.forward(20 * columns)
dir *= -1
tur.penup()
tur.home()
tur.pendown()
tur.right(90)
dir = 1
tur.forward(20 * rows)
for _ in range(columns):
if dir > 0:
tur.left(90)
tur.forward(20)
tur.left(90)
tur.forward(20 * rows)
else:
tur.right(90)
tur.forward(20)
tur.right(90)
tur.forward(20 * rows)
dir *= -1
tur.end_fill()
tur.done()
make_grid(10, 10)
Je pense que c'est plus amusant de regarder comme ça, plutôt que de faire un tas de carrés d'affilée. Évidemment, il pourrait être amélioré avec une taille carrée ajustable ...
Votre code a une paire de boucles imbriquées. Cependant, étant donné la façon dont vous dessinez la grille, vous avez vraiment besoin de trois boucles imbriquées. En essayant de trouver le moins de code à obtenir de l'endroit où vous êtes à l'endroit où vous voulez être, j'ai trouvé ce qui suit:
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()
Ce code est inefficace en termes de dessin, comme les lignes sont redessinées, ce qui est quelque chose à éviter. Ma solution préférée à ce problème est mon approche Tholian Web utilisant des générateurs:
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()
Mais c'est probablement exagéré pour vos besoins ...
Cette réponse doit être acceptée: si vous pensez que cette réponse vous a aidé, vous pouvez envisager quoi faire lorsque quelqu'un répond à ma question et comment accepter ma réponse
Ceci est un code pour dessiner une grille simple en python de largeur, hauteur et nombre d'unités variables dans une grille.
#code to draw a grid
import turtle
import random
T= turtle.Turtle()
T.hideturtle()
turtle.tracer(0,0)
def draw_grid(num,width,height):
n=num # number of units in one column/row of a grid
i=1
for k in range (num):
for j in range(num):
for _ in range(2):
turtle.forward(width*n) #width of a unit of a grid
turtle.left(90)
turtle.forward(height*i) #height of a unit of a grid
turtle.left(90)
i=i+1
i=1
n=n-1
draw_grid(5,15,30)
turtle.update()
turtle.done()
Cela ne fonctionne pas comme présenté en raison d'une IndentationError , en particulier `unindent ne correspond à aucun niveau d'indentation externe` à la ligne 24, mais il peut y en avoir d'autres une fois que celui-ci est corrigé.
C'est un bon début! Il est clair pour moi pourquoi la tortue ne peut faire que 4 carrés. Quel chemin prend la tortue? Pouvez-vous le tracer à la main sur un morceau de papier en suivant les étapes que le code va suivre?