#include <Adafruit_NeoPixel.h>
#define MATRIX_PIN 2
#define ROWS 16
#define COLS 16
#define NUM_PIXELS (ROWS * COLS)
Adafruit_NeoPixel matrix(NUM_PIXELS, MATRIX_PIN, NEO_GRB + NEO_KHZ800);
int x[256];
int y[256];
int snakelen = 3;
int xa, ya;
int fx, fy;
void setup() {
pinMode(A0, INPUT);
pinMode(A1, INPUT);
matrix.begin();
fx = random(COLS);
fy = random(ROWS);
}
void loop() {
int horz = analogRead(A1);
int vert = analogRead(A0);
if (horz == 0 and vert == 512 and xa == 0) {xa = 1; ya = 0;}
if (horz == 1023 and vert == 512 and xa == 0) {xa = -1; ya = 0;}
if (horz == 512 and vert == 0 and ya == 0) {ya = 1; xa = 0;}
if (horz == 512 and vert == 1023 and ya == 0) {ya = -1; xa = 0;}
int nextx = (x[0] + xa + COLS) % COLS;
int nexty = (y[0] + ya + ROWS) % ROWS;
for (int i = snakelen - 1; i > 0; i--) {
x[i] = x[i - 1];
y[i] = y[i - 1];
}
x[0] = nextx;
y[0] = nexty;
for (int i = 1; i < snakelen; i++) {
if (nextx == x[i] and nexty == y[i]) {
snakelen = 3;
}
}
if(nextx == fx and nexty == fy) {
snakelen += 1;
matrix.setPixelColor(fy * COLS + fx, matrix.Color(0, 0, 0));
fx = random(COLS);
fy = random(ROWS);
}
matrix.clear();
matrix.setPixelColor(fy * COLS + fx, matrix.Color(255, 0, 0));
for(int i = 0; i < snakelen; i++) {
int index = y[i] * COLS + x[i];
matrix.setPixelColor(index, matrix.Color(0, 255, 0));
}
matrix.show();
delay(125);
}