Цикл Python Zelle Graphics & While - PullRequest
       9

Цикл Python Zelle Graphics & While

0 голосов
/ 01 ноября 2018

Я пытаюсь создать неперекрывающиеся прямоугольные карточки и размещать их в произвольных местах в Zelle Graphics. xMin и yMin - это координата левого верхнего угла, а xMax и yMax - правый нижний угол прямоугольника. Я попытался сгенерировать случайную (xCenter, yCenter) координату, чтобы создать новый прямоугольник и проверить, перекрывает ли новый прямоугольник какие-либо из существующих прямоугольников. Если он перекрывается, генерируйте новые случайные точки, пока он больше не будет перекрываться.

У меня есть функция для проверки перекрытия, но у меня возникли проблемы с циклом while. Я новичок в Python, поэтому я очень признателен за вашу помощь!

from graphics import *
from random import randrange *

def checkLocation(xMin,xMax,yMin,yMax,xMinList,xMaxList,yMinList,yMaxList):
    for x in range (xMin,xMax):
        for y in range (yMin,yMax):
            for i in range(len(xMinList)):
                if xMinList[i] < x < xMaxList[i] and yMinList[i] < y < yMaxList[i]:
                    return False 
    #if the new rectangle isn't overlapping, append its 4 corner into the list for future comparison:                
    xMinList.append(xMin)
    xMaxList.append(xMax)
    yMinList.append(yMin)
    yMaxList.append(yMax)

    return xMinList,xMaxList,yMinList,yMaxList



def main():
    win = GraphWin("Flash Card", 800,800)
    xCenter, yCenter = randrange (200,600), randrange (200,600) #display the words from the text in randomly generated locations                   
    xMin = xCenter - 50
    xMax = xCenter + 50

    yMin = yCenter - 50
    yMax = yCenter + 50

    xMinList = [300,500,200,100,600] #I hard coded these 4 lists for the purpose of testing
    xMaxList = [350,580,220,140,650]

    yMinList = [100,500,300,600,400]
    yMaxList = [160,540,325,680,450]

    #while checkLocation is False (location overlapping), check again until it's True (not overlapping)
    while not checkLocation(xMin,xMax,yMin,yMax,xMinList,xMaxList,yMinList,yMaxList):
        checkLocation(xMin,xMax,yMin,yMax,xMinList,xMaxList,yMinList,yMaxList)
    xMinList, xMaxList,yMinList,yMaxList =  checkLocation(xMin,xMax,yMin,yMax,xMinList,xMaxList,yMinList,yMaxList)


    rect = Rectangle (Point(xMin,yMin),Point(xMax,yMax))
    rect.draw(win)

Основной ()

1 Ответ

0 голосов
/ 03 ноября 2018

Большинство ваших проблем проистекает из вашего определения и использования функции checkLocation(): иногда она возвращает логическое значение, иногда кортеж списков; кажется, вы не знаете, что он обновляет списки, о которых идет речь, поэтому их не нужно возвращать и переназначать; однажды вы, кажется, называете это без всякой причины.

Я переработал ваш код ниже, чтобы нарисовать десять флеш-карт, которые не пересекаются - это в основном тот же код, который приведен в более логичном порядке:

from graphics import *
from random import randrange

def checkLocation(xMin, xMax, yMin, yMax, xMinList, xMaxList, yMinList, yMaxList):
    for x in range(xMin, xMax):
        for y in range(yMin, yMax):
            for i in range(len(xMinList)):
                if xMinList[i] < x < xMaxList[i] and yMinList[i] < y < yMaxList[i]:
                    return False

    # if the new rectangle isn't overlapping, append its 4 corner into the list for future comparison:
    xMinList.append(xMin)
    xMaxList.append(xMax)
    yMinList.append(yMin)
    yMaxList.append(yMax)

    return True

def main():
    win = GraphWin("Flash Card", 800, 800)

    xMinList = []
    xMaxList = []

    yMinList = []
    yMaxList = []

    for _ in range(10):

        xCenter, yCenter = randrange(200, 600), randrange(200, 600)
        xMin = xCenter - 50
        xMax = xCenter + 50

        yMin = yCenter - 50
        yMax = yCenter + 50

        # while checkLocation is False (location overlapping), check again until it's True (not overlapping)
        while not checkLocation(xMin, xMax, yMin, yMax, xMinList, xMaxList, yMinList, yMaxList):
            # display the words from the text in randomly generated locations
            xCenter, yCenter = randrange(200, 600), randrange(200, 600)
            xMin = xCenter - 50
            xMax = xCenter + 50

            yMin = yCenter - 50
            yMax = yCenter + 50

        rect = Rectangle(Point(xMin, yMin), Point(xMax, yMax))
        rect.draw(win)

    win.getMouse() # Pause to view result
    win.close()    # Close window when done

main()

enter image description here

Изначально ваш код вообще не запускался из-за этой ошибки import:

from random import randrange *
...