Schere Stein Papier mit Taster

Hallo,
ich möchte ein Schere stein papier spiel mit taster programmieren und mit random, verstehe allerdings nicht, wie ich den taster mit random in verbindung bringen muss

Schön, dann mach das doch.

Gruß Tommy

Hallo,

Hast Du schon herausbekommen wie man eine LED in Verbindung zu einem Taster bringt ?

Vorschlag schreib mal für dich ein Ablauf wie das funktionieren soll . Wenn Du das fein genug machst kannst du fast jede Textzeile in code umsetzen. Ich kenn das Spiel nicht.

Heinz

(deleted)

technikerguru:
Hallo,
ich möchte ein Schere stein papier spiel mit taster programmieren und mit random, verstehe allerdings nicht, wie ich den taster mit random in verbindung bringen muss

Aber vorher repariere oder wechsel deine Tastatur.
Da ist die Shifttaste defekt. So wird das nix mit sauberem Code.

Also Du willst gegen den Arduino spielen und der soll seine Wahl, anders als ein menschlicher Gegenspieler zufällig treffen.

  1. Zufallszahl 0 bis 2
  2. 3 Taster einlesen.
    Taster 0, 1 und 2. (zB Schere Stein Papier).

Dann mittels Einiger if's kontrollieren wer gewonnen hat
Die beiden Ausswahl und das Ergebnis dann anzeigen. Es können zB 8 LED sein. 3 für Steil Schere Papier und 1 für den Sieger.
zB Alle LED Blinken wartet auf Deine Wahl für die neue Runde.

Grüße Uwe

(deleted)

Peter-CAD-HST:
noch sein konstruktiver Beitrag :o

'serial' was not declared in this scope

Immerhin bezieht sich HotSystems auf beliebte Anfängerfehler.

In meinen Augen durchaus konstruktiver als #6.

Gruß Fips

hat mich jetzt interessiert.
Nach etwas Wikipedia lesen, ist es natürlich nicht bei einem reinen Zufall geblieben…

/*
  by noiasca
  https://forum.arduino.cc/index.php?topic=680155.0
*/

enum {SCHERE, PAPIER, STEIN};
const char *zeichen[] {"Schere", "Papier", "Stein"};

uint16_t aSiege;            // die Siege von Spieler A == Niederlagen von Spieler B
uint16_t aNiederlagen;      // die Niederlagen von Spieler A == Siege von Spieler B
uint16_t aUnentschieden;    // die Unentschieden
uint16_t aZeichen[3];       // die gewählten Zeichen von Spieler A
uint16_t bZeichen[3];       // die gewählten Zeichen von Spieler B

byte buttonPin[] = {A0, A1, A2};

byte a = random(0, 3);      // die aktuelle Auswahl von Spieler A
byte b = random(0, 3);      // die aktuelle Auswahl von Spieler B

int8_t result (byte a, byte b)  // a1  u0  b-1
{
  if (a == SCHERE)
  {
    if (b == SCHERE) return 0;
    if (b == PAPIER) return 1;
    if (b == STEIN) return -1;
  }
  if (a == PAPIER)
  {
    if (b == SCHERE) return -1;
    if (b == PAPIER) return 0;
    if (b == STEIN) return 1;
  }
  if (a == STEIN)
  {
    if (b == SCHERE) return 1;
    if (b == PAPIER) return -1;
    if (b == STEIN) return 0;
  }
  return 0;
}

byte ki(byte me, byte he)
{
  byte strategy = random (0, 2); // 50:50 Aufteilung der Strategie
  if (strategy == 0)           
    return random(0, 3);         // reiner Zufall
  else
    return lawOfEffect(me, he);  // Versuch das Ergebnis zu verbessern
}

byte lawOfEffect(byte me, byte he)
{
  //Nimm nach einem Unentschieden die nächsttiefere Spielfigur,
  //nimm nach einem Sieg die Spielfigur, die der Gegner gewählt hatte,
  //nimm nach einer Niederlage die nächsthöhere Spielfigur als die, die der Gegner gewählt hatte.
  switch (result(me, he))
  {
    case 0 :
      if (me == SCHERE) return PAPIER;
      if (me == PAPIER) return STEIN;
      if (me == STEIN) return SCHERE;
      break;
    case 1 :
      return he;
      break;
    case -1 :
      if (he == SCHERE) return STEIN;
      if (he == PAPIER) return SCHERE;
      if (he == STEIN) return PAPIER;
  }
  return (random(0, 3));
}

