Fuß­ball­tipp

// die Mannschaften
// Größe der Arrays: muss als Konstante definiert werden
const byte AnzahlMannschaften = 18;

// Array wird benötigt, um zwei unterschiedliche Mannschaften zu bestimmen
int ZufallsZahlen[AnzahlMannschaften];

// Arrays für Punkte und Tore
int AnzahlPunkte[AnzahlMannschaften];
int AnzahlTore[AnzahlMannschaften];

// Array der Mannschaften
String Mannschaften[AnzahlMannschaften] =
{
  "Mainz 05", "RB Leipzig", "Arminia Bielefeld", "Union Berlin",
  "VFL Bochum", "VFL Wolfsburg", "Borussia Dortmund", "Bayern München",
  "Eintracht Frankfurt", "Hertha BSC", "Borussia Mönchengladbach",
  "1. FC Köln", "SC Freiburg", "Greuther Fürth",
  "Bayer Leverkusen", "FC Augsburg", "1899 Hoffenheim", "VFB Stuttgart"
};

// Anzahl der Tore Minimum/Maximum
int Minimum = 0;
int Maximum = 4;

void setup()
{
  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial);
  delay(1000);

  // Info
  Serial.println("Ergebnisse tippen: -> <s>");
  Serial.println("Gesamtpunkte anzeigen: -> <t>");
  Serial.println("-------------------------------------------");

  // Zufallsgenerator starten
  randomSeed(analogRead(A0));
}

void loop()
{
  // auf serielle Eingabe warten
  while (Serial.available() > 0)
  {
    // Eingabe im Seriellen Monitor lesen
    char Zeichen = Serial.read();
    {
      // Spielpaarung ziehen
      if (Zeichen == 's')
      {
        // 2 unterschiedliche Mannschaften bestimmen
        for (int i = 0; i < 2; i ++)
        {
          /*
            die Mannschaft gilt solange als bereits gezogen
            bis in der for-Schleife nachgewiesen wird, dass sie neu ist
            und BereitsGezogen den Wert false hat
          */
          bool BereitsGezogen = true;
          while (BereitsGezogen)
          {
            // Zahl ziehen
            ZufallsZahlen[i] = random(0, AnzahlMannschaften);
            BereitsGezogen = false;
            /*
              Zufallszahl mit den bereits gezogenen Zahlen vergleichen
              i wird in der ersten for-Schleife hochgezählt
              alle bisherigen Zahlen (ii) werden mit den bisher gezogenen Zahlen
              (außer der gerade gezogenen) verglichen (ii < i)
              ist sie identisch, erhält BereitsGezogen den Wert true
              es wird erneut eine Zufallszahl bestimmt
              wenn die Zahl neu ist, (BereitsGezogen hat noch den Wert false)
              wird die while-Schleife verlassen und die nächste Zahl
              gezogen
            */
            for (int ii = 0; ii < i; ii ++)
            {
              if (ZufallsZahlen[i] == ZufallsZahlen[ii]) BereitsGezogen = true;
            }
          }
        }

        /*
          nach Aufruf der Funktion steht ein Array mit 2 Elementen zur Verfügung
          es beinhaltet die zufällig ausgewählten Mannschaften:
          ZufallsZahlen[0] und ZufallsZahlen[1]
          hiermit wird die Paarung des Spiels bestimmt
        */
        Serial.print(Mannschaften[ZufallsZahlen[0]]);
        Serial.print(" - " + Mannschaften[ZufallsZahlen[1]]);

        // Anzahl der Tore bestimmen
        AnzahlTore[ZufallsZahlen[0]] = random(Minimum, Maximum);
        AnzahlTore[ZufallsZahlen[1]] = random(Minimum, Maximum);

        // Sieger ermitteln: Sieger erhält 3 Punkte
        // Sieger 1. Mannschaft
        if (AnzahlTore[ZufallsZahlen[0]] > AnzahlTore[ZufallsZahlen[1]])
        {
          AnzahlPunkte[ZufallsZahlen[0]] = AnzahlPunkte[ZufallsZahlen[0]] + 3;
        }

        // Sieger 2. Mannschaft
        else if (AnzahlTore[ZufallsZahlen[0]] < AnzahlTore[ZufallsZahlen[1]])
        {
          AnzahlPunkte[ZufallsZahlen[1]] = AnzahlPunkte[ZufallsZahlen[1]] + 3;
        }
        // unentschieden: beide Mannschaften 1 Punkt
        else if (AnzahlTore[ZufallsZahlen[0]] == AnzahlTore[ZufallsZahlen[1]])
        {
          AnzahlPunkte[ZufallsZahlen[0]] = AnzahlPunkte[ZufallsZahlen[0]] + 1;
          AnzahlPunkte[ZufallsZahlen[1]] = AnzahlPunkte[ZufallsZahlen[1]] + 1;
        }

        // Ergebnis anzeigen
        Serial.print(" ");
        Serial.print(AnzahlTore[ZufallsZahlen[0]]);
        Serial.print(" : ");
        Serial.println(AnzahlTore[ZufallsZahlen[1]]);

        // Punkte anzeigen
        Serial.print(Mannschaften[ZufallsZahlen[0]]);
        Serial.println(": " + String(AnzahlPunkte[ZufallsZahlen[0]]) + " Punkt(e)");
        Serial.print(Mannschaften[ZufallsZahlen[1]]);
        Serial.println(": " + String(AnzahlPunkte[ZufallsZahlen[1]]) + " Punkt(e)");
      }

      // Gesamtpunkte anzeigen
      if (Zeichen == 't')
      {
        // Mannschaften nach Anzahl der Punkte sortieren
        ZahlenSortieren();
        Serial.println("-------------------------------------------");
        // Mannschaften in der Reihenfolge der Punkte anzeigen
        // die Mannschaft mit den meisten Punkte zuerst
        for (int i = AnzahlMannschaften - 1; i >= 0; i--)
        {
          Serial.print(Mannschaften[i]);
          Serial.println(": " + String(AnzahlPunkte[i]) + " Punkt(e)");
        }
        Serial.println("-------------------------------------------");
      }
    }
  }
}

void ZahlenSortieren()
{
  // unsortierten Bereich des Arrays durchlaufen
  for (int i = 0; i < (AnzahlMannschaften - 1); i++)
  {
    // bei jedem Durchlauf wird das jeweils letzte Element weggelassen
    for (int ii = 0; ii < (AnzahlMannschaften - (i + 1)); ii++)
    {
      /*
        wenn die aktuelle Zahl größer als die nachfolgende Zahl ist
        -> aktuelle AnzahlPunkte temporär speichern
        -> aktuelle Mannschaft temporär speichern
        -> AnzahlPunkte/Mannschaften vertauschen
        -> temporäre AnzahlPunkte/Mannschaften
           den nachfolgenden AnzahlPunkte/Mannschaften zuweisen
      */
      if (AnzahlPunkte[ii] > AnzahlPunkte[ii + 1])
      {
        int zwischengespeicherteZahl = AnzahlPunkte[ii];
        String zwischengespeicherteMannschaft = Mannschaften[ii];
        AnzahlPunkte[ii] = AnzahlPunkte[ii + 1];
        Mannschaften[ii] = Mannschaften[ii + 1];
        AnzahlPunkte[ii + 1] = zwischengespeicherteZahl;
        Mannschaften[ii + 1] = zwischengespeicherteMannschaft;
      }
    }
  }
}