Wie man ein Würfel programmiert

Hallo,
ich komme in meinem Projekt Mensch ärger dich nicht mit digitalem Würfel nicht weiter. Ich möchte ein Programm schreiben indem es 4 Taster gibt und ein TFT 1,77" in der Mitte. Nun soll zu beginn des Spieles auf dem Display angezeigt werden "das Spiel beginnt, drücke einen beliebigen Taster". Vor beginn blinken alle Taster bis eben einer gedrückt wird. Dieser beginnt nun zu würfeln. Jeder würfelt am Anfang einmal und derjenige, der die höchste Zahl hat beginnt. Dem entsprechend leuchtet auch die jeweilige Farbe, die den größten Wert gewürfelt hat. Alle anderen Farben gehen aus. Immer im Uhrzeigersinn nach und nach beginne die Taster zu leuchten. Je nachdem wer halt gerade an der Reihe ist. Nach dem Würfeln einer 6 darf man erneut würfeln.

Ich habe bisher mit der library Adafruit_GFX und Adafruit_ST7735.h.

Leider hast du vergessen zu sagen, welche Probleme du bei dem Bau deines endlichen Automaten hast.

...und da endet er mitten im Satz bei der Problembeschreibung, wo es gerade hängt, wie weit das bisherige Programm schon gediehen ist und welche Form von Hilfe oder Ratschlägen benötigt wird :wink:

Hallo,

ok .. Programm ist Software ... Taster und TFT Hardware .... die Hardware bekommst Du nicht in die Software rein. Anders herum geht es schon wenn die Hardware einen Speicher hat. Aber ich weiß schon was Du vorhast. :wink:

Das wird ein bisschen aufwendiger, also fang doch einfach mal an Deinen Ablaufplan im Kopf ein bisschen zu verfeinern und wichtig, ganz am Anfang , zunächst in Teilaufgaben zu zerlegen. Also wie Überschriften für Kapitel in einem Buch. Aus jedem Kapitel kannst Du dann später eine Funktion machen. Ansonsten wird es ein Spagetti-Code. Dann verfeinerst Du den Inhalt der einzelnen Kapitel. Dazu schreibst Du zunächst mal untereinander was in dem Kapitel passieren soll, also einen Ablaufplan erstellen. Wenn Du das gründlich genug gemacht hast kannst Du, mit ein bisschen Übung, aus fast jeder Textzeile eine Codezeile machen.

Zwei Hinweise noch Zufallszahlen erzeugen ist recht einfach und Du willst eine Statemaschine oder Ablaufsteuerung bauen.

So, Mensch ärgere Dich nicht, das Du jetzt kein fertiges Programm bekommen hast. Du kannst aber auch noch mal selbst suchen Google liefert mir Ungefähr 177.000 Ergebnisse (0,27 Sekunden) für die Suche nach "Arduino elektronischer Würfel"

Was ist, wenn weniger als vier Spieler spielen? Da fehlt noch etwas im Lastenheft….

Allerdings gibt es nur Beispielprogramme in denen ein Würfel mit LED´s dargestellt sind. Und ich hab das ja auf dem TFT.

Ich hab bisher schon für einen Taster das dieser Blink und auf dem Display ein Text angezeigt wird aber wenn dieser anfängt zu zählen gibt es auch zusätzlich keine gute Auflösung. Und bei einem Testprogramm beim Hersteller schon.

Vermutlich meinst du, du hättest die Aufgabe komplett beschrieben.
Das ist leider, selbst wenn jeder schonmal gewürfelt hat, nicht der Fall.

Ein beleuchteter Taster sind übrigens zwei Sachen: Ein Taster und eine Anzeige-LED. Willst du eine, deren Farbe du einstellen kannst, wären es jeweils genau genommen 3 LED.
Da wären weiße LED und farbige Taster in den üblichen Farben einfacher.

Das Würfel-Ergebnis willst du vermutlich auf dem Display darstellen, bis der nächste Taster gedrückt ist.

Die Auswahl des ersten Spielers erfolgt nur einmal nach RESET?
Und was ist, wenn "die höchste Zahl" nicht eindeutig ist?

