speichen und neues signal ausgeben

Hallo Leute,
ich habe seid einigen Tagen versucht mit dem Arduino Micro ein TicTacToe spiel zu entwickeln. Ich habe hierfür 2 taster benutzt und 9 duo leds. Mit dem einen Taster sollte sowohl rot als auch grün geschaltet werden und mit dem anderen Taster das signal gesetzt werden. Ich habe so einige schwierigkeiten da ich mich nicht sehr mit dem programm auskenne. Ich habe bereits geschaft, das jedes signal in einer reihe auszugeben aber weis nicht wie ich das signal ausgeben soll und gleichzeitig ein anderes beginnen kann. D.h. rot setzt und sobald es gesetzt ist startet das signal für den grünen. Ich habe, da ich nicht weiter wusste für den einen taster (rot) und für den anderen taster (grün) benutzt. kann mir das villt einer genauer erklären.
Danke

hier ist der code...

 const int buttonPin = 2;
const int setbuttonPin = 13;
int roteleddurchschalten1;
int grueneleddurchschalten1;
//ledPin red LED
const int ledpin = 9;
const int ledpin2 = 11;
const int ledpin3 = A1;
const int ledpin4 = 3;
const int ledpin5 = 1;
const int ledpin6 = A5;
const int ledpin7 = 5;
const int ledpin8 = 7;
const int ledpin9 = A3;
//gledPin green LED
const int gledpin = 10;
const int gledpin2 = 12;
const int gledpin3 = A0;
const int gledpin4 = 4;
const int gledpin5 = 0;
const int gledpin6 = A4;
const int gledpin7 = 6;
const int gledpin8 = 8;
const int gledpin9 = A2;

int buttonState = 0;        
int buttonPushCounter = 0;  
int lastButtonState = 0;

int setbuttonstate = 0;
int lastsetbuttonstate = 0;
int setbuttonpushcounter = 0;
//************************************************************************************************
void setup() {
  //rote leds
  pinMode(ledpin,OUTPUT);
  pinMode(ledpin2, OUTPUT);
  pinMode(ledpin3, OUTPUT);
  pinMode(ledpin4,OUTPUT);
  pinMode(ledpin5, OUTPUT);
  pinMode(ledpin6, OUTPUT);
  pinMode(ledpin7,OUTPUT);
  pinMode(ledpin8, OUTPUT);
  pinMode(ledpin9, OUTPUT);
  //grüne leds
  pinMode(gledpin,OUTPUT);
  pinMode(gledpin2, OUTPUT);
  pinMode(gledpin3, OUTPUT);
  pinMode(gledpin4,OUTPUT);
  pinMode(gledpin5, OUTPUT);
  pinMode(gledpin6, OUTPUT);
  pinMode(gledpin7,OUTPUT);
  pinMode(gledpin8, OUTPUT);
  pinMode(gledpin9, OUTPUT);
  //input pins
  pinMode(buttonPin, INPUT);
  pinMode(setbuttonPin, INPUT);
}
//************************************************************************************************
void loop() {
  buttonState = digitalRead(buttonPin);
  
  if (buttonState != lastButtonState) {
    if (buttonState == HIGH){
      buttonPushCounter++;
      } }
    lastButtonState = buttonState;
    
    setbuttonstate = digitalRead(setbuttonPin);
    if (setbuttonstate != lastsetbuttonstate){
      if (setbuttonstate == HIGH){
        setbuttonpushcounter++;
        } }
        lastsetbuttonstate = setbuttonstate;
/*********************************************************/
  //grüne led durschalten
  if (setbuttonpushcounter == 1) {
    digitalWrite(gledpin, HIGH);
    }
    else {
      digitalWrite(gledpin, LOW);
    }  
  if (setbuttonpushcounter == 2) {
    digitalWrite(gledpin2, HIGH);
    }
    else {
      digitalWrite(gledpin2, LOW);
      }
   if (setbuttonpushcounter == 3) {
    digitalWrite(gledpin3, HIGH);
    }
    else {
      digitalWrite(gledpin3, LOW);
      }
  if (setbuttonpushcounter == 4) {
    digitalWrite(gledpin4, HIGH);
    }
    else {
      digitalWrite(gledpin4, LOW);
      }
  if (setbuttonpushcounter == 5) {
    digitalWrite(gledpin5, HIGH);
    }
    else {
      digitalWrite(gledpin5, LOW);
      }
  if (setbuttonpushcounter == 6) {
    digitalWrite(gledpin6, HIGH);
    }
    else {
      digitalWrite(gledpin6, LOW);
      }
  if (setbuttonpushcounter == 7) {
    digitalWrite(gledpin7, HIGH);
    }
    else {
      digitalWrite(gledpin7, LOW);
      }
  if (setbuttonpushcounter == 8) {
    digitalWrite(gledpin8, HIGH);
    }
    else {
      digitalWrite(gledpin8, LOW);
      }  
  if (setbuttonpushcounter == 9) {
    digitalWrite(gledpin9, HIGH);
    }
    else {
      digitalWrite(gledpin9, LOW);
      }
  if (setbuttonpushcounter == 10) {
    setbuttonpushcounter = 0;
    }
/***************************************************/
    //rote led durchschalten
    if (buttonPushCounter == 1) {
    digitalWrite(ledpin, HIGH);
    }
    else {
      digitalWrite(ledpin, LOW);
    }   
   if (buttonPushCounter == 2) {
    digitalWrite(ledpin2, HIGH);
    }
    else {
      digitalWrite(ledpin2, LOW);
      }
   if (buttonPushCounter == 3) {
    digitalWrite(ledpin3, HIGH);
    }
    else {
      digitalWrite(ledpin3, LOW);
      }   
  if (buttonPushCounter == 4) {
    digitalWrite(ledpin4, HIGH);
    }
    else {
      digitalWrite(ledpin4, LOW);
      }
  if (buttonPushCounter == 5) {
    digitalWrite(ledpin5, HIGH);
    }
    else {
      digitalWrite(ledpin5, LOW);
      }
  if (buttonPushCounter == 6) {
    digitalWrite(ledpin6, HIGH);
    }
    else {
      digitalWrite(ledpin6, LOW);
      }
  if (buttonPushCounter == 7) {
    digitalWrite(ledpin7, HIGH);
    }
    else {
      digitalWrite(ledpin7, LOW);
      }
  if (buttonPushCounter == 8) {
    digitalWrite(ledpin8, HIGH);
    }
    else {
      digitalWrite(ledpin8, LOW);
      }  
  if (buttonPushCounter == 9) {
    digitalWrite(ledpin9, HIGH);
    }
    else {
      digitalWrite(ledpin9, LOW);
      }
  if (buttonPushCounter == 10) {
    buttonPushCounter = 0;
    }
//***********************************************************************************************
}

