Reaktionsspiel 4-Spieler

Hallo zusammen, Ich bin neu in der Mikrocontrollerprogrammierung habe aber schon einige Erfahrung in C-Programmierung. Als ein Projekt wollte ich ein Reaktionsspiel bauen. 4 Spieler haben jeder einen Taster und wenn eine LED aufleuchtet sollen sie alle drücken und der letzte hat verloren. Meine Schwierigkeit besteht jetzt darin, herauszufinden wer der letzte war. Ich hab mir überlegt das vll mit verschachtelten if-funktionen zu machen. Aber ich weiß nicht ob das überhaupt so funktionieren würde, und wenn ja ob das schnell genug wär, da ja die taster drücke auch mal nur einige millisekuden auseinander liegen. Vielleicht kann mir ja jmd helfen.

Hier ist wie ich mir so grob die Funktion vorgestellt habe aber wie gesagt weiß ich nicht ob das totaler Schwachsinn ist. Zudem ist es nicht wirklich eine elegante Lösung :).

if (Taster1 == HIGH){

    if (Taster2 == High){

        if (Taster3 == High) { return 4;}
        else { return 3;}
    }

    else if (Taster3 == High){

        if (Taster2 == High) { return 4;}
        else { return 2;}
    }

    else if (Taster4 == High){

        if (Taster2 == High) { return 3;}
        else { return 2;}
    }       

}

else if (Taster2 == HIGH){

    if (Taster1 == High){

        if (Taster3 == High) { return 4;}
        else { return 3;}
    }

    else if (Taster3 == High){

        if (Taster1 == High) { return 4;}
        else { return 1;}
    }

    else if (Taster4 == High){

        if (Taster1 == High) { return 3;}
        else { return 1;}
    }
}

else if (Taster3 == HIGH){

    if (Taster2 == High){

        if (Taster1 == High) { return 4;}
        else { return 1;}
    }

    else if (Taster1 == High){

        if (Taster2 == High) { return 4;}
        else { return 2;}
    }

    else if (Taster4 == High){

        if (Taster2 == High) { return 1;}
        esle { return 2;}
}

}

else if (Taster4 == HIGH){

    if (Taster2 == High){

        if (Taster3 == High) { return 1;}
        else { return 3;}
    }

    else if (Taster3 == High){

        if (Taster2 == High) { return 1;}
        else { return 2;}
    }

    else if (Taster1 == High)

        if (Taster2 == High) { return 3;}
        else { return 2;}
}

Würde es etwas kompakter ausdrücken:

if (Taster1+Taster2+Taster3+Taster4 == 3) // HIGH==1
  return 10-Taster1-Taster2*2-Taster3*3-Taster4*4

Oder so…

Okay aber mein Verständnis ist richtig? Also das Programm wartet darauf das ein Taster gedrückt wird und dann springt er in die dazugehörige if-Funktion und dann wartet das wieder bis alle gedrückt wurden?

@ Joghurt: Würde die Methode auch klappen wenn man nur auf den Taster einmal drauf haut? Also Spieler 1 drückt einmal kurz und dann spieler 2 einmal kurz und spieler 3 auch... würde das dann klappen oder müssen alle 3 außer dem letzten für eine kurze Zeit gleichzeitig gedrückt sein?

Sieht sehr aufwendig aus, außerdem müssen alle Spieler den Taster dann gedrückt halten. Ich würde das so realisieren, dass ab einen bestimmten Zeitpunkt eine Freigabe zum gemeinschaftlichen Tastendrücken erfolgt. Hier nehmen wir die Zeit mit der millis-Funktion als Startzeit. Nun detektieren wir für jeden Taster die Zeit, wann er gedrückt wurde, auch wieder mit den millis. Der Spieler mit der größten Zeitdifferenz verliert.

pyramide: Würde die Methode auch klappen wenn man nur auf den Taster einmal drauf haut? Also Spieler 1 drückt einmal kurz und dann spieler 2 einmal kurz und spieler 3 auch... würde das dann klappen oder müssen alle 3 außer dem letzten für eine kurze Zeit gleichzeitig gedrückt sein?

Nee, das klappt dann nicht. Hatte nur Deinen Code beschleunigt, unabhängig von seiner Sinnigkeit... ;)

Wie wäre es, die Zeiten zu messen bis der Spieler gedrückt hat und wenn alle gedrückt haben, diese Auszuwerten?

Normale Taster prellen.

Daher kannst du dich nicht drauf verlassen, dass ein einmal erkanntes HIGH nach 20 µs ( im nächsten loop durchlauf ) noch ansteht.

FNet's Vorschlag sieht sehr elegant aus: Kann mit millis() oder micros() realisiert werden. Unempfindlich gegen kurze Impulse und prellen.