Einfacher wäre es, wenn du das statt durch 4 Würfel durch eine einfache Zufallsentscheidung festlegen würdest.
Willst du auch mal zu dritt spielen?
Vorschlag: Die Spieler drücken "gleichzeitig" ihre Taste und lassen dann los. (Diese Zeit ist ein guter Randomseed - Wert) Per Zufall leuchtet dann eine der Tasten und das Spiel beginnt.

Das kann doch kein KO Kriterium sein.

das heisst Du musst die Stellen an denen die LED ein und ausgeschaltete werden ersetzen durch
display.print("Text").

Ich hätte 6 Grafiken mit den Augen gemacht und die jeweilige passende Grafik ausgegeben.

@rangerpower
Eigentlich ist das ein schönes Projekt, dem man sich langsam und in kompletten Funktionen nähern kann.

  • Anzahl Spieler auswählem

  • Würfeln auf Tastendruck

  • ersten Spieler auswählen

  • Würfeln auf Tastendruck

  • Bei 6 selber Spieler -> sonst nächster Spieler

  • Würfeln auf Tastendruck

  • Ende / Neustart auslösen

Das geht als Schrittkette und nur mit dem Seriellen Monitor.
Wenn Du das hast, dann kannst Du dazu die Grafiken integrieren.

Hallo
Eventuell kann die Lib auch Kreise zeichnen. Die dann je nach Ergebniss unter Angabe der Position zeichnen lassen.

Gruß Heinz

Programmtechnisch nicht wirklich ein Problem.

Hardware-Technisch wird es ein optisches. Grund : Das TFT ist einfach zu langsam um gescheite Bewegungen darzustellen. Weiß ich aus eigener Erfahrung.

Es gibt 2 Alternative Lösungen.

1.) Du zeigst nur Wert an.
2.) Du simulierst einen Elektronische Würfen mit 7 LEDs. Wenn man das schön programmiert, ist das spannender da man den Würfel ausrollen lassen kann. (Springt die LED noch einmal um oder nicht).

Das Ergebnis zeigst du dann zusätzlich auf den Display an. Mit ein bisschen Fantasie kannst du dann noch Statisik-Spielchen machen, und auch ein Teil der Regeln kontrollieren.
3 x würfeln bis zu 6 zu.b. beim Start.

Da würden mir viele Ideen einfallen. Sogar einen "Mensch ärger dich nicht" Computer (ähnlich eines Schachcomputer).

Gruß

Pucki

Einen groben Rahmen kann ich von einem anderen Projekt hier präsentieren. Das Programm
wurde auf ein TFT und Spielerfarben angepasst.

Die Auswahl von Spielern ist noch nicht programmiert. Auch sind keine LEDs implementiert.

Lediglich eine Spielerklasse, die eine Spielerfarbe, einen Würfelwert und eine Summe der Würfelwerte aufnehmen kann. Das Array "playerSelect" zeigt beispielhaft, wie eine Auswahl an Spieleranzahl (Anzahl der Elemente) und Spielerfarbe (Elementwert) aussehen kann. Hier ist das allerdings der Einfachheit halber noch fest verdrahtet. Bei einem Auswahlprozess muss das Array entweder dynamisch erzeugt werden oder an einer bestimmten Elementposition einen Wert erhalten, der als "Stoppwert" interpretiert werden kann.

Es wird bei jedem Tastendruck eine Würfelanimation und natürlich am Ende der Würfelwert angezeigt. Die Rahmenfarbe zeigt an, welche Farbe als nächstes mit dem Würfeln dran ist.
Wurde eine sechs gewürfelt, wechselt die Rahmenfarbe (der Spieler) nicht.

Da bei Wokwi das genannte Display nicht zur Verfügung steht, wurde ein ILI9343 Display verwendet. Zum Anpassen an das genannte Display muss gemäß der genannten Adafruit Bibliothek die passende Klasse für das Display ausgewählt und die Displaykoordinaten angepasst werden, die den Displaymethoden übergeben werden. Für die Würfelaugen sind die Koordinaten im Array vom Typ "DicePip" abgelegt.

