Шахматная доска черепахи питона - PullRequest
0 голосов
/ 14 октября 2019

Я должен нарисовать игру на шахматной доске с использованием Python. Но как только я ввожу ввод, который запрашивает начальную позицию, ширину и высоту, он рисует черные прямоугольники вне основного прямоугольника шахматной доски. Сетка из 8 х 8 прямоугольников должна быть правильно нарисована чередующимися черными / белыми прямоугольниками. Что я делаю неправильно? Мой первый модуль такой:

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

А это мой второй модуль 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()

Я не знаю, в чем проблема и почему она рисует прямоугольникивне основного прямоугольника шахматной доски.

1 Ответ

0 голосов
/ 14 октября 2019

В частности, я считаю, что ваша логика завершения цикла неверна;как правило, я считаю, что вы делаете вещи сложнее, чем необходимо. Вместо того, чтобы drawAllRectanges() дважды делал одно и то же в двух разных начальных точках, мы можем сделать это один раз, но дважды вызвать его с разными начальными точками (т. Е. Недавно крещенным drawRectangles() ниже). Моя переделка вашего кода:

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

Основная проблема, которая остается, заключается в использовании вами eval() - найдите другой путь! (А что это за функция variables()?)

...