Wür­fel­spiel mit einer vier­stel­li­gen Anzeige

Lese­zeit: 7 Minu­ten

Lösung
Seite als PDF

Navi­ga­ti­on

Auf dem 7-Segment-Display soll ein Wür­fel­spiel für zwei Spieler*innen rea­li­siert wer­den. Nach einem Druck auf den Tas­ter wird eine Zahl zwi­schen 1 und 6 gewür­felt. Auf dem Dis­play wird die Rei­hen­fol­ge der Spieler*innen ange­zeigt, die gewür­fel­te Zahl und die Sum­me der bis­he­ri­gen Wür­fe. Zum Schluss wird die sieg­rei­che Spielerin/der sieg­rei­che Spie­ler angezeigt.

So sieht es aus:

So sieht die Anzei­ge aus:

ers­te Spielerin
ers­ter Spie­ler
Punk­te­standzwei­te Spielerin
zwei­ter Spie­ler
Punk­te­stand Anzei­ge der Siegerin
des Sie­gers
Sum­me

Das 7- Seg­ment Dis­play TM1637 hat 4 Stel­len mit je 7 Seg­men­ten wobei nach 2 Stel­len ein Dop­pel­punkt dar­ge­stellt wer­den kann. Somit ergibt sich eine Anzei­ge von Zah­len­wer­ten von 0000 bis 9999.
Die Anschlüs­se:
CLK → belie­bi­ger digi­ta­ler Pin
DIO → belie­bi­ger digi­ta­ler Pin
VCC → 5 V
GND → Ground

Benö­tig­te Bibliotheken:

Funk­tio­nen der Biblio­thek TM1637 (AKJ)

Schlüs­sel­wortAkti­on
begin()Modul star­ten
setBrightness(int)0-15 → Hel­lig­keit des Dis­plays setzen
clear­Screen()Anzei­ge löschen
display(String)
display(int)
display(String/int, fal­se, fal­se, Position) 
display"Text");
display(10);
diaplay(1, fal­se, fal­se, 1);
Posi­ti­on beginnt mit 0
colon­On()Dop­pel­punkt einschalten
colon­Off()Dop­pel­punkt ausschalten

Benö­tig­te Bauteile:

  • 2 Tas­ter
  • 7-Segment-Anzeige TM1637
  • Lei­tungs­dräh­te

Baue die Schal­tung auf.
(Fah­re mit der Maus über das Bild, um die Bezeich­nun­gen der Bau­tei­le zu sehen)

Bei­spiel:

Auf Tas­ter­druck star­tet ein Count­down von 10 bis 0. Am Ende zeigt das Dis­play „StoP“:

So sieht es aus:

Der dazu­ge­hö­ri­ge Quelltext:

# include <TM1637.h>

TM1637 Anzeige(2, 3);

int TASTER = 7;

void setup()
{
  // Modul starten
  Anzeige.begin();

  // Helligkeit setzen
  Anzeige.setBrightness(3);
  
  pinMode(TASTER, INPUT_PULLUP);

  // Bildschirm löschen
  Anzeige.clearScreen();

  Anzeige.display("Los");
  delay(1000);
}

void loop()
{ 
  int TasterStatus = digitalRead(TASTER);
  if (TasterStatus == LOW)
  {
    for (int i = 10; i > 0; i--)
    {
      // 10 -> Position 2, keine Nullen (rechts/links)auffüllen
      if (i == 10) Anzeige.display(i, false, false, 2);
      else Anzeige.display(i, false, false, 3);

      delay(1000);
    }

    Anzeige.display("Stop");
  }
}

Ergän­ze im Kopf des Pro­gramms die Variablen:

// benötigte Bibliotheken
# include <TM1637.h>
# include <Bounce2.h>

// Spieler*in 1
int TASTER1 = 7;

// Spieler*in 2
int TASTER2 = 6;

// Definition Display
TM1637 Anzeige(2, 3);

// Summe der Augen der beiden Spieler*innen
int SummeSpieler1;
int SummeSpieler2;

// Anzahl der Runden, Start mit 1
int Runde = 1;

int Zahl;

// Reihenfolge der Spieler*innen festlegen, Spieler1 startet
bool StartSpieler1 = true;
bool StartSpieler2 = false;

// formatierter String für die Anzeige der Punkte
String Ergebnis;

// Bibliothek Bounce2
// "Prellverhinderer" für die Tasten starten
Bounce SP1 = Bounce();
Bounce SP2 = Bounce();

Im setup-Teil wird zusätz­lich der ➨Zufalls­ge­ne­ra­tor gestartet.

void setup()
{
  pinMode(TASTER1, INPUT_PULLUP);
  pinMode(TASTER2, INPUT_PULLUP);

  // Instanzen des Objekts Bounce für jede Taste zuordnen
  // Zeitintervall einstellen
  SP1.attach(TASTER1);
  SP1.interval(20);
  SP2.attach(TASTER2);
  SP2.interval(20);

  // Modul starten
  Anzeige.begin();
  Anzeige.clearScreen();

  // Helligkeit setzen(0-15)
  Anzeige.setBrightness(4);
  Anzeige.display("SP-1");

  // Zufallsgenerator starten
  randomSeed(analogRead(0));
}
Download

Der loop-Teil. Beach­te die Kommentare.