Der Code und die Simulation:

Vielleicht hilft es weiter für die nächsten Schritte.

Das ist eine gute Idee. Und ja ich habe mir überlegt wenn ich erst einmal ein "Basic" Würfel-Programm habe, hätte ich es ausgebaut.
Aber als Anfänger ein Basic Programm aufzubauen ist nicht gerade sehr leicht.

Das wären meine Angelegten Pins:

# include "Adafruit_GFX.h"
 # include "Adafruit_ST7735.h"
 # define TFT_PIN_CS  10   
 # define TFT_PIN_DC   9 
 # define TFT_PIN_RST  8  
 Adafruit_ST7735 tft = Adafruit_ST7735(TFT_PIN_CS, TFT_PIN_DC, TFT_PIN_RST); 

 const int lamp1 = 4;
 const int lamp2 = 5;
 const int lamp3 = 6;
 const int lamp4 = 7;

 const int taster1 = A0;
 const int taster2 = A1;
 const int taster3 = A2;
 const int taster4 = A3;

 int tast1;
 int tast2;
 int tast3;
 int tast4;
 bool start;
 bool wuerfeltext;
 int sr;
 int ledState = LOW;
 long randNumber;
 unsigned long previousMillis = 0;
 const long interval = 500;

Was willst du damit sagen?

Du brauchst für einen Würfel 7 (sieben) Lampen. Alternativ kreise.

Ich persönlich würde das (wenn LEDs) mit einem PCF8574 machen.

Dazu weise ich den 6 Zahlen der jeweiligen Bitreihe zu, die man braucht um die passenden LEDs einzuschalten.

Diese Folge sende ich direkt an den PCF8574.

Fast fertig. Weil funktioniert ist aber hässlich.

Ergo eine Schleife mit viel delay. Dann werden zufällige Zahlen an den Würfel gesendet, er blinkt . Mit einem steigenden extra-Delay hört der Würfel langsam auf zu laufen. Und das ist fertig und zeigt das Ergebnis (letzter Wert) an.

Sollte ich das auf den Display machen, ist es das selbe. Nur sende ich nicht an den PCF8574, sondern an eine passende Grafikroutine die dann die passenden Kreise zeichnet.

Am einfachsten geht das, wenn man die ganzen Bit-Deklarationen in ein Array macht.

Gruß

Pucki

So ... mittlerweile hab ich ein Programm bei dem am Anfang die Startsequenz abgespielt wird. Danach blinken die LED´S und es muss ein Taster gedrückt werden, damit der erste Spieler würfeln kann.
Und an dieser Stelle komme ich nun nicht mehr weiter:
Jetzt soll jeder Spieler einmal Würfeln und damit wird auch die Spielerreihenfolge bestimmt. Danach soll immer der Spieler 1 etc dran stehen mit der jeweiligen gewürfelten Zahl.
Anschließend soll der mit der höchsten Zahl, anfangen zu Würfeln. Dabei soll auch der Spieler der die höchste Zahl hatte, auch der jeweilige Taster leuchten.

Hier ist mein bisheriges Programm:

# include "Adafruit_GFX.h"
 # include "Adafruit_ST7735.h"
 # define TFT_PIN_CS  10   
 # define TFT_PIN_DC   9 
 # define TFT_PIN_RST  8  
 Adafruit_ST7735 tft = Adafruit_ST7735(TFT_PIN_CS, TFT_PIN_DC, TFT_PIN_RST); 
 const int lamp1 = 4; //(gruen)
 const int lamp2 = 5; //(gelb)
 const int lamp3 = 6; //(blau)
 const int lamp4 = 7; //(rot)
 int taster1 = A0;
 int taster2 = A1;
 int taster3 = A2;
 int taster4 = A3;
 int tast1;
 int tast2;
 int tast3;
 int tast4;
 long randNumber;
 int start;
 int warten;
 int Spieler1;
 int Spieler2;
 int Spieler3;
int Spieler4;