Hello and welcome,

Please translate to english or post in the german forum :wink:

bahzinga:
ich habe seid einigen Tagen versucht mit dem Arduino Micro ein TicTacToe spiel zu entwickeln.
...
Ich habe so einige schwierigkeiten da ich mich nicht sehr mit dem programm auskenne.

Wie kommst Du dazu, "ein TicTacToe spiel zu entwickeln"?

Wie willst Du überhaupt ein Brettspiel entwickeln, wenn es in Deinen Datenstrukturen kein Spielfeld gibt, bei TicTacToe zum Beispiel ein 3x3 Felder großes Spielfeld:

byte board[3][3];

Warum sieht Dein Code so chaotisch aus?

Also wenn ich so ein Spiel entwickeln würde, dann würde der Code in meiner loop()-Funktion vielleicht so aussehen:

void loop() {
  if (getPlayerMove())
  {
    showBoard();
    checkForGameOver();    
  }
}

Dann würde ich mir vielleicht erstmal eine Zufallsfunktion für "getPlayerMove()" erstellen, die vom Programm aus Spielerzüge automatisch generiert, um dann zunächst die "showBoard()" Funktion komplett fertigzustellen, die den Inhalt des board-Arrays entsprechend darstellen kann.

Und dann das Programm schrittweise verfeinern. Also die reine Zufallsfunktion "getPlayerMove()" so erweitern, dass diese nur "gültige Spielzüge" durchführt, und auch immer schön abwechselnd mal für den einen und mal für den anderen Spieler. Und wenn das Programm dann schließlich selbst bei jedem Spielstand die Gültigkeit von Zügen prüfen kann, dann die Eingabe von Zügen über das Abfragen von Buttons steuern.

Und schließlich, falls das Programm auch den Gewinner feststellen können soll, die "checkForGameOver()" Funktion realisieren, die dann eventuell das Spiel in eine Endlosschleife bis zum nächsten Reset schickt, während gleichzeitig die LEDs der "Gewinnerreihe" ständig blinken.

Also so wie Du da begonnen hast, etwas zu programmieren, sieht mir das extrem unstrukturiert aus. Und es sieht so aus, als wenn Du nicht mal ansatzweise eine Ahnung davon hast, wie so ein Zweipersonen-Board-Game programmtechnisch realisiert werden könnte. Dein bisheriger Code scheint sich ja nur um das "Durchschalten von LEDs" zu kümmern, ohne dass auch nur ansatzweise ein 3x3 Spielfeld erkennbar wird, oder dass eingegebene Spielzüge irgendwo abgespeichert werden, so dass z.B. der Spieler-Grün nicht seinen Zug auf ein Feld machen kann, das schon von Spieler-Rot besetzt worden ist.

P.S./Nachtrag: Außerdem sehe ich gerade, dass Du für die Softwareentwicklung auf einem UNO zu wenig Pins frei hast: Mit 2*9= 18 Pins für die LEDs und 2 Pins für Buttons verbrauchst Du auf einem UNO alle 20 Pins, aber zum Debuggen während der Programmentwicklung brauchst Du "Serial", also Pin-0 und Pin-1. Zur Entwicklung des Programms bietet sich also an (nur Beispiele):

  • einen MEGA während der Programmentwicklung verwenden
  • andere LEDs verwenden, die weniger Pins benötigen (z.B. WS2812)
    Egal wie, aber jedenfalls o, dass Du die beiden Pins 0/1 für "Serial" frei hast, um während der Programmentwicklung Debug-Meldungen senden zu können, über den Programmverlauf. Ohne jegliche Debug-Möglichkeit (außer die LEDs zu beobachten) wirst Du als Anfänger extreme Probleme haben, irgenein nicht-triviales Programm auszuentwickeln, wenn Du kein serielles Debugging verfügbar hast.