Tablero de ajedrez de tortuga pitón

0

Se supone que debo dibujar un juego de tablero de ajedrez usando Python. Pero una vez que ingreso la entrada que solicita la posición inicial, el ancho y la altura, dibuja los rectángulos negros fuera del rectángulo principal del tablero de ajedrez. Una cuadrícula de rectángulos de 8 x 8 debe dibujarse correctamente con rectángulos alternos negros / blancos. ¿Qué estoy haciendo mal? Mi primer módulo es este:

from chessboard import *

def main():
    startX, startY = eval(input("Enter at start position (x, y): "))
    width = input("Enter the width: ")
    height = input("Enter the height: ")
    spaceX = eval(width) / 8
    spaceY = eval(height) / 8

    def variables():
        global startX, startY, width, height, spaceX, spaceY, xLocation, yLocation

    if width == "" and height == "":
        drawChessboard(startX, startY)
    elif height == "":
        drawChessboard(startX, startY, width=eval(width))
    elif width == "":
        drawChessboard(startX, startY, height=eval(height))
    else:
        drawChessboard(startX, startY, eval(width), eval(height))
main()

Y este es mi segundo módulo chessboard.py

import turtle

def drawRectangle(xLocation, yLocation, spaceX, spaceY):

    turtle.penup()
    turtle.goto(xLocation, yLocation)
    turtle.pendown()

    turtle.begin_fill()

    for _ in range(2):
        turtle.forward(spaceX)
        turtle.left(90)
        turtle.forward(spaceY)
        turtle.left(90)

    turtle.end_fill()

def drawAllRectangles(startX, startY, width, height):

    spaceX = width / 8
    spaceY = height / 8

    yLocation = startY

    while yLocation <= (height - 2 * spaceY): 
        xLocation = startX
        while xLocation <= (width - 2 * spaceX):
            drawRectangle(xLocation, yLocation, spaceX, spaceY)
            xLocation += 2 * spaceX
        yLocation += 2 * spaceY

    turtle.penup()
    turtle.goto(startX + spaceX, startY + spaceY)
    turtle.pendown()

    yLocation = startY + spaceY

    while yLocation <= (height - spaceY): 
        xLocation = startX + spaceX
        while xLocation <= (width - spaceX):
            drawRectangle(xLocation, yLocation, spaceX, spaceY)
            xLocation += 2 * spaceX
        yLocation += 2 * spaceY

def drawChessboard(startX, startY, width=250, height=250):


    turtle.penup()
    turtle.goto(startX, startY)
    turtle.pendown()

    for _ in range(2):
        turtle.forward(width)
        turtle.left(90)
        turtle.forward(height)
        turtle.left(90)

    drawAllRectangles(startX, startY, width, height)

def main():

    startX, startY = eval(input("Enter at start position (x, y): "))
    width = input("Enter the width: ")
    height = input("Enter the height: ")

    turtle.speed('fastest')

    if width == "" and height == "":
        drawChessboard(startX, startY)
    elif height == "":
        drawChessboard(startX, startY, width=int(width))
    elif width == "":
        drawChessboard(startX, startY, height=int(height))
    else:
        drawChessboard(startX, startY, int(width), int(height))

    turtle.done()

main()

No sé cuál es el problema y por qué está dibujando los rectángulos fuera del rectángulo principal del tablero de ajedrez.

0

Específicamente, creo que su lógica de terminación de bucle es incorrecta; en general, creo que estás haciendo las cosas más difíciles de lo necesario. En lugar de drawAllRectanges()hacer lo mismo dos veces en dos puntos de partida diferentes, podemos hacer que lo haga una vez pero llamarlo dos veces con diferentes puntos de partida (es decir, el recién bautizado a drawRectangles()continuación). Mi reelaboración de su código:

import turtle

def drawRectangle(xLocation, yLocation, spaceX, spaceY):

    turtle.goto(xLocation, yLocation)

    turtle.begin_fill()

    for _ in range(2):
        turtle.forward(spaceX)
        turtle.left(90)
        turtle.forward(spaceY)
        turtle.left(90)

    turtle.end_fill()

def drawRectangles(startX, startY, width, height):

    endX, endY = startX + width - 1, startY + height - 1

    spaceX, spaceY = width / 8, height / 8

    yLocation = startY

    while yLocation < endY:
        xLocation = startX

        while xLocation < endX:
            drawRectangle(xLocation, yLocation, spaceX, spaceY)
            xLocation += 2 * spaceX

        yLocation += 2 * spaceY

def drawChessboard(startX, startY, width=250, height=250):

    turtle.penup()
    turtle.goto(startX, startY)
    turtle.pendown()

    for _ in range(2):
        turtle.forward(width)
        turtle.left(90)
        turtle.forward(height)
        turtle.left(90)

    turtle.penup()

    drawRectangles(startX, startY, width, height)

    drawRectangles(startX + width / 8, startY + height / 8, width, height)

def main():
    startX, startY = eval(input("Enter at start position (x, y): "))
    width = input("Enter the width: ")
    height = input("Enter the height: ")

    turtle.speed('fastest')

    if width == "" and height == "":
        drawChessboard(startX, startY)
    elif height == "":
        drawChessboard(startX, startY, width=float(width))
    elif width == "":
        drawChessboard(startX, startY, height=float(height))
    else:
        drawChessboard(startX, startY, float(width), float(height))

    turtle.hideturtle()
    turtle.mainloop()

main()

El problema principal que queda es el uso de eval(): ¡encuentre otra manera! (¿Y de qué se trata esa variables()función?)