void oneMatch()
{
  static byte previousA = a;
  static byte previousB = b;
  // Computer wählen lassen
  //b = random(0, 3);  // reiner Zufall
  b = ki(previousB, previousA);  // mit etwas Intelligenz
  Serial.println(F("Computer hat gewählt"));
  // Eingabe abwarten
  Serial.println(F("Zeichen wählen"));
  while (digitalRead(buttonPin[0]) == HIGH && digitalRead(buttonPin[1]) == HIGH && digitalRead(buttonPin[2]) == HIGH);
  {
    for (byte i = 0; i < sizeof(buttonPin); i++)
    {
      if (digitalRead(buttonPin[i]) == LOW) a = i;
    }
  }
  //Serial.print (F("gewählt ")); Serial.println(zeichen[a]);
  delay(50); // dirty delay debounce
  while (digitalRead(buttonPin[0]) == LOW || digitalRead(buttonPin[1]) == LOW || digitalRead(buttonPin[2]) == LOW);  // wait for Button release
  {}

  // Berechnen
  int8_t ergebnis = result(a, b);

  if (ergebnis == 1)
  {
    aSiege++;
  }
  else if (ergebnis == -1)
  {
    aNiederlagen++;
  }
  else
  {
    aUnentschieden++;
  }
  aZeichen[a]++;
  bZeichen[b]++;
  previousA = a;
  previousB = b;

  // Ausgeben Ergebnis
  Serial.print (zeichen[a]); Serial.print("\t");
  Serial.print (zeichen[b]); Serial.print("\t");
  Serial.print (ergebnis);
  Serial.println();
  switch (ergebnis)
  {
    case 1:
      Serial.println(F("gewonnen"));
      break;
    case 0:
      Serial.println(F("unentschieden"));
      break;
    default:
      Serial.println(F("verloren"));
  }

  // Ausgeben Statistik
  Serial.println(F("\ngewählte Zeichen"));
  Serial.println(F("\tA\tB"));
  for (byte i = 0; i < 3; i++)
  {
    Serial.print (zeichen[i]); Serial.print("\t");
    Serial.print (aZeichen[i]); Serial.print("\t");
    Serial.print (bZeichen[i]);
    Serial.println();
  }
  Serial.print(F("A Siege         ")); Serial.println(aSiege);
  Serial.print(F("A Niederlagen   ")); Serial.println(aNiederlagen);
  Serial.print(F("A Unentschieden ")); Serial.println(aUnentschieden);
  Serial.println();
}

void setup() {
  Serial.begin(115200);
  Serial.println(F("\nStart"));
  randomSeed(analogRead(A3));
  for (auto &i : buttonPin)
    pinMode(i, INPUT_PULLUP);
}

void loop() {
  oneMatch();
}

gibt in etwa sowas aus:

Computer hat gewählt
Zeichen wählen
Papier	Schere	-1
verloren

gewählte Zeichen
	A	B
Schere	26	23
Papier	26	26
Stein	26	29
A Siege         26
A Niederlagen   23
A Unentschieden 29

Peter-CAD-HST:
noch sein konstruktiver Beitrag :o

Hört auf mit diesen unnützen Beiträgen auf unnütze Beiträge.

Ich verstehe daß wir alle zuhause herumsitzten und und selbst auf die Nerven gehen, abgesehen von Nachbarn, Vögeln, Sonne, Regen, Nicht Sonne, Partner, Kinder, Haustiere, Arduino-Forum-User und Arduino-Projekte die partou nicht so wollen wie sie sollen.

Ich wünsche mal einen schönen Sonntag.
Grüße Uwe.

uwefed:
Ich wünsche mal einen schönen Sonntag.
Grüße Uwe.

Hallo Uwe,
das wünsche ich auch.

und mit random, verstehe allerdings nicht, wie ich den taster mit random in verbindung bringen muss

z.B. so:
Beim ersten, nur beim ersten, Tastendruck millis() als Random Seed setzen.

Ist dieses ein unnützer Beitrag?

(deleted)

Nach etwas Wikipedia lesen, ist es natürlich nicht bei einem reinen Zufall geblieben.

Wieso? Und wieso natürlich?
Da du die Strategie des Computers kennst, hat er (der Computer) einen Nachteil, wenn er überhaupt eine Strategie verfolgt. Und wenn der Computer random spielt, nutzt dir eine eigene Strategie auch nichts, und das beste was du schaffen kannst, ist 50:50, indem du irgendwas (oder auch random) spielst.

KI wäre, wenn der Computer deine (dir evtl. selbst unbewusste) Strategie erkennt. Dazu fehlen einem Arduino allerdings die Ressourcen.
Echte Intelligenz wäre, rauszukriegen, was jemand anderes einem Arduino einprogrammiert hat, weil der signifikant oft gewinnt, aber vermutlich nicht mogelt :slight_smile:

Aber die eigentliche Fragestellung ist hier ja nur, "wie man Taster mit LED verbindet". Da hat nach meinem Geschmack Uwes Vorschlag eine LED zu wenig. (LED AUS für "verloren" ist etwas wenig Rückmeldung, finde ich)

KI wäre, wenn der Computer deine (dir evtl. selbst unbewusste) Strategie erkennt. Dazu fehlen einem Arduino allerdings die Ressourcen.

Suchtipp: "kendryte k210 cnn"
Sind dessen Ressourcen ausreichend?

Im Eingangspost steht nichts von LED

Richtig. (+++)
Die Aufgabe ist “Mensch (Taster) gegen Random”
Serial ist für eine Beispiel-Lösung besser, weil weniger Externes.
Wenn man allerdings ein Kästchen mit 3 Tastern bastelt, passen ein paar LED vom Design her ganz gut dazu.

@combie: Du willst mir das zeigen?
Sehr schön, aber kein “Arduino”.

michael_x:
@combie: Du willst mir das zeigen?
Sehr schön, aber kein "Arduino".

Naja...
Immerhin irgendwie Arduino kompatible.

Es kann sich nur um Jahre handeln, bis Arduino selber so ein Board raus bringt.