
Quelle: Von Joho345 – Eigenes Werk, Gemeinfrei, https://commons.wikimedia.org/w/index.php?curid=2702136
Senso (im englischen Sprachraum Simon) ist ein von Ralph Baer – dem Entwickler der 1972 erschienenen ersten TV-Spielekonsole Magnavox Odyssey – und Howard J. Morrison entwickeltes und in mehreren Ländern patentiertes elektronisches Spiel, welches 1978 bei Miöton Bradley veröffentlicht wurde und sich besonders in den 1980er Jahren großer Beliebtheit erfreute, also genau in meiner Jugend. 1979 befand es sich auf der Auswahlliste zum Spiel des Jahres. Neuerdings wird das Spiel auch in Deutschland als Simon verkauft.
Spielidee
Senso kann allein oder mit mehreren Personen gespielt werden. Das Spiel besteht aus vier großen Feldern in den Farben Rot, Gelb, Grün und Blau. Diese leuchten abwechselnd auf und geben dabei für jede Farbe einen kurzen, individuellen Signalton von sich. Der Spieler muss sich diese Reihenfolge merken und sie nach Abschluss der Vorgabe durch das Spiel per Tastendruck wiederholen. Mit jeder Runde kommt eine weitere Farb-Ton-Kombination hinzu.
Genau dieses tolle Spiel habe ich mit Arduino umgesetzt. Hier der Schaltplan:

Das Arduino-Programm, welches ich komplett selbst geschrieben habe ohne KI-Unterstützung. Das muss man heute leider schon bei fast allen Dingen dazusagen. Auch dieses Programm hätte ich mir wohl binnen 30 sek von KIs erstellen lassen können, nur wollte ich das nicht. Denn ich möchte meine grauen Gehirnzellen noch selbst anstrengen und dann am Ende auch ein wenig stolz sein, wenn alles nach Plan funktioniert hat. Bei KI-Nutzung bleibt das Erfolgserlebnis dann wohl deutlich aus, denn worauf soll man dann stolz sein, außer auf den korrekten prompt?
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display. ACHTUNG: Adresse kann auch 0x3F sein !!!
// Anschlüsse:
// GND - GND
// VCC - 5V
// SDA - ANALOG Pin 4
// SCL - ANALOG pin 5
int speaker = 3;
int color_0_pin = 4;
int color_1_pin = 5;
int color_2_pin = 6;
int color_3_pin = 7;
int color_0_button = 8;
int color_1_button = 9;
int color_2_button = 10;
int color_3_button = 11;
int start_button = 12;
unsigned long currentTime;
unsigned long lastTime;
float period;
int colors[50];
int i,n;
boolean success;
// ===========================
// ======= SETUP =========
// ===========================
void setup()
{
Serial.begin(9600);
// initialize the used pins as an input or output:
// ===============================================
pinMode(speaker, OUTPUT);
pinMode(start_button, INPUT);
pinMode(color_0_button, INPUT);
pinMode(color_1_button, INPUT);
pinMode(color_2_button, INPUT);
pinMode(color_3_button, INPUT);
pinMode(color_0_pin, OUTPUT);
pinMode(color_1_pin, OUTPUT);
pinMode(color_2_pin, OUTPUT);
pinMode(color_3_pin, OUTPUT);
digitalWrite(color_0_pin, LOW);
digitalWrite(color_1_pin, LOW);
digitalWrite(color_2_pin, LOW);
digitalWrite(color_3_pin, LOW);
lcd.begin(); // initialize the lcd
lcd.backlight();
lcd.setCursor(0,0);
lcd.print(" retro ");
lcd.setCursor(0,1);
lcd.print(" Simon-game");
delay(3000);
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(" ");
n = 0;
i = 0;
}
// ========================
// ======= LOOP =========
// ========================
void loop ()
{
lcd.setCursor(0,0);
lcd.print("new game ");
lcd.setCursor(0,1);
lcd.print("button to start ");
while(digitalRead(start_button) == 0)
{
// waiting for start-button being pressed
}
lcd.setCursor(0,1);
lcd.print(" ");
// first creating 50 random integer numbers between 0 and 3
// ========================================================
for(i = 0; i <= 49; i++)
{
colors[i] = random(4);
}
// starting the game
// =================
for(n = 0; n <= 49; n++)
{
lcd.setCursor(0,0);
lcd.print("n = ");
lcd.print(n);
lcd.print(" ");
// playing the first n LEDs
// ========================
for(i = 0; i <= n; i++)
{
if(colors[i] == 0)
{
digitalWrite(color_0_pin, HIGH);
tone(speaker, 200);
}
if(colors[i] == 1)
{
digitalWrite(color_1_pin, HIGH);
tone(speaker, 400);
}
if(colors[i] == 2)
{
digitalWrite(color_2_pin, HIGH);
tone(speaker, 600);
}
if(colors[i] == 3)
{
digitalWrite(color_3_pin, HIGH);
tone(speaker, 800);
}
delay(500);
digitalWrite(color_0_pin, LOW);
digitalWrite(color_1_pin, LOW);
digitalWrite(color_2_pin, LOW);
digitalWrite(color_3_pin, LOW);
noTone(speaker);
delay(200);
}
// now it's the player's turn...
// =============================
for(i = 0; i <= n; i++)
{
success = 0;
while(success == 0)
{
if(digitalRead(color_0_button) == 1 && colors[i] == 0) // red button pressed and success
{
tone(speaker, 200);
delay(400);
noTone(speaker);
success = 1; // right color
}
if(digitalRead(color_0_button) == 1 && colors[i] != 0) // red button pressed and failure
{
tone(speaker, 50);
delay(600);
noTone(speaker);
return; // wrong color
}
if(digitalRead(color_1_button) == 1 && colors[i] == 1) // yellow button pressed and success
{
tone(speaker, 400);
delay(400);
noTone(speaker);
success = 1; // right color
}
if(digitalRead(color_1_button) == 1 && colors[i] != 1) // yellow button pressed and failure
{
tone(speaker, 50);
delay(600);
noTone(speaker);
return; // wrong color
}
if(digitalRead(color_2_button) == 1 && colors[i] == 2) // green button pressed and success
{
tone(speaker, 600);
delay(400);
noTone(speaker);
success = 1; // right color
}
if(digitalRead(color_2_button) == 1 && colors[i] != 2) // green button pressed and failure
{
tone(speaker, 50);
delay(600);
noTone(speaker);
return; // wrong color
}
if(digitalRead(color_3_button) == 1 && colors[i] == 3) // blue button pressed and success
{
tone(speaker, 800);
delay(400);
noTone(speaker);
success = 1; // right color
}
if(digitalRead(color_3_button) == 1 && colors[i] != 3) // blue button pressed and failure
{
tone(speaker, 50);
delay(600);
noTone(speaker);
return; // wrong color
}
}
// i-th color success
}
// every n colors success
delay(500);
// n++, one more color added...
}
lcd.setCursor(0,0);
lcd.print("congratulations ");
lcd.setCursor(0,1);
lcd.print("defeated Simon ");
delay(3000);
}
Die Teile habe ich bei meinen einzigen örtlichen Elektronikgeschäft (https://www.neuhold-elektronik.at/) besorgt. Bin so froh, dass es dieses Geschäft (noch) gibt…



Da es nur rote und blaue Taster gab, habe ich auch noch färbiges Klebeband besorgt und zwei der vier Taster mit einem gelben bzw. grünen Kreis versehen:

Ist zwar nicht perfekt, aber ich werde es nicht ändern:

Gelötet wird immer im Wohnzimmer auf meinem professionellen Plastiktisch in Kombination mit dem 10 Euro Conradlötkolben 😉


Das fertige Spiel:





Zum Start des Spiels muss man den rechten kleinen Taster betätigen:

Dann spielt der Arduino die zufällige Ansteuerung der 4 LEDs ab, wobei nach jeder erfolgreichen Runde eine weitere LED dazu kommt. Jede der vier Farben wird von einem Ton unterschiedlicher Tonhöhe begleitet…

Auf dem Display erscheint die Anzahl der bisher erfolgreich überstandenen Runden:

An diesem Projekt habe ich einen ganzen Tag gearbeitet, aber es hat sich mMn ausgezahlt. Denn man lernt durchs Programmieren logisch und strukturiert zu denken und am Ende hat man neben dem Erfolgserlebnis ein tolles Spiel, welches die Konzentration fördert. Das ganze Projekt eignet sich hervorragend für ein Schulprojekt oder eine praktische Abschlussarbeit zum Thema Arduino oder Computerspiele. Gekostet hat es mich in Summe um die 18 Euro, also nicht sehr viel, sodass es sich auch arme Schüler problemlos leisten können 😉
Das Youtube-short liefere ich wie immer nach…
