Good day together,
let me first introduce myself im relative new to the arduino or general codeing thing a couple weeks maybe and was now working on this 3x3x3 tic tac toe project (what isnt realy new as i noticed during that process but no realy code examples)
i went through a lot of troubles and headachs even fixed a example code for interrupts on this site (the void had to be above setup)...
to the build of my game its 9 catodes that each conect 3 leds across the 3 layers
its 6 anodes 2 for each layer of 9 leds... cause they are 2 colored (red and yellow) leds you get it i think...
there is a poti for the selection and a tap thingy to enter the selection (actualy it only switches to next player)
the proplem ocurres if multiple leds of the same colume row (the leds layered above/below) if there are 2 of them selected chances are like 70% one of them gets to a mixed colored orange if all 3 layeres of a specific colum row field are selected they 100% all get to that mixed oranged color...
well heres my buggy baby sry if it looks still a bit messy i already tryed to clean it up a bit
typedef enum
{
//feld status spieler 1 und 2
feld_P1 = 0,
feld_P2 = 1,
//feld status unbelegt
feld_X = 2,
//feld status ausgewählt
feld_selection1 = 3,
} feld_t;
const byte interPin = 2;
feld_t spielfeld[3][3][3];
byte katPin[9] = {1, 3, 4, 5, 6, 7, 8, 9, 10};
byte anoPin[2][3] = {
{A3, A4, A5},
{11, 12, 13}
};
int feldSelect_X;
int feldSelectRandom;
int turnNr = 0;
bool spieler = true;
int spielerState = 1;
int s = 0;
int i = 0;
int z = 0;
int x = 0;
int pin;
int apin;
int taster = 2;
int farbe;
int spalte;
int zeile;
int ebene;
int spalteS;
int zeileS;
int ebeneS;
//interrupt auf taster eingabe
void wechsel()
{
spieler = !spieler;
}
void setup()
//randomSeed für den ersten zug bias auszuschalten
{
randomSeed(analogRead(A1));
//taster und interrupt pin
pinMode (interPin, INPUT_PULLUP);
//kathoden pins die jeweils alle 3 ebenen der 9 felder verbinden
for (int i = 0; i <= 8; i++)
{
pinMode(katPin[i], OUTPUT);
}
//anoden pins jede der 3 ebenen wird von jeweils 2 anoden pins angesteuert für die farben der spieler
for (int i = 0; i <= 1; i++)
{
for (int o = 0; o <= 2; o++)
{
pinMode(anoPin[i][o], OUTPUT);
}
}
// alle felder auf status unbelegt setzen
for (int spalte = 0; spalte <= 2; spalte++)
{
for (int zeile = 0; zeile <= 2; zeile++)
{
for (int ebene = 0; ebene <= 2; ebene++)
{
spielfeld[spalte][zeile][ebene] = feld_X ;
}
}
}
attachInterrupt(0, wechsel, FALLING);
}
// funktion gegen ersten zug bias von tic tac toe
void first()
{ feldSelectRandom = random(26); if (feldSelectRandom == 13) {
feldSelectRandom = -1;
}
else {
int spalteS = feldSelectRandom % 3;
int zeileS = (feldSelectRandom % 9) / 3;
int ebeneS = feldSelectRandom / 9;
for (ebene = 0; ebene <= 2; ebene++)
{ for (int farbe = 0; farbe <= 1; farbe++)
{
for (spalte = 0; spalte <= 2; spalte++)
{
for (zeile = 0; zeile <= 2; zeile++)
{
if ((spalte == spalteS) && (zeile == zeileS) && (ebene == ebeneS))
{
spielfeld[spalteS][zeileS][ebeneS] = feld_P2;
}
}
}
}
} spieler = !spieler;
spielerState = spieler;
}
}
// diese funktion fragt status der felder ab und steuert sie entsprechend an
void spielanzeige()
{ poti();
for (int farbe = 0; farbe <= 1; farbe++)
{
for (ebene = 0; ebene <= 2; ebene++)
{
apin = anoPin[farbe][ebene];
for (spalte = 0; spalte <= 2; spalte++)
{
for (zeile = 0; zeile <= 2; zeile++)
{
pin = katPin[zeile * 3 + spalte];
feld_t feld = spielfeld[spalte][zeile][ebene];
if (feld == feld_X)
{
digitalWrite(pin, HIGH);
}
else if (feld == farbe)
{
digitalWrite(pin, LOW);
}
else if ((feld == feld_selection1) && (farbe == spieler))
{
digitalWrite(pin, LOW);
}
}
}
digitalWrite(apin, HIGH);
delay(1);
digitalWrite(apin, LOW);
}
}
}
//funktion (ist in die poti() funktion verkapselt)
//die nach dem auslösen des interrupts/tasters
//die aktuelle auswahl des poti´s ans spielfeld übergibt
//und zum anderen spieler wechselt
void auswahl()
{
if (spielerState != spieler)
{
feldSelect_X = map(analogRead(A0), 0, 1023, 0, 26);
// Serial.print(feldSelect_X);
int spalteS = feldSelect_X % 3;
int zeileS = (feldSelect_X % 9) / 3;
int ebeneS = feldSelect_X / 9;
for (ebene = 0; ebene <= 2; ebene++)
{ for (int farbe = 0; farbe <= 1; farbe++)
{
for (spalte = 0; spalte <= 2; spalte++)
{
for (zeile = 0; zeile <= 2; zeile++)
{
if ((spalte == spalteS) && (zeile == zeileS) && (ebene == ebeneS))
{
if (spielfeld[spalteS][zeileS][ebeneS] == feld_selection1)
{
if (spieler == true)
{
spielfeld[spalteS][zeileS][ebeneS] = feld_P1;
// unsigned long currentTime = millis();
//lastTimeP1 = currentTime;
}
else
{
spielfeld[spalteS][zeileS][ebeneS] = feld_P2;
// unsigned long currentTime = millis();
//lastTimeP2 = currentTime;
}
}
}
}
}
}
}
}
spielerState = spieler;
}
//funktion (ist in die spielanzeige() verkapselt) die
//die aktuell ausgewähltes feld ans spielfeld übergibt
//um sie anzeigen zu lassen
void poti()
{
auswahl();
feldSelect_X = map(analogRead(A0), 0, 1023, 0, 26);
int spalteS = feldSelect_X % 3;
int zeileS = (feldSelect_X % 9) / 3;
int ebeneS = feldSelect_X / 9;
for (ebene = 0; ebene <= 2; ebene++)
{
for (spalte = 0; spalte <= 2; spalte++)
{
for (zeile = 0; zeile <= 2; zeile++)
{
if ((spalte == spalteS) && (zeile == zeileS) && (ebene == ebeneS))
{
if (spielfeld[spalteS][zeileS][ebeneS] == feld_X)
spielfeld[spalteS][zeileS][ebeneS] = feld_selection1;
}
else if (spielfeld[spalte][zeile][ebene] == feld_selection1)
{
spielfeld[spalte][zeile][ebene] = feld_X;
}
}
}
}
}
void loop()
//anti erster zug bias
{
if (turnNr == 0)
{
first();
turnNr = +1;
}
//das spiel :)
spielanzeige();
}
there is a build suspicion of me that are related to the build cause the resistors connected to the catodes right now im checking on that but code related my only suspicion is im an idiot
sorry for the long introduction n stuff but explaining that issue kind of brings my english to it limits ^^ hope you can understand what i mean. some parts of the code are german if needed i could make a translated version if it helps you to help me
thanks upfront for your time investment