Corsi Block Tapping Task
-
- 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
-
- 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
Sind die Funktionen so besser? Hab hier nochmal den Pastebin vom ganzen Code bisher, falls das übersichtlicher ist:
http://pastebin.com/kxDPkqgu
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)
http://pastebin.com/kxDPkqgu
`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.
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.
@FlyingPersian: So würde ich die Funktion schreiben (ungetestet):
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.
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