void loop()
{
  // Minimum und Maximum der Würfelaugen
  int Minimum = 1;
  int Maximum = 7;

  // 6 Runden spielen
  while (Runde < 4)
  {
    // Spieler*in 1 ist an der Reihe StartSpieler1 -> true
    if (StartSpieler1)
    {
      // Taste 1 gedrückt
      if (SP1.update())
      {
        if (SP1.read() == LOW)
        {
          // Wechsel → Spieler2 ist an der Reihe
          StartSpieler1 = !StartSpieler1;
          StartSpieler2 = !StartSpieler2;

          Anzeige.clearScreen();

          // Aufruf der Funktion ZufallsZahl
          SummeSpieler1 = SummeSpieler1 + ZufallsZahl(Minimum, Maximum);

          // : einschalten
          Anzeige.colonOn();

          /*
            Ergebnis formatieren:
            beide Zahlen < 10 -> führende 0 setzen
            eine der Zahlen < 10 -> führende 0 setzen
          */
          if (SummeSpieler1 < 10 && SummeSpieler2 < 10) Ergebnis = "0" + String(SummeSpieler1) + "0" + String(SummeSpieler2);
          else if (SummeSpieler1 >= 10 && SummeSpieler2 >= 10) Ergebnis = String(SummeSpieler1) + String(SummeSpieler2);
          else if (SummeSpieler1 < 10) Ergebnis = "0" + String(SummeSpieler1) + String(SummeSpieler2);
          else if (SummeSpieler2 < 10 ) Ergebnis = String(SummeSpieler1) + "0" + String(SummeSpieler2);
          Anzeige.display(Ergebnis);

          delay(2000);

          // : ausschalten
          Anzeige.colonOff();
          Anzeige.display("SP-2");
        }
      }
    }

    // Spieler*in 2 ist an der Reihe StartSpieler2 → true
    if (StartSpieler2)
    {
      // Taste 1 gedrückt
      if (SP2.update())
      {
        if (SP2.read() == LOW)
        {
          // Wechsel → Spieler1 ist an der Reihe
          StartSpieler1 = !StartSpieler1;
          StartSpieler2 = !StartSpieler2;

          Anzeige.clearScreen();

          // Aufruf der Funktion ZufallsZahl
          SummeSpieler2 = SummeSpieler2 + ZufallsZahl(Minimum, Maximum);

          Anzeige.colonOn();

          if (SummeSpieler1 < 10 && SummeSpieler2 < 10) Ergebnis = "0" + String(SummeSpieler1) + "0" + String(SummeSpieler2);
          else if (SummeSpieler1 >= 10 && SummeSpieler2 >= 10) Ergebnis = String(SummeSpieler1) + String(SummeSpieler2);
          else if (SummeSpieler1 < 10) Ergebnis = "0" + String(SummeSpieler1) + String(SummeSpieler2);
          else if (SummeSpieler2 < 10 ) Ergebnis = String(SummeSpieler1) + "0" + String(SummeSpieler2);
          Anzeige.display(Ergebnis);

          delay(2000);
          Anzeige.colonOff();
          Anzeige.clearScreen();

          Anzeige.display("SP-1");

          // nur bei Spieler2 Runde hochzählen, Spieler1 hat angefangen
          Runde ++;
        }
      }
    }
  }

  // unentschieden
  if (SummeSpieler1 == SummeSpieler2)
  {
    Anzeige.clearScreen();
    Anzeige.display(" = =");
    delay(2000);

    // alle Werte zurücksetzen
    Runde = 1;
    SummeSpieler1 = 0;
    SummeSpieler2 = 0;
    Anzeige.clearScreen();
    Anzeige.display("SP-1");
  }

  // Sieger Spieler1
  if (SummeSpieler1 > SummeSpieler2)
  {
    Anzeige.display("SIEG");
    delay(2000);
    Anzeige.clearScreen();

    Anzeige.display("SP-1");
    delay(2000);

    // Punktestand anzeigen
    Anzeige.clearScreen();

    // Anzeige rechtsbündig formatieren
    if (SummeSpieler1 < 10) Anzeige.display(SummeSpieler1, false, false, 3);
    else  Anzeige.display(SummeSpieler1, false, false, 2);
    delay(2000);

    // Neustart: alle Werte zurücksetzen, SP-1 anzeigen
    Runde = 1;
    SummeSpieler1 = 0;
    SummeSpieler2 = 0;
    Anzeige.clearScreen();
    Anzeige.display("SP-1");
  }

  // Sieger Spieler2
  if (SummeSpieler1 < SummeSpieler2)
  {
    Anzeige.display("SIEG");
    delay(2000);
    Anzeige.clearScreen();
    Anzeige.display("SP-2");
    delay(2000);
    Anzeige.clearScreen();

    if (SummeSpieler2 < 10) Anzeige.display(SummeSpieler2, false, false, 3);
    else  Anzeige.display(SummeSpieler2, false, false, 2);
    delay(2000);

    // Neustart: alle Werte zurücksetzen, SP-1 anzeigen
    Runde = 1;
    SummeSpieler1 = 0;
    SummeSpieler2 = 0;
    Anzeige.clearScreen();
    Anzeige.display("SP-1");
  }
}

Jetzt fehlt nur noch die ➨Funk­ti­on ZufallsZahl.

int ZufallsZahl(int Minimum, int Maximum)
{
  int Zahl =  random(Minimum, Maximum);
  return Zahl;
}
Download

Wür­fel­spiel Seri­el­ler Monitor


Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Aufgaben:


Letzte Aktualisierung: 30. Nov 2022 @ 11:46