Alright, firstly thanks everyone for the quick responses and suggestions.
A little more context: im building a little arcade machine with a 11x15 neopixel matrix, an arduino nano 168 and a controller (just 6 buttons hooked up to digital ports) to move up, down, left, right, a game selection and a confirm button.
I want there to be 3 games on that arcade, and ive gotten the game selection and a tic tac toe game running. Now i want to have Snake on it. I managed to get a pixel to move around with the use of the controller, spawn fruit which the snake "consumes" when in contact, which then increases the snakes length varaible, but doesnt actually make it longer yet. I want to use a 2 dimensional array to store the information on where the snakes body parts are at to start makeing the snake longer.
Now, at the end of the code, now as soon as i add a function to check or write to that array and upload that new code the display refuses to refresh. Besides that the code still works in the background, which iwas able to see by adding serial debug statements when entering a game or a menue select.
Here the Code, at the end is an example of my problem:
#include <Adafruit_NeoPixel.h>
//Anzahl LED's und Ausgang vom ESP festlegen
#define PIN 10 //DigitalPin 12
#define NUMBERS 165 //Menge LEDs 0-165 (166stck)
//Adresse der ersten und letzten LED
const int ersteLED = 0;
const int letzteLED = 164;
int x = 0;
int y = 0;
short activePlayer=0; //0 Kreuz / 1 Kreis
int red = 80;
int green = 80;
int blue = 80;
int TTTAltxFledIndex;
short TTTRotPunkte=0;
short TTTBlauPunkte=0;
short TTTZugZahl=0;
int TTTFeldIndex =0;
int TTTFelderMitte[3][3]{
{130,126,122},
{86,82,78},
{42,38,34}
};
int TTTFelderVergeben[3][3]{ //0 nicht - 1=Kreuz - 4= Kreis
{0,0,0},
{0,0,0},
{0,0,0}
};
short SnakeRichtung=0; //0Up 1R 2L 3Down
short SnakeLength=1;
bool SnakeGegessen=false;
short fy;
short fx;
bool SnakeBody[11][11];
int oldx = 0;
int oldy = 0;
int numPins = 6;
int pins[] = {0, 0, 0, 0, 0, 0}; // Pin-Nummern
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMBERS, PIN, NEO_GRB + NEO_KHZ800);
//Berechnung des Pixelindex mit x&y
int getIndex(int x, int y) {
int offset = 0;
if(y % 2 != 0) {
// Jede zweite Zeile geht von rechts aus
offset = 10;
x = -x;
}
return y * (11) + x + offset;
}
void setup() {
Serial.begin(19200);
pixels.begin();
pixels.clear();
pixels.show();
for (int i = 2; i <= 7; i++) {
pinMode(pins[i], INPUT);
}
for(short b=0; b<=10; b++){
for(short c=0; c<=10; c++){
SnakeBody[b][c]=false;
}
}
}
void loop() {
Menue();
}
void TTTSpiel(){
TTTFeldStreben();
TTTPunkteZeichnen();
TTTFeldWahl();
}
void inputLesen(){
for (int i = 2; i <= 7; i++) {
pins[i-2]=digitalRead(i);
}
}
void TTTFeldStreben() { //Zeichnet Raster
int red = 80;
int green = 80;
int blue = 80;
x = 1;
y = 0;
// Querstreben
for (int i = 0; i <= 3; i++) {
x = 1 + i * 4;
for (int spalte = 0; spalte <= 10; spalte++) {
y = spalte;
pixels.setPixelColor(getIndex(y, x), red, green, blue);
}
}
for (int i = 3; i <= 7; i += 4) {
for (int reihe = 1; reihe <= 13; reihe++) {
y = i;
x = reihe;
pixels.setPixelColor(getIndex(y, x), red, green, blue);
}
}
pixels.show();
}
void TTTFeldWahl(){
int x=1;
int y=1;
bool done=false;
while(done==false){
pixels.setPixelColor(getIndex(3, 11),80,80,80); //BugAuslgiech fehlender Pixel
pixels.show();
pixels.setPixelColor(TTTFeldIndex,0,0,0);
inputLesen();
if(pins[0]==1){y--;}
if(pins[3]==1){y++;}
if(pins[1]==1){x--;}
if(pins[2]==1){x++;}
if(pins[4]==1){Menue();}
if(x>2){x=2;}
if(x<0){x=0;}
if(y>2){y=2;}
if(y<0){y=0;}
delay(140);
TTTFeldIndex=TTTFelderMitte[y][x];
if(activePlayer==0){pixels.setPixelColor(TTTFeldIndex,150,70,0);}else{pixels.setPixelColor(TTTFeldIndex,0,100,100);}
pixels.show();
if(TTTFelderVergeben[y][x]==0){//FeldvonKreuz
if(pins[5]==1){done=true;}
}
}
if(activePlayer==1){
TTTKreisZeichnen();
TTTFelderVergeben[y][x]=4;
}
else{
TTTKreuzZeichnen();
TTTFelderVergeben[y][x]=1;
}
TTTCheckSieger();
TTTSpiel();
}
void TTTPunkteZeichnen(){
if(TTTRotPunkte==12 || TTTBlauPunkte==12){
TTTRotPunkte=0;
TTTBlauPunkte=0;
} //volle Punkte bereits erreicht
short i=0;
//RotePunkteZeichen
if(TTTRotPunkte>0){
while(i<TTTRotPunkte){
pixels.setPixelColor(i,200,0,0);
i++;
}
}
i=0;
if(TTTBlauPunkte>0){
while(i<TTTBlauPunkte){
pixels.setPixelColor(i+154,0,0,200);
i++;
}
}
}
void TTTCheckSieger(){ //Sieg Blau =12 Sieg Rot=3
bool spiellauft=true;
if(
TTTFelderVergeben[2][2] + TTTFelderVergeben[2][1] + TTTFelderVergeben[2][0] == 3 || //HReiheUnten
TTTFelderVergeben[1][2] + TTTFelderVergeben[1][1] + TTTFelderVergeben[1][0] == 3 || //HReiheMitte
TTTFelderVergeben[0][2] + TTTFelderVergeben[0][1] + TTTFelderVergeben[0][0] == 3 || //HReiheOben
TTTFelderVergeben[2][2] + TTTFelderVergeben[1][2] + TTTFelderVergeben[0][2] == 3 || //VReiheRechts
TTTFelderVergeben[2][1] + TTTFelderVergeben[1][1] + TTTFelderVergeben[0][1] == 3 || //VReiheMitte
TTTFelderVergeben[2][0] + TTTFelderVergeben[1][0] + TTTFelderVergeben[0][0] == 3 || //VReiheLinks
TTTFelderVergeben[2][2] + TTTFelderVergeben[1][1] + TTTFelderVergeben[0][0] == 3 || //ReiheUR nach OL
TTTFelderVergeben[2][0] + TTTFelderVergeben[1][1] + TTTFelderVergeben[0][2] == 3 //ReiheUL nach OR
){
TTTRotPunkte++;
if(TTTRotPunkte==11){TTTBildReset();}
TTTBildReset();
activePlayer=1;
}
if(
TTTFelderVergeben[2][2] + TTTFelderVergeben[2][1] + TTTFelderVergeben[2][0] == 12 || //HReiheUnten
TTTFelderVergeben[1][2] + TTTFelderVergeben[1][1] + TTTFelderVergeben[1][0] == 12 || //HReiheMitte
TTTFelderVergeben[0][2] + TTTFelderVergeben[0][1] + TTTFelderVergeben[0][0] == 12 || //HReiheOben
TTTFelderVergeben[2][2] + TTTFelderVergeben[1][2] + TTTFelderVergeben[0][2] == 12 || //VReiheRechts
TTTFelderVergeben[2][1] + TTTFelderVergeben[1][1] + TTTFelderVergeben[0][1] == 12 || //VReiheMitte
TTTFelderVergeben[2][0] + TTTFelderVergeben[1][0] + TTTFelderVergeben[0][0] == 12 || //VReiheLinks
TTTFelderVergeben[2][2] + TTTFelderVergeben[1][1] + TTTFelderVergeben[0][0] == 12 || //ReiheUR nach OL
TTTFelderVergeben[2][0] + TTTFelderVergeben[1][1] + TTTFelderVergeben[0][2] == 12 //ReiheUL nach OR
){
TTTBlauPunkte++;
if(TTTBlauPunkte==11){TTTBildReset();}
TTTBildReset();
activePlayer=0;
}
for (int i = 0; i < 3 && spiellauft==true; i++) { //unentschieden
for (int j = 0; j < 3 && spiellauft==true; j++) {
if(TTTFelderVergeben[i][j] == 0){
spiellauft=false;
}
}
}
if(spiellauft==true) {
TTTBildReset();
}
TTTPunkteZeichnen();
}
void TTTBildReset(){
pixels.clear();
//ArrayMit0Füllen
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
TTTFelderVergeben[i][j] = 0;
}
}
delay(200);
}
void TTTKreuzZeichnen(){
if(TTTFeldIndex==126 || TTTFeldIndex==82 || TTTFeldIndex==38){//Mitte
pixels.setPixelColor(TTTFeldIndex+1,100,0,0);
pixels.setPixelColor(TTTFeldIndex-1,100,0,0);
pixels.setPixelColor(TTTFeldIndex+12,100,0,0);
pixels.setPixelColor(TTTFeldIndex+11,100,0,0);
pixels.setPixelColor(TTTFeldIndex+10,100,0,0);
pixels.setPixelColor(TTTFeldIndex-11,100,0,0);
pixels.setPixelColor(TTTFeldIndex-12,100,0,0);
pixels.setPixelColor(TTTFeldIndex-10,100,0,0);
}
if(TTTFeldIndex==130 || TTTFeldIndex==86 || TTTFeldIndex==42){//Links
pixels.setPixelColor(TTTFeldIndex+1,100,0,0);
pixels.setPixelColor(TTTFeldIndex-1,100,0,0);
pixels.setPixelColor(TTTFeldIndex+2,100,0,0);
pixels.setPixelColor(TTTFeldIndex+3,100,0,0);
pixels.setPixelColor(TTTFeldIndex+4,100,0,0);
pixels.setPixelColor(TTTFeldIndex-18,100,0,0);
pixels.setPixelColor(TTTFeldIndex-19,100,0,0);
pixels.setPixelColor(TTTFeldIndex-20,100,0,0);
}
if(TTTFeldIndex==122 || TTTFeldIndex==78 || TTTFeldIndex==34){//Rechts
pixels.setPixelColor(TTTFeldIndex+1,100,0,0);
pixels.setPixelColor(TTTFeldIndex-1,100,0,0);
pixels.setPixelColor(TTTFeldIndex+18,100,0,0);
pixels.setPixelColor(TTTFeldIndex+19,100,0,0);
pixels.setPixelColor(TTTFeldIndex+20,100,0,0);
pixels.setPixelColor(TTTFeldIndex-2,100,0,0);
pixels.setPixelColor(TTTFeldIndex-3,100,0,0);
pixels.setPixelColor(TTTFeldIndex-4,100,0,0);
}
if(TTTFeldIndex==124){
pixels.setPixelColor(TTTFeldIndex+1,100,0,0);
pixels.setPixelColor(TTTFeldIndex-1,100,0,0);
pixels.setPixelColor(TTTFeldIndex+14,100,0,0);
pixels.setPixelColor(TTTFeldIndex+15,100,0,0);
pixels.setPixelColor(TTTFeldIndex+16,100,0,0);
pixels.setPixelColor(TTTFeldIndex-6,100,0,0);
pixels.setPixelColor(TTTFeldIndex-7,100,0,0);
pixels.setPixelColor(TTTFeldIndex-8,100,0,0);
}
activePlayer=1;
pixels.show();
}
void TTTKreisZeichnen(){
if(TTTFeldIndex==126 || TTTFeldIndex==82 || TTTFeldIndex==38){//Mitte
pixels.setPixelColor(TTTFeldIndex+1,0,0,100);
pixels.setPixelColor(TTTFeldIndex-1,0,0,100);
pixels.setPixelColor(TTTFeldIndex+12,0,0,100);
pixels.setPixelColor(TTTFeldIndex+11,0,0,100);
pixels.setPixelColor(TTTFeldIndex+10,0,0,100);
pixels.setPixelColor(TTTFeldIndex-11,0,0,100);
pixels.setPixelColor(TTTFeldIndex-12,0,0,100);
pixels.setPixelColor(TTTFeldIndex-10,0,0,100);
}
if(TTTFeldIndex==130 || TTTFeldIndex==86 || TTTFeldIndex==42){//Links
pixels.setPixelColor(TTTFeldIndex+1,0,0,100);
pixels.setPixelColor(TTTFeldIndex-1,0,0,100);
pixels.setPixelColor(TTTFeldIndex+2,0,0,100);
pixels.setPixelColor(TTTFeldIndex+3,0,0,100);
pixels.setPixelColor(TTTFeldIndex+4,0,0,100);
pixels.setPixelColor(TTTFeldIndex-18,0,0,100);
pixels.setPixelColor(TTTFeldIndex-19,0,0,100);
pixels.setPixelColor(TTTFeldIndex-20,0,0,100);
}
if(TTTFeldIndex==122 || TTTFeldIndex==78 || TTTFeldIndex==34){//Rechts
pixels.setPixelColor(TTTFeldIndex+1,0,0,100);
pixels.setPixelColor(TTTFeldIndex-1,0,0,100);
pixels.setPixelColor(TTTFeldIndex+18,0,0,100);
pixels.setPixelColor(TTTFeldIndex+19,0,0,100);
pixels.setPixelColor(TTTFeldIndex+20,0,0,100);
pixels.setPixelColor(TTTFeldIndex-2,0,0,100);
pixels.setPixelColor(TTTFeldIndex-3,0,0,100);
pixels.setPixelColor(TTTFeldIndex-4,0,0,100);
}
if(TTTFeldIndex==128){
pixels.setPixelColor(TTTFeldIndex+1,0,0,100);
pixels.setPixelColor(TTTFeldIndex-1,0,0,100);
pixels.setPixelColor(TTTFeldIndex+6,0,0,100);
pixels.setPixelColor(TTTFeldIndex+7,0,0,100);
pixels.setPixelColor(TTTFeldIndex+8,0,0,100);
pixels.setPixelColor(TTTFeldIndex-14,0,0,100);
pixels.setPixelColor(TTTFeldIndex-15,0,0,100);
pixels.setPixelColor(TTTFeldIndex-16,0,0,100);
}
activePlayer=0;
pixels.show();
}
void Menue(){
MenueZeichnen();
MenueAuswahl();
}
void MenueZeichnen(){
TTTBildReset();
TTTPunkteZeichnen();
// Querstreben
for (int i = 0; i <= 3; i++) {
x = 1 + i * 4;
for (int spalte = 0; spalte <= 10; spalte++) {
y = spalte;
pixels.setPixelColor(getIndex(y, x), red, green, blue);
}
}
//TicTacToe Auswahl zeichnen
TTTFeldIndex=124;
TTTKreuzZeichnen();
TTTFeldIndex=128;
TTTKreisZeichnen();
//Schlange Zeichnen
for(short b; b<5;b++){
pixels.setPixelColor(getIndex(b+2, 3), 0, 120, 0);
}
pixels.setPixelColor(getIndex(8, 3), 120, 0, 0);
pixels.show();
}
void MenueAuswahl(){
bool bestaetigt=false;
short k=0;
while(bestaetigt==false){
inputLesen();
if(pins[0]==1){k--;MenueZeichnen();}
if(pins[3]==1){k++;MenueZeichnen();}
if(pins[5]==1){bestaetigt=true;}
if(k>2){k=0;}
if(k<0){k=2;}
delay(140);
if(k==0){//TTT
pixels.setPixelColor(getIndex(0, 10),128, 0, 128);
pixels.setPixelColor(getIndex(0, 11),128, 0, 128);
pixels.setPixelColor(getIndex(0, 12),128, 0, 128);
pixels.setPixelColor(getIndex(10, 10),128, 0, 128);
pixels.setPixelColor(getIndex(10, 11),128, 0, 128);
pixels.setPixelColor(getIndex(10, 12),128, 0, 128);
}
if(k==1){//4Cnct
pixels.setPixelColor(getIndex(0, 6),128, 0, 128);
pixels.setPixelColor(getIndex(0, 7),128, 0, 128);
pixels.setPixelColor(getIndex(0, 8),128, 0, 128);
pixels.setPixelColor(getIndex(10, 6),128, 0, 128);
pixels.setPixelColor(getIndex(10, 7),128, 0, 128);
pixels.setPixelColor(getIndex(10, 8),128, 0, 128);
}
if(k==2){//Snake
pixels.setPixelColor(getIndex(0, 2),128, 0, 128);
pixels.setPixelColor(getIndex(0, 3),128, 0, 128);
pixels.setPixelColor(getIndex(0, 4),128, 0, 128);
pixels.setPixelColor(getIndex(10, 2),128, 0, 128);
pixels.setPixelColor(getIndex(10, 3),128, 0, 128);
pixels.setPixelColor(getIndex(10, 4),128, 0, 128);
}
pixels.show();
}
x=1;
y=1;
pixels.clear();
if(k==0){//TTT
TTTSpiel();
}
if(k==1){//4Cnct
TTTSpiel();
}
if(k==2){//Snake
SnakeSpiel();
}
}
void SnakeSpiel(){
SnakeBildReset();
SnakeFruchtSpawn();
SnakeBewegen();
}
void SnakeBildReset(){
pixels.clear();
for (int i = 0; i <= 3; i++){
x = 1 + i * 12;
for (int spalte = 0; spalte <= 10; spalte++) {
y = spalte;
pixels.setPixelColor(getIndex(y, x), red, green, blue);
}
}
pixels.show();
}
void SnakeBewegen(){
x=5;
y=7;
SnakeRichtung=5;
while(pins[4]==0){
SnakeEssenCheck();
if(SnakeGegessen==true){
SnakeLength = SnakeLength +1;
SnakeGegessen =false;
SnakeFruchtSpawn();
Serial.println(SnakeLength);
}
SnakeInputs();
pixels.setPixelColor(getIndex(x, y),0, 100, 0);
pixels.show();
delay(100);
pixels.setPixelColor(getIndex(x, y),0, 0, 0);
pixels.show();
}
}
void SnakeEssenCheck(){
if(fx==x && fy == y){
SnakeGegessen=true;
}
}
void SnakeFruchtSpawn(){
fx = random(0, 11);
fy = random(2, 13);
if(fx != x || fy != y){
pixels.setPixelColor(getIndex(fx, fy),100, 0, 0);
}
}
void SnakeInputs(){//0Up 1R 2L 3Down
inputLesen();
if(pins[0]==1 && SnakeRichtung != 3){SnakeRichtung=0;}
if(pins[3]==1 && SnakeRichtung != 0){SnakeRichtung=3;}
if(pins[1]==1 && SnakeRichtung != 1){SnakeRichtung=2;}
if(pins[2]==1 && SnakeRichtung != 2){SnakeRichtung=1;}
if(pins[4]==1){Menue();}
if(SnakeRichtung==0){
y++;
if(y>12) {y=2;}
}
if(SnakeRichtung==3){
y--;
if(y<2) {y=12;}
}
if(SnakeRichtung==2){
x--;
if(x<0) {x=10;}
}
if(SnakeRichtung==1){
x++;
if(x>10) {x=0;}
}
//Examplfe of crash code
//if(SnakeBody[x][y]==true){
// Menue();
//}
}