simpler Kopfrechner mit Pygame

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Sam123
User
Beiträge: 35
Registriert: Freitag 20. November 2020, 12:25

Super, danke! Läuft jetzt genau wie ich wollte.

Code: Alles auswählen

while_zaehler = 0
while status != pygame.QUIT:
        clock.tick(300)

        zeichne_kreis(display, clock)

        while_zaehler += 1

        if while_zaehler in [10, 20, 100]:
            print(while_zaehler)
            schreibe_zahl(font, display, clock)

        if while_zaehler == 100:
            while_zaehler = 0
Benutzeravatar
Domroon
User
Beiträge: 104
Registriert: Dienstag 3. November 2020, 10:27
Wohnort: Dortmund

@Sirius3: Okay Fehler erkannt ;) "Or" hat wirklich nicht funktioniert und 60 wurde auch nie erreicht. Folgende main Funktion habe ich nun korrigiert:

Code: Alles auswählen

def main():
    pygame.init()
    pygame.display.set_caption("Zufallszahl")
    font = pygame.font.Font('freesansbold.ttf', 40)
    clock = pygame.time.Clock()
    display = pygame.display.set_mode((1000, 300))
    display.fill(WHITE)

    speed = 60
    zaehler = 0
    status = None
    while status != pygame.QUIT:
        clock.tick(speed)
        
        zwanzigste = [20, 40, 60]
        if zaehler in zwanzigste:
            print(zaehler)
            schreibe_zahl(font, display, clock)
        
        zeichne_kreis(display,clock)

        zaehler += 1
        if zaehler > 60:
            zaehler = 0
	
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                status = pygame.QUIT

    pygame.quit()

if __name__ == '__main__':
    main()
Danke Sirius3 ;)
Benutzeravatar
Domroon
User
Beiträge: 104
Registriert: Dienstag 3. November 2020, 10:27
Wohnort: Dortmund

@Sam123: Super freut mich ;)
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Domroon: damit läuft jetzt der Zähler jetzt unrund, zwischen Frame 20 und 40, bzw. 40 und 60 liegen jeweils 20 Frames, zwischen 60 und 20 aber 21.
Benutzeravatar
Domroon
User
Beiträge: 104
Registriert: Dienstag 3. November 2020, 10:27
Wohnort: Dortmund

@Sirius: Ach stimmt :D Okay dann müsste ich doch einfach nur den Zähler anstatt auf 0 dann auf 1 setzen. Denn bislang habe ich die Null mitgezählt :D

Code: Alles auswählen

    speed = 60
    zaehler = 1
    status = None
    while status != pygame.QUIT:
        clock.tick(speed)
        print(zaehler)
        zwanzigste = [20, 40, 60]
        if zaehler in zwanzigste:
            schreibe_zahl(font, display, clock)
        
        zeichne_kreis(display,clock)

        zaehler += 1
        if zaehler > 60:
            zaehler = 1
Sam123
User
Beiträge: 35
Registriert: Freitag 20. November 2020, 12:25

Hallo zusammen,
ich experimentiere wieder ein wenig mit dem Kopfrechner rum, und verstehe wieder nicht, warum er das macht, was er macht, bzw. wie ich es besser hinkriege. Nach dem dem ENTER wird das Ergebnis ausgewertet, und er stellt sofort wieder eine neue Aufgabe und als Eingabe wird dann wohl nichts eingelesen, weil es viel zu schnell geht?

Und es kommt folgende Fehlermeldung:

text = "richtig!" if ergebnis == int(eingabe) else "falsch!"
ValueError: invalid literal for int() with base 10: ''

Hat jeman ein Tip, wie mans richtig macht?

(Ich versuche es erstmal ohne die Funktionen, weil es für mich momentan so einfacher zu verstehen ist.)

Code: Alles auswählen

import pygame
import random

WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
BLUE = (0, 0, 128)

pygame.init()
pygame.display.set_caption("Kopfrechner")
font = pygame.font.Font('freesansbold.ttf', 50)
clock = pygame.time.Clock()
display = pygame.display.set_mode((800, 300))

status = None
while status != pygame.QUIT:

    zahl_1 = random.randint(1, 101)
    zahl_2 = random.randint(1, 101)
    ergebnis = zahl_1 + zahl_2
    aufgabe = "{0} + {1} = ".format(zahl_1, zahl_2)
    eingabe = ""
    print("aufgabe: ", aufgabe, ergebnis)

    while True:

        display.fill(WHITE)
        text = font.render(aufgabe, True, GREEN, BLUE)
        display.blit(text, (200, 50))

        for event in pygame.event.get():
            #print("event-for-Schleife: ", event)
            if event.type == pygame.QUIT:
                status = pygame.QUIT
                #print("status = pygame.QUIT", event)
                break
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RETURN:
                    status = pygame.K_RETURN
                    #print("status = pygame.RETURN", event)
                    break
                elif event.key == pygame.K_BACKSPACE:
                    eingabe = eingabe[:-1]
                else:
                    eingabe = eingabe + event.unicode

        text = font.render(eingabe, True, GREEN, BLUE)
        display.blit(text, (450, 50))

        if status == pygame.K_RETURN:
            print("ergebnis: ", ergebnis)
            print("eingabe: ", eingabe)
            #print("if Abfrage, status = pygame.K_RETURN")
            text = "richtig!" if ergebnis == int(eingabe) else "falsch!"
            text = font.render(text, True, GREEN, BLUE)
            display.blit(text, (600, 50))
            pygame.display.flip()
            break

        pygame.display.flip()

        clock.tick(30)

        if status == pygame.QUIT:
            break
pygame.quit()
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

An welchen Stellen wird `status` gesetzt?
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Sam123
Wenn du innerhalb einer Schleife einen Wert veränderst, dann springt der Wert beim nächsten Durchlauf nicht wieder auf den Ursprungszustand zurück, sondern der bleibt dort, solange bis man ihn erneut verändert. In Verbindung mit dem Status geht dir da vielleicht ein Licht auf. :)
Sam123
User
Beiträge: 35
Registriert: Freitag 20. November 2020, 12:25

Alles klar, danke euch! Ich war fälschlichweise davon ausgegangen, dass in der for-Schleife 'status' immer neu belegt wird.
Antworten