| Vier in eine Reihe
8x8 RGB-Matrix CJMMU
Testschaltung auf Platine (Frontansicht)
Rückseite. Verdrahtungsaufwand ist überschaubar.
SchaltplanSchaltplan (Arduino ohne USB-Anschluss: Vin > 6 V) Das ProgrammGrundsätzlich besteht das Programm (in der Welt des Arduino Sketch genannt) aus zwei Hauptteilen. In dem
ersten Teil bekommt der Gegenspieler die Möglichkeit, seinen Zug zu absolvieren. In dem zweiten Teil wird über die angemessene
Antwort „nachgedacht“.
Damit das Programm funktioniert, muss die Bibliothek "Adafruit NeoPixel" V1.4.0 installiert werden. // ************************************************************************ // Vier in eine Reihe // Mit RGB-Matrix CJMCU und Arduino Nano // IDE 1.8.12 // (Grundstock) // ************************************************************************ #include <Adafruit_NeoPixel.h> #ifdef __AVR__ #include <avr/power.h> #endif #define LED_PIN 2 #define LED_COUNT 64 Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800); // Eingänge + Ausgänge .................................................... int Taste_Links = 7; int Taste_Rauf = 6; int Taste_Rechts = 3; int Taste_Runter = 4; int Taste_Enter = 5; int Spielende = 8; // Variablen .............................................................. int Spielbrett [14][14]; int Spieler = 0; int Reihe = 0; int Spalte = 0; int Feld_Nummer = 0; int Cursor = 0; int CursorReihe = 0; int CursorSpalte = 0; int Game_is_over = 0; // SETUP ****************************************************************** void setup() { strip.begin(); strip.show(); strip.setBrightness(20); pinMode(Taste_Links, INPUT_PULLUP); pinMode(Taste_Rechts, INPUT_PULLUP); pinMode(Taste_Rauf, INPUT_PULLUP); pinMode(Taste_Runter, INPUT_PULLUP); pinMode(Taste_Enter, INPUT_PULLUP); pinMode(Spielende, OUTPUT); } // HAUPTPROGRAMM ********************************************************** void loop() { if (Game_is_over == 0) { switch (Spieler) { case 0: { Ich_beginne(); break; } case 1: { Spieler_am_Zug(); break; } case 2: { Mein_Zug(); break; } } } Spielbrett_Anzeigen(); if (Game_is_over == 1) { do { digitalWrite (Spielende, HIGH); delay(500); digitalWrite (Spielende, LOW); delay(500); } while (Game_is_over == 0); } } // Programm Start --------------------------------------------------------- void Ich_beginne() { Spielbrett [8][8] = 1; Spieler = 1; } // Spielbrett anzeigen ---------------------------------------------------- void Spielbrett_Anzeigen() { for (Reihe = 4; Reihe < 12; Reihe++) { for (Spalte = 4; Spalte < 12; Spalte++) { Feld_Nummer = (Reihe-4)*8 + (Spalte-3) - 1; // Leer (Aus) if (Spielbrett [Reihe][Spalte] == 0) { strip.setPixelColor(Feld_Nummer, 0, 0, 0); } // Rot Arduino if (Spielbrett [Reihe][Spalte] == 1) { strip.setPixelColor(Feld_Nummer, 255, 0, 0); } // Grün Spieler if (Spielbrett [Reihe][Spalte] == -10) { strip.setPixelColor(Feld_Nummer, 0, 255, 0); } // Blau Cursor if (Spielbrett [Reihe][Spalte] == 100) { strip.setPixelColor(Feld_Nummer, 0, 0, 255); } }} strip.show(); } // Spieler am Zug --------------------------------------------------------- void Spieler_am_Zug() { if (Cursor == 0) { do { Reihe = random (4,12); Spalte = random (4,12); } while (Spielbrett [Reihe][Spalte] != 0); Cursor = 1; Spielbrett [Reihe][Spalte] = 100; CursorReihe = Reihe; CursorSpalte = Spalte; } if (Cursor == 1) { if (digitalRead(Taste_Links) == LOW) { delay (300); for (int i = CursorSpalte; i > 3; i--) { if (Spielbrett [CursorReihe][i] == 0) { Spielbrett [CursorReihe][CursorSpalte] = 0; Spielbrett [CursorReihe][i] = 100; CursorSpalte = i; break; } } } if (digitalRead(Taste_Rechts) == LOW) { delay (300); for (int i = CursorSpalte; i < 12; i++) { if (Spielbrett [CursorReihe][i] == 0) { Spielbrett [CursorReihe][CursorSpalte] = 0; Spielbrett [CursorReihe][i] = 100; CursorSpalte = i; break; } } } if (digitalRead(Taste_Rauf) == LOW) { delay (300); for (int i = CursorReihe; i > 3; i--) { if (Spielbrett [i][CursorSpalte] == 0) { Spielbrett [CursorReihe][CursorSpalte] = 0; Spielbrett [i][CursorSpalte] = 100; CursorReihe = i; break; } } } if (digitalRead(Taste_Runter) == LOW) { delay (300); for (int i = CursorReihe; i < 12; i++) { if (Spielbrett [i][CursorSpalte] == 0) { Spielbrett [CursorReihe][CursorSpalte] = 0; Spielbrett [i][CursorSpalte] = 100; CursorReihe = i; break; } } } if (digitalRead(Taste_Enter) == LOW) { delay (500); Spielbrett [CursorReihe][CursorSpalte] = -10; Cursor = 2; Spieler = 2; Vier_in_Reihe (CursorReihe, CursorSpalte, -40); } } } // Computer am Zug -------------------------------------------------------- void Mein_Zug() { int Punkte_horizontal; int Punkte_vertikal; int Punkte_diagonal_L; int Punkte_diagonal_R; int Punkte_Zahl = 0; int Best_Punkte = 0; int Best_Reihe = 0; int Best_Spalte = 0; int Punkte_addiert; // Alle Felder durchsuchen ............................................ for (Reihe = 4; Reihe < 12; Reihe++) { for (Spalte = 4; Spalte < 12; Spalte++) { // nur Freie Plätze suchen ........................................ if (Spielbrett [Reihe][Spalte] == 0) { // Nachbarschaft prüfen ......................................... int Nachbarschaft = Spielbrett [Reihe][Spalte - 1] + Spielbrett [Reihe][Spalte + 1] + Spielbrett [Reihe - 1][Spalte] + Spielbrett [Reihe - 1][Spalte - 1] + Spielbrett [Reihe - 1][Spalte + 1] + Spielbrett [Reihe + 1][Spalte] + Spielbrett [Reihe + 1][Spalte - 1] + Spielbrett [Reihe + 1][Spalte + 1]; // Feldbewertung ................................................ if (Nachbarschaft != 0) { Punkte_horizontal = 0; Punkte_addiert = Summe_Punkte_horizontal (Reihe, Spalte-3); if (Punkte_addiert > Punkte_horizontal) { Punkte_horizontal = Punkte_addiert; } Punkte_addiert = Summe_Punkte_horizontal (Reihe, Spalte-2); if (Punkte_addiert > Punkte_horizontal) { Punkte_horizontal = Punkte_addiert; } Punkte_addiert = Summe_Punkte_horizontal (Reihe, Spalte-1); if (Punkte_addiert > Punkte_horizontal) { Punkte_horizontal = Punkte_addiert; } Punkte_addiert = Summe_Punkte_horizontal (Reihe, Spalte); if (Punkte_addiert > Punkte_horizontal) { Punkte_horizontal = Punkte_addiert; } Punkte_vertikal = 0; Punkte_addiert = Summe_Punkte_vertikal (Reihe-3, Spalte); if (Punkte_addiert > Punkte_vertikal) { Punkte_vertikal = Punkte_addiert; } Punkte_addiert = Summe_Punkte_vertikal (Reihe-2, Spalte); if (Punkte_addiert > Punkte_vertikal) { Punkte_vertikal = Punkte_addiert; } Punkte_addiert = Summe_Punkte_vertikal (Reihe-1, Spalte); if (Punkte_addiert > Punkte_vertikal) { Punkte_vertikal = Punkte_addiert; } Punkte_addiert = Summe_Punkte_vertikal (Reihe, Spalte); if (Punkte_addiert > Punkte_vertikal) { Punkte_vertikal = Punkte_addiert; } Punkte_diagonal_L = 0; Punkte_addiert = Summe_Punkte_diagonal_L (Reihe-3, Spalte-3); if (Punkte_addiert > Punkte_diagonal_L) { Punkte_diagonal_L = Punkte_addiert; } Punkte_addiert = Summe_Punkte_diagonal_L (Reihe-2, Spalte-2); if (Punkte_addiert > Punkte_diagonal_L) { Punkte_diagonal_L = Punkte_addiert; } Punkte_addiert = Summe_Punkte_diagonal_L (Reihe-1, Spalte-1); if (Punkte_addiert > Punkte_diagonal_L) { Punkte_diagonal_L = Punkte_addiert; } Punkte_addiert = Summe_Punkte_diagonal_L (Reihe, Spalte); if (Punkte_addiert > Punkte_diagonal_L) { Punkte_diagonal_L = Punkte_addiert; } Punkte_diagonal_R = 0; Punkte_addiert = Summe_Punkte_diagonal_R (Reihe+3, Spalte-3); if (Punkte_addiert > Punkte_diagonal_R) { Punkte_diagonal_R = Punkte_addiert; } Punkte_addiert = Summe_Punkte_diagonal_R (Reihe+2, Spalte-2); if (Punkte_addiert > Punkte_diagonal_R) { Punkte_diagonal_R = Punkte_addiert; } Punkte_addiert = Summe_Punkte_diagonal_R (Reihe+1, Spalte-1); if (Punkte_addiert > Punkte_diagonal_R) { Punkte_diagonal_R = Punkte_addiert; } Punkte_addiert = Summe_Punkte_diagonal_R (Reihe, Spalte); if (Punkte_addiert > Punkte_diagonal_R) { Punkte_diagonal_R = Punkte_addiert; } // Beste Position ermitteln ................................... Punkte_Zahl = 0; // 1 Pixel = 1 Punkt .......................................... if (Punkte_horizontal == 1) { Punkte_Zahl = 1; } if (Punkte_vertikal == 1) { Punkte_Zahl = 1; } if (Punkte_diagonal_L == 1) { Punkte_Zahl = 1; } if (Punkte_diagonal_R == 1) { Punkte_Zahl = 1; } // Kreuzung 1 x 1 Pixel = 2 Punkte ............................ if (Punkte_horizontal == 1 and Punkte_vertikal == 1) { Punkte_Zahl = 2; } if (Punkte_horizontal == 1 and Punkte_diagonal_L == 1) { Punkte_Zahl = 2; } if (Punkte_horizontal == 1 and Punkte_diagonal_R == 1) { Punkte_Zahl = 2; } if (Punkte_vertikal == 1 and Punkte_diagonal_L == 1) { Punkte_Zahl = 2; } if (Punkte_vertikal == 1 and Punkte_diagonal_R == 1) { Punkte_Zahl = 2; } if (Punkte_diagonal_L == 1 and Punkte_diagonal_R == 1) { Punkte_Zahl = 2; } // 2 Pixel - 3 Punkte ........................................ if (Punkte_horizontal == 2) { Punkte_Zahl = 3; } if (Punkte_vertikal == 2) { Punkte_Zahl = 3; } if (Punkte_diagonal_L == 2) { Punkte_Zahl = 3; } if (Punkte_diagonal_R == 2) { Punkte_Zahl = 3; } // Kreuzung 2 x 1 Pixel = 4 Punkte ........................... if (Punkte_horizontal == 2 and Punkte_vertikal == 1) { Punkte_Zahl = 4; } if (Punkte_horizontal == 1 and Punkte_vertikal == 2) { Punkte_Zahl = 4; } if (Punkte_horizontal == 2 and Punkte_diagonal_L == 1) { Punkte_Zahl = 4; } if (Punkte_horizontal == 1 and Punkte_diagonal_L == 2) { Punkte_Zahl = 4; } if (Punkte_horizontal == 2 and Punkte_diagonal_R == 1) { Punkte_Zahl = 4; } if (Punkte_horizontal == 1 and Punkte_diagonal_R == 2) { Punkte_Zahl = 4; } if (Punkte_vertikal == 2 and Punkte_diagonal_L == 1) { Punkte_Zahl = 4; } if (Punkte_vertikal == 1 and Punkte_diagonal_L == 2) { Punkte_Zahl = 4; } if (Punkte_vertikal == 2 and Punkte_diagonal_R == 1) { Punkte_Zahl = 4; } if (Punkte_vertikal == 1 and Punkte_diagonal_R == 2) { Punkte_Zahl = 4; } if (Punkte_diagonal_L == 2 and Punkte_diagonal_R == 1) { Punkte_Zahl = 4; } if (Punkte_diagonal_L == 1 and Punkte_diagonal_R == 2) { Punkte_Zahl = 4; } // Kreuzung 2 x 2 Pixel = 5 Punkte ........................... if (Punkte_horizontal == 2 and Punkte_vertikal == 2) { Punkte_Zahl = 5; } if (Punkte_horizontal == 2 and Punkte_diagonal_L == 2) { Punkte_Zahl = 5; } if (Punkte_horizontal == 2 and Punkte_diagonal_R == 2) { Punkte_Zahl = 5; } if (Punkte_vertikal == 2 and Punkte_diagonal_L == 2) { Punkte_Zahl = 5; } if (Punkte_vertikal == 2 and Punkte_diagonal_R == 2) { Punkte_Zahl = 5; } if (Punkte_diagonal_L == 2 and Punkte_diagonal_R == 2) { Punkte_Zahl = 5; } // 3 Pixel = 6 Punkte ........................................ if (Punkte_horizontal == 3) { Punkte_Zahl = 6; } if (Punkte_vertikal == 3) { Punkte_Zahl = 6; } if (Punkte_diagonal_L == 3) { Punkte_Zahl = 6; } if (Punkte_diagonal_R == 3) { Punkte_Zahl = 6; } // Entscheidung .............................................. if (Punkte_Zahl > Best_Punkte) { Best_Punkte = Punkte_Zahl; Best_Reihe = Reihe; Best_Spalte = Spalte; } // Nichts gefunden ........................................... if (Best_Punkte == 0) { Best_Reihe = Reihe; Best_Spalte = Spalte; } } // Feldbewertung abgeschlossen ............................... } // Suche nach leeren Plätzen abgeschlossen ................... } } // komplette Durchsuchung abgeschlossen // Feld belegen ...................................................... Spielbrett [Best_Reihe][Best_Spalte] = 1; Spieler = 1; Cursor = 0; // Haben wir etwa gewonnen ? ......................................... Vier_in_Reihe (Best_Reihe, Best_Spalte, 4); } // Nach 4er-Kombination suchen -------------------------------------------- void Vier_in_Reihe (int PosReihe, int PosSpalte, int Wert) { int Summe = 0; Summe = Summe_Punkte_horizontal (PosReihe, PosSpalte-3); if (Summe == Wert) { Game_is_over = 1; } Summe = Summe_Punkte_horizontal (PosReihe, PosSpalte-2); if (Summe == Wert) { Game_is_over = 1; } Summe = Summe_Punkte_horizontal (PosReihe, PosSpalte-1); if (Summe == Wert) { Game_is_over = 1; } Summe = Summe_Punkte_horizontal (PosReihe, PosSpalte); if (Summe == Wert) { Game_is_over = 1; } Summe = Summe_Punkte_vertikal (PosReihe-3, PosSpalte); if (Summe == Wert) { Game_is_over = 1; } Summe = Summe_Punkte_vertikal (PosReihe-2, PosSpalte); if (Summe == Wert) { Game_is_over = 1; } Summe = Summe_Punkte_vertikal (PosReihe-1, PosSpalte); if (Summe == Wert) { Game_is_over = 1; } Summe = Summe_Punkte_vertikal (PosReihe, PosSpalte); if (Summe == Wert) { Game_is_over = 1; } Summe = Summe_Punkte_diagonal_L (PosReihe-3, PosSpalte-3); if (Summe == Wert) { Game_is_over = 1; } Summe = Summe_Punkte_diagonal_L (PosReihe-2, PosSpalte-2); if (Summe == Wert) { Game_is_over = 1; } Summe = Summe_Punkte_diagonal_L (PosReihe-1, PosSpalte-1); if (Summe == Wert) { Game_is_over = 1; } Summe = Summe_Punkte_diagonal_L (PosReihe, PosSpalte); if (Summe == Wert) { Game_is_over = 1; } Summe = Summe_Punkte_diagonal_R (PosReihe+3, PosSpalte-3); if (Summe == Wert) { Game_is_over = 1; } Summe = Summe_Punkte_diagonal_R (PosReihe+2, PosSpalte-2); if (Summe == Wert) { Game_is_over = 1; } Summe = Summe_Punkte_diagonal_R (PosReihe+1, PosSpalte-1); if (Summe == Wert) { Game_is_over = 1; } Summe = Summe_Punkte_diagonal_R (PosReihe, PosSpalte); if (Summe == Wert) { Game_is_over = 1; } } // ------------------------------------------------------------------------ int Summe_Punkte_horizontal (int R, int S) { int Summe = Spielbrett [R][S] + Spielbrett [R][S+1] + Spielbrett [R][S+2] + Spielbrett [R][S+3]; return Summe; } // ------------------------------------------------------------------------ int Summe_Punkte_vertikal (int R, int S) { int Summe = Spielbrett [R][S] + Spielbrett [R+1][S] + Spielbrett [R+2][S] + Spielbrett [R+3][S]; return Summe; } // ------------------------------------------------------------------------ int Summe_Punkte_diagonal_L (int R, int S) { int Summe = Spielbrett [R][S] + Spielbrett [R+1][S+1] + Spielbrett [R+2][S+2] + Spielbrett [R+3][S+3]; return Summe; } // ------------------------------------------------------------------------ int Summe_Punkte_diagonal_R (int R, int S) { int Summe = Spielbrett [R][S] + Spielbrett [R-1][S+1] + Spielbrett [R-2][S+2] + Spielbrett [R-3][S+3]; return Summe; }
|
Google-Suche auf MEINE-SCHALTUNG.de : |