2
votes

python: grille carrée simple

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

 ce que j'essaie de réaliser p>

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)


1 commentaires

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?


5 Réponses :


0
votes

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.


0 commentaires

0
votes

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()


0 commentaires

0
votes

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 ...


0 commentaires

2
votes

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()

 entrez la description de l'image ici

Mais c'est probablement exagéré pour vos besoins ...


1 commentaires

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



0
votes

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()


1 commentaires

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é.