void setup()
{
  warten = 0;
  start = 1;
  tft.initR(INITR_BLACKTAB);
  tft.setRotation(3);
  tft.setCursor(0,0);
  tft.setTextSize(2);
  tft.setTextColor(ST77XX_WHITE);
  tft.fillScreen(ST77XX_BLACK);
  Serial.begin(9600);
  randomSeed(analogRead(4));
  pinMode(lamp1, OUTPUT);
  pinMode(lamp2, OUTPUT);
  pinMode(lamp3, OUTPUT);
  pinMode(lamp4, OUTPUT);
  Spieler1 = 0;
  Spieler2 = 0;
  Spieler3 = 0;
  Spieler4 = 0;
}
void loop()
{
    tast1 = analogRead(taster1);
    tast2 = analogRead(taster2);
    tast3 = analogRead(taster3);
    tast4 = analogRead(taster4);
    tast1 = map(tast1,0,1023,0,1);
    tast2 = map(tast2,0,1023,0,1);
    tast3 = map(tast3,0,1023,0,1);
    tast4 = map(tast4,0,1023,0,1);
    

 if(start == 1)
  {
   tft.print("Wilkommen    beim Spiel   Mensch       aerger dich  nicht. ");
   delay(300); 
   tft.fillScreen(ST77XX_BLACK);
   delay(300);
   tft.setCursor(0,0);
   tft.print("Lasset die   Spiele       beginnen;)");
   delay(300);
   tft.fillScreen(ST77XX_BLACK);
   delay(300);
   tft.setCursor(0,0);
   tft.print("Druecke einenbeliebigen   Taster um zu beginnen.");
   delay(300);
   warten = 1;
   start = 0;
   warten = 0;
  }

 if(tast1 == HIGH || tast2 == HIGH || tast3 == HIGH || tast4 == HIGH)
  { 
  
    tft.fillScreen(ST77XX_BLACK);
    randNumber = random(7);
    tft.setCursor(70,60);
    tft.print(randNumber);
    delay(2000);
    tft.fillScreen(ST77XX_BLACK);
    tft.setCursor(0,0);
    delay(300);
    digitalWrite(lamp1, LOW);
    digitalWrite(lamp2, LOW);
    digitalWrite(lamp3, LOW);
    digitalWrite(lamp4, LOW);
    delay(300);
    warten = 0;
  } 
 
 if(tast1 == HIGH && tast2 == LOW && tast3 == LOW && tast4 == LOW);
  { 
   tft.fillScreen(ST77XX_BLACK);
   tft.setCursor(0,0);
   tft.print("Spieler1");
   tft.print(randNumber);
   delay(300);
  }

 if(tast1 == LOW && tast2 == HIGH && tast3 == LOW && tast4 == LOW);
  { 
   tft.fillScreen(ST77XX_BLACK);
   tft.setCursor(0,0);
   tft.print("Spieler2");
   tft.print(randNumber);
   delay(300);
  }

 if(tast1 == LOW && tast2 == LOW && tast3 == HIGH && tast4 == LOW);
  { 
   tft.fillScreen(ST77XX_BLACK);
   tft.setCursor(0,0);
   tft.print("Spieler3");
   tft.print(randNumber);
   delay(300);
  }

 if(tast1 == LOW && tast2 == LOW && tast3 == LOW && tast4 == HIGH);
  { 
   tft.fillScreen(ST77XX_BLACK);
   tft.setCursor(0,0);
   tft.print("Spieler4");
   tft.print(randNumber);
   delay(300);
  }




  int warten = 1;
  {
  digitalWrite(lamp1, HIGH);
  digitalWrite(lamp2, HIGH);
  digitalWrite(lamp3, HIGH);
  digitalWrite(lamp4, HIGH);
  delay(300);
  digitalWrite(lamp1, LOW);
  digitalWrite(lamp2, LOW);
  digitalWrite(lamp3, LOW);
  digitalWrite(lamp4, LOW);
  delay(300);
  warten = 0;
  }

}`Verwende dieses Symbol um Code zu posten`

.

So ist der Code nicht lesbar.

bitte lies im Forum how to nach wie man hier Code postet:

und dann editiere deinen Post und setzte den Code in Code Tags.

Warum analogRead für ein digitales Signal?