/***************************************************************************************************************** * Christoph Gerard * 20.06.2018 * ESP32_OLED_TicTacToe *******************************************************************************************************************/ #include // I2C #include // OLED #include // Graphic #define OLED_RESET 4 // not used / nicht genutzt bei diesem Display Adafruit_SSD1306 display(128,64); /*******************************************************************************************************************/ void setup() { Serial.begin(115200); // Initilize hardware serial: // initialize with the I2C addr 0x3C // mit I2C-Adresse 0x3c initialisieren display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.display(); delay(2000); display.clearDisplay(); display.setTextSize(1); display.setTextColor(INVERSE); } char g; // globale Variable, um Spieler Nummer zu erstellen und überall zu verwenden void ausgabe(char feld[9]) // Funktion zur Ausgabe des Spielfeldes { display.setCursor(0,0); display.print(" "); display.print(feld[0]); display.print(" | "); display.print(feld[1]); display.print(" | "); display.println(feld[2]); display.println("---+---+---"); display.print(" "); display.print(feld[3]); display.print(" | "); display.print(feld[4]); display.print(" | "); display.println(feld[5]); display.println("---+---+---"); display.print(" "); display.print(feld[6]); display.print(" | "); display.print(feld[7]); display.print(" | "); display.println(feld[8]); display.display(); }; bool gewonnen1(char feld[9]) // Funktion um nach jedem Spielzug zu prüfen, ob es ein Gewinner gibt { bool gewonnen = false; if ((feld[0] == g && feld[1] == g && feld[2] == g) || (feld[3] == g && feld[4] == g && feld[5] == g) || (feld[6] == g && feld[7] == g && feld[8] == g) || (feld[0] == g && feld[3] == g && feld[6] == g) || (feld[1] == g && feld[4] == g && feld[7] == g) || (feld[2] == g && feld[5] == g && feld[8] == g) || (feld[0] == g && feld[4] == g && feld[8] == g) || (feld[2] == g && feld[4] == g && feld[6] == g) ) // alle Gewinnmöglichkeiten aufgelistet { gewonnen = true; // wenn "gewonnen" = true: keine der Schleifen läuft mehr weiter, das Spiel ist beendet. } return gewonnen; }; char spielzug(char f[9]) { int nv = 1; // Variable nv für "neuen Versuch", falls eine falsche oder bereits belegte Zahl eingegeben wurde // Anfangs auf "1" (entspricht aktiv), um alle Falscheingaben abzufangen und den Spieler wiederholen zu lassen int spielernummer; // int, um Anhand der globalen Variablen den ensprechenden Spieler aufzufordern, eine Eingabe zu machen if (g == 'X') spielernummer = 1; else spielernummer = 2; // Spielernummer definieren display.setCursor(69,15); display.print("Spieler "); display.print(spielernummer); display.display(); while (nv == 1) { bool b = false; // Variable zum Beenden der Eingabe int position = 1; // Variable für Feldposition, die vom Spieler auszuwählen ist while (b != true) { if ((touchRead(T7)) <=30 && (touchRead(T4)) >= 40) // erster Taster, zum aufsummieren der gewünschten Eingabe { position = position+1;} if (position == 10) position = 1; display.setCursor(90,30); display.print(position); // Kontrollausgabe als Zähler display.display(); delay(500); // Verzögerung, damit er nicht zu schnell zählt display.setCursor(90,30); display.setTextColor(BLACK); display.print(position); display.setTextColor(INVERSE); if ((touchRead(T4)) <= 30 && (touchRead(T7)) >= 40) // Wenn zweiter Taster als Bestätigung geschaltet, { b = true;} // dann wird Schleife beendet }; display.setCursor(0,50); display.setTextColor(BLACK); display.print("schon belegt!"); display.setTextColor(INVERSE); display.setCursor(0,50); switch (position) // switch, um anhand der gegebenen Position das entsprechende Feld zu ändern. { case 1: {if (f[0] == 0) // wenn das feld noch nicht belegt ist... { f[0] = g; // ... wird es nun mit der entsprechenden (globalen) Spielervariable belegt nv = 0; // Variable "neuer Versuch" auf 0 setzen, da der Spielzug ausgeführt werden konnte } else display.println("schon belegt!"); // falls es doch belegt ist, gibt es eine Warung }; // while Schleife läuft erneut durch, da "nv" nicht geändert wird break; case 2: {if (f[1] == 0) { f[1] = g; nv = 0; } else display.println("schon belegt!"); }; break; case 3: {if (f[2] == 0) { f[2] = g; nv = 0; } else display.println("schon belegt!"); }; break; case 4: {if (f[3] == 0) { f[3] = g; nv = 0; } else display.println("schon belegt!"); }; break; case 5: {if (f[4] == 0) { f[4] = g; nv = 0; } else display.println("schon belegt!"); }; break; case 6: {if (f[5] == 0) { f[5] = g; nv = 0; } else display.println("schon belegt!"); }; break; case 7: {if (f[6] == 0) { f[6] = g; nv = 0; } else display.println("schon belegt!"); }; break; case 8: {if (f[7] == 0) { f[7] = g; nv = 0; } else display.println("schon belegt!"); }; break; case 9: {if (f[8] == 0) { f[8] = g; nv = 0; } else display.println("schon belegt!"); }; break; default: display.println("falsche Zahl!"); // Variable "nv" wird nicht geändert, Schleife läuft erneut durch }; }; // Ende des Spielzuges display.clearDisplay(); // hier wird das "alte" Feld gelöscht, um es zu überschreiben return f[9]; // Rückgabe des Arrays in main }; void loop() //***************************************************************************************************** { display.clearDisplay(); display.setCursor(0,0); display.setTextSize(1); char spielfeld[9] = { 0 }; // Erstellen des Spielfeldes in einem Array bool gewonnen = false; // Grundbedingung für das Weiterführen des Spiels int rundenzaehler = 0; display.println("Lets TicTacToe!"); display.setCursor(0,12); display.println(" 1 | 2 | 3 "); display.println("---+---+---"); display.println(" 4 | 5 | 6 "); display.println("---+---+---"); display.println(" 7 | 8 | 9 "); display.setCursor(0,56); display.print("Waehle zwischen 1-9"); while (gewonnen != true) // Start Spiel: läuft, bis gewonnen == true { if (gewonnen != true) // Durchlauf für Spieler 1 { g = 'X'; // Symbol 'X' für Spieler 1 wird in globaler Variable gespeichert spielzug(spielfeld); // Spielzug wird ausgeführt ausgabe(spielfeld); // "neues" Feld wird ausgegeben gewonnen = gewonnen1(spielfeld); if (gewonnen == true) { display.setCursor(0,50); display.print("Spieler 1 gewinnt!"); // Es wird geprüft, ob es nun einen Gewinner gibt display.display(); } } rundenzaehler = rundenzaehler + 1; // ein Rundenzähler wird hochgezählt, immer wenn Spieler 1 dran war if (gewonnen != true && rundenzaehler == 5) // Spieler 1 kann maximal 5 mal am Zug sein, bis es ein unentschieden gibt { // außer er gewinnt mit dem 5. Zug gewonnen = true; { display.setCursor(0,50); display.print("Unentschieden!"); // Es wird geprüft, ob es nun einen Gewinner gibt display.display(); } } if(gewonnen != true) { g = 'O'; // Symbol 'O' für Spieler 1 wird in globaler Variable gespeichert spielzug(spielfeld); // Spielzug wird ausgeführt ausgabe(spielfeld); // "neues" Feld wird ausgegeben gewonnen = gewonnen1(spielfeld); if (gewonnen == true) { display.setCursor(0,50); display.print("Spieler 2 gewinnt!"); // Es wird geprüft, ob es nun einen Gewinner gibt display.display(); } } }; // Ende Spiel /******************************************************************************************************************* * Manual: Button - wait - Warten auf Taste "Boot" *******************************************************************************************************************/ while (digitalRead(0) == HIGH) { yield(); //warten } }