randint()只生成高值,没有绘制足够的对象

2024-10-06 11:30:04 发布

您现在位置:Python中文网/ 问答频道 /正文

对于这个项目,我需要在随机点绘制400个不同的正方形,并且每个正方形之间至少有5个像素的距离。目前,方框大多绘制在窗口的底部,只有大约一半是在程序冻结前绘制的。我请教过我的教授,他们都难堪了。你知道吗

#Importing things I need
import random
from graphics import *

def enterValue(used_spots, y_spots, corner1, corner2):
    #enters the value where our square starts into the array, if it's a
    #valid value.
    used_spots.append(corner1)
    y_spots.append(corner2)

def checkPlace(used_spots,y_spots,corner1,corner2):
    #checks the placement of every square to see if our new one is valid.
    # the total size of a square is 20px edge + 5 px Border + 3 px width.
    # So we need to check based on that number.
    slot=0
    check=0
    for slot in range(0,len(used_spots)):
        #if the distance between the squares is more than 28 pixels, return
        # true. Else, stop checking and return false
        if abs(corner1-used_spots[slot])<28 and abs(corner2-y_spots[slot]<28):
            check=0
            break
        else:
            check=1
    return check

def randomCorners():
    #gets us a random variable for x and y of a box's corner
    corner1=random.randint(3,1800-28)
    corner2=random.randint(3,900-28)
    return corner1, corner2

def drawBox(corner1,corner2,EDGE,WIDTH,colors,win):
    #Draws the box
    point1=Point(corner1,corner2)
    point2=Point(corner1+EDGE,corner2+EDGE)
    square=Rectangle(point1,point2)
    square.setWidth(WIDTH)
    square.setFill(random.choice(colors))
    square.draw(win)

def main():
    #delcaring variables
    corner1=0
    corner2=0
    used_spots=[]
    y_spots=[]
    WIDTH=3
    EDGE=20
    colors=["red","orange","yellow","blue","pink","green"]
    win=GraphWin("MAINWINDOW",1800,900)
    win.setBackground("white")

    #Draws a random box at a random spot, then makes a spot for a new potential box
    #and tests it
    corner1,corner2=randomCorners()
    drawBox(corner1,corner2,EDGE,WIDTH,colors,win)
    enterValue(used_spots,y_spots,corner1,corner2)
    corner1,corner2=randomCorners()

    while len(used_spots) < 400:
        #If we can draw a box there, draw it and add coords to the lists,
        #then generates a new set of coordinates.
        if checkPlace(used_spots,y_spots,corner1,corner2)==1:
            drawBox(corner1,corner2,EDGE,WIDTH,colors,win)
            enterValue(used_spots,y_spots,corner1,corner2)

         #otherwise, make a new coordinate and try again.
        corner1,corner2=randomCorners()

main()

Tags: andtheboxifdefcheckrandomwidth
1条回答
网友
1楼 · 发布于 2024-10-06 11:30:04

问题出在checkPlace函数中:

if abs(corner1-used_spots[slot])<28 and abs(corner2-y_spots[slot]<28):

应该是

if abs(corner1-used_spots[slot])<28 and abs(corner2-y_spots[slot])<28:

(注意最后一个括号的位置)。你知道吗

您的代码将小于比较的结果传递给abs函数,而不是在比较中使用abs函数的结果。你知道吗

因此,每当corner2小于y_spots[slot] + 28时,条件的计算结果将为true(因为abs在比较之后才被调用),这意味着较低的值(屏幕顶部)将触发它,如果它们也满足其他条件,则会被拒绝。最终在used_spotsy_spots中会有足够的条目,至少有一个总是触发if中的两个条件,程序就会锁定,陷入一个无限循环中,试图找到有效的坐标。你知道吗

相关问题 更多 >