Ein Computerspiel zum anfassen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Grüße,

    ich habe auf meinem Breadboard ein kleines Spiel gebastelt,
    wo es darum geht schneller als der gegnerische Spieler auf den Buzzer zu drücken,
    wenn das Licht leuchtet.

    Hier ist meine Schaltung:

    [/img]

    Hier die Wiring-Pi Library:

    wiringPi_l4d96.jpg

    Nun möchte ich mit der Programmierung anfangen und möchte mit euch ein geeignets Konzept für mein Vorhaben erötertn.

    Der Code beinhaltet bereits die Initialisierungen der PIN's. Ich arbeite mit der WiringPi-Library 2.

    PUD_DOWN habe ich importet, da sonst der Buzzer nicht richtig funktioniert und ein kleines Signal auch bei nicht gedrückter Taste sendet.
    Randint habe ich importiert um die LED später zufällig blinken zu lassen.
    (Hier ist dann die Reaktion der Spieler gefragt!!)

    Wie ihr seht habe ich auf dem Breadboard 3 LED's auf jeder Spielerseite installiert.
    Das ist der Punktestand. Das Spiel endet sobald ein Spieler 3 Punkte hat.

    Wie realisiere ich nun am besten den Ablauf?
    Mit einen Haufen if's? Einem Case?

    Habt ihr Ideen? :daumendreh2:

    Gruß

    Einmal editiert, zuletzt von AliceDeh (23. Mai 2015 um 09:49)

  • Hallo AliceDeh,

    da das Programm ja schon recht fortgeschritten ist, reichen Dir sicherlich nur ein paar Denkanstöße ;)
    1. Definition von zwei Interrupts (Abfrage der Taster-Ereignisse, Zuordnen von Callbacks, die beim Interrupt-Ereignis angesprungen werden)
    2. Endlos-Schleife
    3. Über den Interrupt wird die Callback-Funktion angesprungen und eine Variable gesetzt (z.B. Sieger = 1 oder Sieger = 2) und der Interrupt wieder ausgeschaltet (damit nicht der zweite Tastendrücker über die Hintertür gewinnt)
    4. In der Endlosschleife wird Sieger abgefragt, ob es ungleich 0 ist - dann hat wohl jemand gewonnen, Sieger-LEDs blinken oder so, Sieger auf 0 setzen und Spiel startet neu; anderenfalls läuft das Programm in der Hauptschleife weiter.
    5. Wegen der Interrupt-Stuerung kannst Du in der Hauptschleife eine kurze Warztezeit (ca. 10 ms) einbauen (reduziert die Prozessorauslastung)

    Durch diese Schritte erreichst Du, dass der erste Tastendruck, der erkannt wird, eindeutig dem Schnelleren zugeordnet wird - und der Tastendruck des Langsameren keinen Interrupt mehr auslöst.

    Alternativ erreichst Du das Gleiche auch, indem Du den Interrupt nicht deaktivierst, dafür aber im Callback abfragst, ob Sieger bereits bekannt ist. Wenn ja, dann wird die Varianble Sieger nicht geändert.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (23. Mai 2015 um 10:24)

  • Danke für deine Antwort. Hast du Lektüre zur Hand für "Cllback" und "Interrupts".
    Damit kenne ich mich nicht aus. Bei Google finde ich sicher schnell was, aber kannst du mir ein explizites Tutorial oder Buch empfehlen?

  • Hallo AliceDeh,

    Bücher brauchst Du dafür ganz sicher nicht. Wenn Du die Suchfunktion dieses Forums bemühst und z.B. so suchst, wirst Du ganz viele Beispiele finden. Seit rund zwei Monaten wird die Thematik täglich mehrfach nachgefragt und etliche Zeilen Code dazu veröffentlicht.

    Und Du weißt ja, mit Python habe ich es nicht so...


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (23. Mai 2015 um 13:00)

  • FAQ -> Linksammlung -> Interrupt

    Allerdings würde ich bei dem Ablauf-Vorschlag von Andreas, ab Punkt.2 etwas anders machen. Eine Endlosschleife würde denk ich überflüssig sein, da das direkt aus der Callback abgehandelt werden kann.

    Ich weiß gerade nicht ob wiringPi2 überhaupt Interrupt fähig ist oder wie das dort gemacht wird - deshalb beschreib ichs mal mit der allgemein üblichen RPi.GPIO Geschichte...


    Also erst mal das Grundgerüst:

    Spoiler anzeigen

    [code=php]
    #!/usr/bin/python
    import time, signal
    import RPi.GPIO as GPIO

    # to use RaspberryPi gpio# (BCM) or pin# (BOARD)
    GPIO.setmode(GPIO.BCM)
    #GPIO.setmode(GPIO.BOARD)

    # GPIO Pins
    Player1LED1 = 17
    Player1LED2 = 18
    Player1LED3 = 27
    Player1Buzzer = 4

    Player2LED1 = 22
    Player2LED2 = 23
    Player2LED3 = 24
    Player2Buzzer = 2

    RandomLED = 25
    Beeper = 3

    #------------------------------------------------------------------------

    GPIO.setup(Player1LED1, GPIO.OUT)
    GPIO.setup(Player1LED2, GPIO.OUT)
    GPIO.setup(Player1LED3, GPIO.OUT)
    GPIO.setup(Player1Buzzer, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) #GPIO -> GND
    GPIO.setup(Player2LED1, GPIO.OUT)
    GPIO.setup(Player2LED2, GPIO.OUT)
    GPIO.setup(Player2LED3, GPIO.OUT)
    GPIO.setup(Player2Buzzer, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) #GPIO -> GND
    GPIO.setup(RandomLED, GPIO.OUT)
    GPIO.setup(Beeper, GPIO.OUT)


    def interrupt_event(pin):
    zeit = time.strftime("%H:%M:%S")
    print "[{}] Button {} pressed" . format(zeit, pin)


    try:
    GPIO.add_event_detect(Player1Buzzer, GPIO.RISING, callback=interrupt_event, bouncetime=150)
    GPIO.add_event_detect(Player2Buzzer, GPIO.RISING, callback=interrupt_event, bouncetime=150)
    #keep script running
    signal.pause()
    except KeyboardInterrupt:
    print "\nQuit\n"
    GPIO.cleanup()
    [/php]

    Damit wäre schon mal ein Interrupt für beide Taster festgelegt und das Script soweit vorbereitet. Beim drücken eines der Taster kommt eine Ausgabe mit der Zeit und des Pins des jeweiligen Tasters.

    Nun noch mal zum Vorschlag von Andreas:


    3. Über den Interrupt wird die Callback-Funktion angesprungen und eine Variable gesetzt (z.B. Sieger = 1 oder Sieger = 2) und der Interrupt wieder ausgeschaltet (damit nicht der zweite Tastendrücker über die Hintertür gewinnt)
    4. In der Endlosschleife wird Sieger abgefragt, ob es ungleich 0 ist - dann hat wohl jemand gewonnen, Sieger-LEDs blinken oder so, Sieger auf 0 setzen und Spiel startet neu; anderenfalls läuft das Programm in der Hauptschleife weiter.
    5. Wegen der Interrupt-Stuerung kannst Du in der Hauptschleife eine kurze Warztezeit (ca. 10 ms) einbauen (reduziert die Prozessorauslastung)

    Durch diese Schritte erreichst Du, dass der erste Tastendruck, der erkannt wird, eindeutig dem Schnelleren zugeordnet wird - und der Tastendruck des Langsameren keinen Interrupt mehr auslöst.

    Alternativ erreichst Du das Gleiche auch, indem Du den Interrupt nicht deaktivierst, dafür aber im Callback abfragst, ob Sieger bereits bekannt ist. Wenn ja, dann wird die Varianble Sieger nicht geändert.

    Zunächst kümmern wir uns also erst mal um's unterscheiden welcher der Taster gedrückt wurde und die RandomLED einzuschalten. Sobald einer der Taster gedrückt wurde schalten wir die RandomLED aus.
    Dazu poste ich jetzt mal nur den Teil den ich vom obigen Script verändere:

    [code=php]
    # RandomLED einschalten
    GPIO.output(RandomLED, True)

    def interrupt_event(pin):
    zeit = time.strftime("%d.%m.%Y %H:%M:%S")
    if GPIO.input(Player1Buzzer) == GPIO.HIGH:
    print "[{}] Player 1 Button {} pressed" . format(zeit, pin)
    elif GPIO.input(Player2Buzzer) == GPIO.HIGH:
    print "[{}] Player 2 Button {} pressed" . format(zeit, pin)
    # RandomLED ausschalten
    GPIO.output(RandomLED, False)
    [/php]

    RandomLED bleibt dann aber aus und es wird auch noch nichts ausgewertet usw... Aber ich hoffe es wurde soweit schon mal verstanden was dort passiert? Wenn ja, versuche ich darauf im nächsten Beitrag weiter einzugehen :fies:

  • Ach was soll's :daumendreh2: Hier, probiers mal aus:

    [code=php]
    #!/usr/bin/python
    #
    # v0.1 - 23.05.2015 by meigrafd
    #
    # Ein Computerspiel zum anfassen
    #
    import time, signal
    import RPi.GPIO as GPIO

    # to use RaspberryPi gpio# (BCM) or pin# (BOARD)
    GPIO.setmode(GPIO.BCM)
    #GPIO.setmode(GPIO.BOARD)

    # GPIO Pins
    Player1LED1 = 17
    Player1LED2 = 18
    Player1LED3 = 27
    Player1Buzzer = 4

    Player2LED1 = 22
    Player2LED2 = 23
    Player2LED3 = 24
    Player2Buzzer = 2

    RandomLED = 25
    Beeper = 3

    #------------------------------------------------------------------------

    GPIO.setup(Player1LED1, GPIO.OUT)
    GPIO.setup(Player1LED2, GPIO.OUT)
    GPIO.setup(Player1LED3, GPIO.OUT)
    GPIO.setup(Player1Buzzer, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) #GPIO -> GND
    GPIO.setup(Player2LED1, GPIO.OUT)
    GPIO.setup(Player2LED2, GPIO.OUT)
    GPIO.setup(Player2LED3, GPIO.OUT)
    GPIO.setup(Player2Buzzer, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) #GPIO -> GND
    GPIO.setup(RandomLED, GPIO.OUT)
    GPIO.setup(Beeper, GPIO.OUT)


    def auswertung():
    zeit = time.strftime("%H:%M:%S")
    reset=False
    if globalVar['winner'] == 1:
    if globalVar['p1Points'] == 1:
    GPIO.output(Player1LED1, True)
    GPIO.output(Player1LED2, False)
    GPIO.output(Player1LED3, False)
    elif globalVar['p1Points'] == 2:
    GPIO.output(Player1LED1, True)
    GPIO.output(Player1LED2, True)
    GPIO.output(Player1LED3, False)
    elif globalVar['p1Points'] == 3:
    GPIO.output(Player1LED1, True)
    GPIO.output(Player1LED2, True)
    GPIO.output(Player1LED3, True)
    #reset game coz max points reached
    print "[{}] Player 1 Won!" . format(zeit)
    reset=True
    elif globalVar['winner'] == 2:
    if globalVar['p2Points'] == 1:
    GPIO.output(Player2LED1, True)
    GPIO.output(Player2LED2, False)
    GPIO.output(Player2LED3, False)
    elif globalVar['p2Points'] == 2:
    GPIO.output(Player2LED1, True)
    GPIO.output(Player2LED2, True)
    GPIO.output(Player2LED3, False)
    elif globalVar['p2Points'] == 3:
    GPIO.output(Player2LED1, True)
    GPIO.output(Player2LED2, True)
    GPIO.output(Player2LED3, True)
    #reset game coz max points reached
    print "[{}] Player 2 Won!" . format(zeit)
    reset=True
    if reset:
    time.sleep(5)
    globalVar['winner']=None
    globalVar['p1Points']=0
    globalVar['p2Points']=0
    GPIO.output(Player1LED1, False)
    GPIO.output(Player1LED2, False)
    GPIO.output(Player1LED3, False)
    GPIO.output(Player2LED1, False)
    GPIO.output(Player2LED2, False)
    GPIO.output(Player2LED3, False)
    # RandomLED erst nach zufaelliger Zeit (zwischen 5 und 15sec) wieder einschalten und Spiel fortfuehren.
    time.sleep( random.randrange(5, 15) )
    print "-- Another Round starts"
    globalVar['winner']=None
    # RandomLED einschalten
    GPIO.output(RandomLED, True)


    def beep(num, pause=0.3):
    for x in range(0, (num*2)):
    GPIO.output(Beeper, not GPIO.input(Beeper))
    time.sleep(pause)


    def LEDsBlinken(num, pause=0.5):
    if globalVar['winner'] == 1:
    for x in range(0, num):
    GPIO.output(Player1LED1, False)
    GPIO.output(Player1LED2, False)
    GPIO.output(Player1LED3, False)
    time.sleep(pause)
    GPIO.output(Player1LED1, True)
    GPIO.output(Player1LED2, True)
    GPIO.output(Player1LED3, True)
    time.sleep(pause)
    elif globalVar['winner'] == 2:
    for x in range(0, num):
    GPIO.output(Player2LED1, False)
    GPIO.output(Player2LED2, False)
    GPIO.output(Player2LED3, False)
    time.sleep(pause)
    GPIO.output(Player2LED1, True)
    GPIO.output(Player2LED2, True)
    GPIO.output(Player2LED3, True)
    time.sleep(pause)


    def interrupt_event(pin):
    zeit = time.strftime("%H:%M:%S")
    # RandomLED ausschalten
    GPIO.output(RandomLED, False)
    if not globalVar['winner']:
    if GPIO.input(Player1Buzzer) == GPIO.HIGH:
    globalVar['winner']=1
    globalVar['p1Points']+=1
    print "[{}] Player 1 Button {} pressed. Points: {}" . format(zeit, pin, globalVar['p1Points'])
    # Beeper kurz 1x einschalten
    beep(1)
    # LEDs von Player1 3x flashen lassen
    LEDsBlinken(3)
    auswertung()
    elif GPIO.input(Player2Buzzer) == GPIO.HIGH:
    globalVar['winner']=2
    globalVar['p2Points']+=1
    print "[{}] Player 2 Button {} pressed. Points: {}" . format(zeit, pin, globalVar['p2Points'])
    # Beeper kurz 2x einschalten
    beep(2)
    # LEDs von Player2 3x flashen lassen
    LEDsBlinken(3)
    auswertung()


    try:
    # Dictionary for global variables..
    globalVar={}
    globalVar['winner']=None
    globalVar['p1Points']=0
    globalVar['p2Points']=0
    # RandomLED einschalten
    GPIO.output(RandomLED, True)
    GPIO.add_event_detect(Player1Buzzer, GPIO.RISING, callback=interrupt_event, bouncetime=150)
    GPIO.add_event_detect(Player2Buzzer, GPIO.RISING, callback=interrupt_event, bouncetime=150)
    #keep script running
    signal.pause()
    except KeyboardInterrupt:
    print "\nQuit\n"
    GPIO.cleanup()
    [/php]

  • Ist eine nette kleine Programmieraufgabe. Wenn ich mal wieder Zeit habe stöpsele ich das auch mal auf mein Breadboard und schreibe ein kleines Pythonprogram dazu.

    meigrafd: Die Logik im Eventhandling zu implementieren ist ungewöhnlich. Normalerweise wird immer das MVC Prinzip angewendet und Darstellung, Datenerfassung und -persistenz separiert.

  • Guuuuten Morgen.

    meigrafd: DU packst einfach so den Code aus? :D Ich bin überwältigt!!
    Ich werde nachher die Schaltung aufbauen und das Skript sofort testen!!
    Wahnsinn meigrafd, Wahnsinn!!!!

    Eine kleine Frage: Arbeitet Python das Skript von oben nach unten ab? Wie eine Batch-Datei?
    Wahrscheinlich nicht oder? Wie nennt man denn eine solche Programmiersprache die nicht alles stur von oben nach unten abarbeitet, sondern ... äh ja schwer zu beschreiben :D

    Worauf ich hinaus will: Laufen die Funktionen die du definiert hast alle Parallal? Es würde in meinen Augen keinen Sinn machen, wenn er alle paar Sekunden das Skript von oben beginnt oder ist es doch so??

    Gruß und schicken Sonntag

    Einmal editiert, zuletzt von AliceDeh (24. Mai 2015 um 07:21)

  • Hallo zusammen,

    ich möchte keinen Streit vom Zaun brechen ... aber wo bleibt der Lerneffekt für AliceDeh, wenn er die fertige Lösung komplett präsentiert bekommt?

    Denn Deine Fragen, AliceDeh, deuten für mich darauf hin, dass Du selbst den Code, den Du gepostet hast, anscheinend auch nicht in erschöpfender Fülle verstanden zu haben scheinst.

    Aber egal, auf diese Weise steigen die Erwartungen der Fragesteller, immer mehr kompletten lauffähigen Code zu erhalten, ohne sich mit den Grundlagen der gewählten Programmiersprache beschäftigen zu müssen.


    Eine kleine Frage: Arbeitet Python das Skript von oben nach unten ab? Wie eine Batch-Datei?
    Wahrscheinlich nicht oder? Wie nennt man denn eine solche Programmiersprache die nicht alles stur von oben nach unten abarbeitet, sondern ... äh ja schwer zu beschreiben :D

    Worauf ich hinaus will: Laufen die Funktionen die du definiert hast alle Parallal? Es würde in meinen Augen keinen Sinn machen, wenn er alle paar Sekunden das Skript von oben beginnt oder ist es doch so??

    Python arbeitet den Code von oben nach unten ab (den Code, der ohne Leerzeichen / Tab beginnt. Von der "Hauptebene" aus werden dann irgendwelche Funktionen aufgerufen - die fangen dann mit def an.

    Eine Programmiersprache, die nicht alles stur von oben nach unten abarbeitet, nennt sich z.B. prozedurale Programmiersprache. Eine andere Sprachfamilie ist die der objektorientierten Programmiersprachen.

    Die Funktionen laufen nicht parallel ab. Es "läuft" immer nur die, die gerade aufgerufen ist. Das einzige, was parallel läuft, ist alles, was mit dem Interrupt zu tun hat. Und hier läuft auch nur der Teil parallel, der den Pegelwechsel überwacht. Sobald dieser "Parallelprozess" (Thread) ein Ereignis erkannt hat, wird wieder die Funktion angesprungen, die in dem geposteten Code als Bestandteil des eigentlichen Codes definiert ist.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (24. Mai 2015 um 09:30)


  • Eine kleine Frage: Arbeitet Python das Skript von oben nach unten ab? Wie eine Batch-Datei?
    Wahrscheinlich nicht oder? Wie nennt man denn eine solche Programmiersprache die nicht alles stur von oben nach unten abarbeitet, sondern ... äh ja schwer zu beschreiben :D

    Doch. Ich kenne es nicht anders.
    Auch Programme die kompiliert werden usw werden von oben nach unten abgearbeitet. Wie sollte es auch anders gehen? Eine gewisse Struktur ist immer von nöten, wie sollte sonst festgelegt werden wo der Anfang und das Ende ist, was zu erst beachtet wird und was quasi das Herz des Programms ist?

    Worauf ich hinaus will: Laufen die Funktionen die du definiert hast alle Parallal? Es würde in meinen Augen keinen Sinn machen, wenn er alle paar Sekunden das Skript von oben beginnt oder ist es doch so??

    Jein.

    Es gibt je nach Programmiersprache gewisse Unterschiede, ob die Zeilen von Oben nach Unten erst ein mal vollständig eingelesen und auf Korrektheit geprüft werden - so macht es zB PHP - bevor es ausgeführt wird, oder ob jede Zeile direkt/sofort ausgeführt wird - so macht es bash.
    Hier in Python ist es ähnlich wie mit PHP - mit dem Unterschied das es im Hintergrund compiliert wird... Aber das ist für deine Frage schnurz und sei nur mal nebenbei erwähnt.

    Hier wird der Code bis zum "signal.pause()" eingelesen. Das signal.pause blockiert das Script an dieser Stelle weiter zu machen - als würde man ein unendliches " time.sleep() " einfügen, oder eine while Schleife mit nem time.sleep drin...

    Das Script selbst ist ein Thread, also ein Prozess, der sog. Mother-Prozess. Durch den Interrupt wird ein weiterer Thread gestartet, quasi ein Child-Prozess. Wird der Interrupt ausgelöst werden dann eben die jeweilig anderen Sachen die durch Funktionen definiert sind, aufgerufen und abgearbeitet.
    signal.pause() kann man nur durch einen Fehler oder eben durch drücken von STRG+C beenden/unterbrechen -> KeyboardInterrupt. Dann wird der nachfolgende Code ausgeführt und das Ende der Datei erreicht -> Script wird beendet.


    framp: Viele Wege führen nach Rom ;) Es ist mir bewusst das man es anders machen kann/sollte, wollte den TE aber nicht gleich überfordern...


    Andreas: Ich hab von Anfang an angeboten das Schritt für Schritt zu erklären - es hat mich aber selber gereizt es möglichst einfach zu programmieren.
    Ob es überhaupt funktioniert weiß ich nicht, habs nicht überprüft. Es wäre also gut möglich das wir hier noch nicht fertig sind.
    Die Schaltung, wie der TE es oben gezeigt hat, wäre auch noch nicht fertig - in sofern sind wir hier noch etwas beschäftigt :fies:

  • Hallo Meigrafd,


    framp: Viele Wege führen nach Rom ;) Es ist mir bewusst das man es anders machen kann/sollte, wollte den TE aber nicht gleich überfordern...

    Das ist sehr löblich, Meigrafd. Hoffen wir einmal, dass er nicht überfordert wurde. ;)


    Andreas: Ich hab von Anfang an angeboten das Schritt für Schritt zu erklären - es hat mich aber selber gereizt es möglichst einfach zu programmieren.

    Mich reizt es auch recht häufig, irgendwelche Lösungen zu programmieren. Ich "schütte" das Ergebnis meistens aber nicht als ein Riesenpaket aus, sondern nur in dem Maße, wie der TE selber mitmacht. Und wenn er das Interesse verliert, dann bleibt der Code bei mir. Aktuelles Beispiel: Ein Programm, dass aus einem Photo eines Widerstandes mit recht komplexen Routinen zur Farberkennung den Widerstandswert korrekt ermittelt. Mit Benutzeroberfläche, Konfigurations-Gedöns und Algorithmus zum Farbenlernen waren das auch 501 Zeilen Code.

    Es ist ok, wenn der "Wissende" den denkenden Vorreiter spielt und z.B. sagt "Jetzt brauchst Du noch dieses und jenes. Schau mal nach, was Du im Internet so darüber findest. Und wenn Du dann das dann im Code umgesetzt hast, dann helfe ich weiter."

    Ja, mir ist es wichtig, dass der TE auch etwas dabei lernen kann. Dazu ist es meiner Meinung nach wichtig, dass man sich auf ein Niveau begibt, auf dem der TE mitdenken kann und aus den angedachten Lösungsvorschlägen selber Code entwickelt, die der erfahrene Programmierer dann noch optimieren kann.

    Wenn ich Code poste, dann ist dort auch jede Zeile erläutert (s. meine Icon-Tutorials - und deren demnächst beginnende Fortsetzung mit gezielten Aufgaben und deren Lösung).

    Aber egal...

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (24. Mai 2015 um 09:56)

  • Mahlzeit,

    Andreas du hast ja recht, aber ich bin trotzdem dankbvar dass er sich die Mühen gemacht hat. Und dann lerneich eben rückwärts :D

    Viele Sachen im Code habe ich verstanden, aber leider funktioniert Button Spieler 2 nicht und die LED's funktionieren nicht.

    Das Skript läuft und er zählt die Punkte, aber nur von Spieler 1.

    Beim Troubleshooting lernt man das Meiste, und das müssen wir jetzt machen.^^

    Ich überprüfe jetzt die Stellen im Code für die LED Anzeige und überprüfe die Buzzer.
    Oder wie verfahre ich jetzt am besten?

    Gruß

    PS: Den Code verstehe ich, nur manche Stellen noch nicht :) Der Lerneffekt durch das Skript ist aber schon groß (y) gg danke Jungs

    Mahlzeit,

    so nach ein wenig rumgefummel bin ich auf folgendes Ergebnis gekommen:

    Player2Buzzer = 7 #2 musste ich von GPIO 2 auf GPIO 7 ändern. GPIO 02 hat das Drücken des Buzzers nicht erkannt.

    Desweiteren musste ich oben 'random' importieren.

    Ansonsten funktioniert das Skript super. Ich werde nochmal die korrekte Schaltung posten mit dem vollständigem Code.

    Ich danke bis dahin alles die an diesem Projekt geholfen haben!!

    Jetzt ist es Zeit das Spielzu optimieren :) Aber vorher würde ich gerne noch einige Sachen klären, die mir etwas schleierhaft sind.

    PS: Game kommt super auf Arbeit an. Die Jungs zocken es :D

    PS: Durch feinere Einstellung die ich gerade am Skript vornehme, werden mir so einige Sachen klar!! Lerneffekt ist vorhanden, auch auf diesem Weg. :)

    Einmal editiert, zuletzt von AliceDeh (28. Mai 2015 um 13:27)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!