Corsi Block Tapping Task

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
FlyingPersian
User
Beiträge: 11
Registriert: Freitag 20. Januar 2017, 10:17

Okay ich werde mich heute mal dransetzen und versuchen, die Funktionen noch weiter zu vereinfachen. Werde mich dann nochmal melden. Danke :)
FlyingPersian
User
Beiträge: 11
Registriert: Freitag 20. Januar 2017, 10:17

So, ich hab jetzt die Funktionen und das Drawen für zwei Funktionen fertig:

1. GETREADY
[codebox=python file=Unbenannt.txt]def main()
#Die Variablen
rectNumb = 9
rectangles = [] #List of rectangles to be drawn
rectSize = 100

#Das Aufrufen der Funktion
if STATE == "PREPARETRIAL": #selects 9 random squares and draws them
create_squares(rectangles, rectNumb, rectSize)

#Die Funktion
def create_squares(a, b, c):
while len(a) <= b:

overlap = False;
pos = [random.randrange(0,SCREEN_SIZE[0]-c -100), random.randrange(0,SCREEN_SIZE[1]-c-100 )] #Added -100 to avoid overlap w/ done buttons
#list of position of drawn squares
for rect in a:
if (rect[0] - c) < pos[0] and pos[0] < (rect[0] + c)\
and (rect[1] - c) < pos[1] and pos[1] < (rect[1] + c):
overlap = True

if overlap == False:
a.append(pos)
print("Creating a square at: " + str(pos))

return a[/code]

2. PREPARETRIAL

Code: Alles auswählen

def main()
    #Variablen
    rectNumb = 9
    rectSize = 100

        #Das Aufrufen der Funktion
        if STATE == "PREPARETRIAL": #selects 9 random squares and draws them
            create_squares(rectangles, rectNumb, rectSize)

#Die Funktion
def draw_prepareTrial(a, b):
    screen.fill(BACKGR_COL)
    for rect in a:
        pygame.draw.rect(screen, col_white, (rect[0],rect[1], b, b), 1) #draw 9 random rectangles

    #Done button
    doneRect = pygame.Rect(900, 650, 100, 50) #define the location and size of your rectangle (left, top, width, height)
    pygame.draw.rect(screen, col_white, doneRect, 5)
    
    #Button text
    text_surface = font_small.render("Done", True, col_white, BACKGR_COL)
    text_rectangle = text_surface.get_rect()
    text_rectangle.center = (950, 675)
    screen.blit(text_surface, text_rectangle)
    
Sind die Funktionen so besser? Hab hier nochmal den Pastebin vom ganzen Code bisher, falls das übersichtlicher ist:

http://pastebin.com/kxDPkqgu
BlackJack

`a`, `b`, und `c` sind keine guten Namen. Man muss ja erst den Code lesen um zu verstehen was die bedeuten und damit was die Funktion als Argumente haben möchte.

Beim `create_squares()` ist die Übergabe einer leeren Liste nicht gut, hier würde man von so einer Funktion eher erwarten, dass sie die Liste selbst erstellt und dann zurück gibt. Beides, also die Liste übergeben *und* zurückgeben macht keinen Sinn weil der Aufrufer die Liste ja bereits hat wenn er sie übergibt.

Das ``return`` gehört auch sicher nicht *in* die Schleife, aber das hast Du wahrscheinlich schon gemerkt.

Ich hatte es ja schon mal geschrieben: Arbeite mit `Rect`-Objekten. Dann sparst Du Dir einiges an Code, weil die nicht nur eine Methode haben die prüft ob zwei `Rect`-Objekte sich überlappen, sondern sogar eine die prüft ob ein `Rect` irgendein `Rect` aus einer Sequenz, zum Beispiel einer Liste, überlappt.
BlackJack

@FlyingPersian: So würde ich die Funktion schreiben (ungetestet):

Code: Alles auswählen

def calculate_max_square_count(rect, square_size):
    squares_per_row = rect.width // square_size
    squares_per_column = rect.height // square_size
    return squares_per_row * squares_per_column


def create_random_square(square_size, rect):
    x = randrange(rect.left, rect.right - square_size)
    y = randrange(rect.top, rect.bottom - square_size)
    return pygame.Rect(x, y, square_size, square_size)


def create_random_squares(count, square_size, rect):
    # 
    # FIXME This test isn't enough because even if the squares would fit
    #   tightly packed they might not when randomly placed, leading to an
    #   endless loop.  We need either a better test, a better algorithm,
    #   or both.
    # 
    if calculate_max_square_count(rect, square_size) < count:
        raise ValueError(
            '{} squares of size {} do not fit into {}'.format(
                count, square_size, rect
            )
        )
    
    result = list()
    while len(result) < count:
        candidate = create_random_square(square_size, rect)
        if not candidate.collidelist(result):
            result.append(candidate)
    return result
Die Bildschirmgrösse und wie viel Platz Schaltflächen einnehmen muss diese Funktion nicht kennen, das ist schon etwas zu speziell. Sie bekommt ein `Rect`-Objekt übergeben innerhalb dessen die Quadrate liegen die erzeugt werden.
Antworten