简体   繁体   English

Python Zelle 图形和 While 循环

[英]Python Zelle Graphics & While loop

I'm trying to create non-overlapping rectangle flashcards and place them at random locations in Zelle Graphics.我正在尝试创建不重叠的矩形抽认卡并将它们放置在 Zelle Graphics 中的随机位置。 xMin and yMin is the coordinate of the upper left corner, and xMax and yMax is of the lower right corner of the rectangle. xMin 和 yMin 是矩形左上角的坐标,xMax 和 yMax 是矩形右下角的坐标。 I tried generating random (xCenter,yCenter) coordinate to make a new rectangle, and make a check if the new rectangle overlaps any existing rectangles.我尝试生成随机 (xCenter,yCenter) 坐标来创建一个新矩形,并检查新矩形是否与任何现有矩形重叠。 If it's overlapped then generate new random points until it's not overlapped anymore.如果重叠,则生成新的随机点,直到不再重叠为止。

I got the function for checking overlap, but I'm having trouble with the while loop afterwards.我得到了检查重叠的功能,但后来我在 while 循环中遇到了问题。 I'm a beginner at Python, so I'd very appreciate your help!我是 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)

main()主要的()

Most of your issues stem from your definition and use of the function checkLocation() : sometimes it returns a boolean, sometimes a tuple of lists;您的大多数问题源于您对函数checkLocation()定义和使用:有时它返回一个布尔值,有时返回一个列表元组; you don't seem to be aware that it updates the lists in question so they don't need to be returned and reassigned;您似乎没有意识到它更新了有问题的列表,因此不需要返回和重新分配它们; one time you seem to call it for no reason at all.有一次你似乎毫无理由地打电话给它。

I've reworked your code below to draw ten flash cards that don't overlap -- it's mostly the same code just put into a more logical order:我已经重新编写了下面的代码以绘制十张不重叠的闪存卡——它几乎是相同的代码,只是按更合乎逻辑的顺序排列:

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

在此处输入图片说明

Initially, your code didn't run at all due to this incorrect import :最初,由于此错误import ,您的代码根本没有运行:

from random import randrange *

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM