#include <SPI.h>
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 2
const int maxX = MAX_DEVICES * 8 - 1;
const int maxY = 7;
#define CLK 13
#define DATA 11
#define CS 10
#define right 2
#define left 4
#define forward 3
#define backward 5
int time = millis();
int divide = 100;
int dividef = 50;
unsigned int action;
bool ledState;
int xx, yy;
int y,cy,cx,px,py, ex, ey = 0;
int x = 3;
short count = 0;
int speed = 100;
MD_MAX72XX mx = MD_MAX72XX(MD_MAX72XX::PAROLA_HW, CS, MAX_DEVICES);
int us;
bool trfa[16] = {
false, false, false, false,
false, false, false, false,
false, false, false, false,
false, false, false, false
} ;
void setup() {
Serial.begin(9600);
mx.begin();
mx.control(MD_MAX72XX:: INTENSITY, MAX_INTENSITY);
mx.clear();
pinMode(right, INPUT);
pinMode(left, INPUT);
pinMode(forward, INPUT);
pinMode(backward, INPUT);
// car(x, y);
}
void control(){
if (digitalRead(forward) > 0 or digitalRead(backward) > 0
or digitalRead(left) > 0 or digitalRead(right) > 0){
// mx.clear()
carClear(x, y);
/* if(digitalRead(forward)>0){
y++;
if(y == 13){
y--;
}
}
if(digitalRead(backward)>0){
y--;
if(y == -1){
y++;
}
} */
if(digitalRead(left)>0){
x=6;
if(x == 8){
x=6;
}
}
if(digitalRead(right)>0){
x=3;
if(x < 2){
x=3;
}
}
car(x,y);
}
car(x,y);
}
void rect(int y, int x){
mx.setPoint(y+0,x+0, true);
mx.setPoint(y+0,x+1, true);
mx.setPoint(y+1,x+0, true);
mx.setPoint(y+1,x+1, true);
}
void rectClear(int y, int x){
mx.setPoint(y+0,x+0, false);
mx.setPoint(y+0,x+1, false);
mx.setPoint(y+1,x+0, false);
mx.setPoint(y+1,x+1, false);
}
void car(int y, int x){
mx.setPoint(y+0,x+0, true);
mx.setPoint(y-2,x+0, true);
mx.setPoint(y-1,x+1, true);
mx.setPoint(y-1,x+2, true);
mx.setPoint(y+0,x+2, true);
mx.setPoint(y-2,x+2, true);
mx.setPoint(y-1,x+3, true);
}
void carClear(int y, int x){
mx.setPoint(y+0,x+0, false);
mx.setPoint(y-2,x+0, false);
mx.setPoint(y-1,x+1, false);
mx.setPoint(y-1,x+2, false);
mx.setPoint(y+0,x+2, false);
mx.setPoint(y-2,x+2, false);
mx.setPoint(y-1,x+3, false);
}
void ecar(int ey, int ex, bool val){
mx.setPoint(ey+0,ex+1, val);
mx.setPoint(ey-2,ex+1, val);
mx.setPoint(ey-1,ex+2, val);
mx.setPoint(ey+0,ex+3, val);
mx.setPoint(ey-1,ex+1, val);
mx.setPoint(ey-2,ex+3, val);
mx.setPoint(ey-1,ex+0, val);
if(ex == 3 && ey == x){
mx.clear();
while(count != 16){
trfa[count] = true;
gameover();
count++;
delay(100);
}
delay(500);
while(count != -1){
trfa[count] = false;
count--;
}
mx.clear();
}
}
void ecarClear(int ey, int ex){
mx.setPoint(ey+0,ex+1, false);
mx.setPoint(ey-2,ex+1, false);
mx.setPoint(ey-1,ex+2, false);
mx.setPoint(ey+0,ex+3, false);
mx.setPoint(ey-1,ex+1, false);
mx.setPoint(ey-2,ex+3, false);
mx.setPoint(ey-1,ex+0, false);
}
void loop() {
int ran = random(0,2);
if (ran == 0){
cx = 3;
}
if (ran == 1){
cx = 6;
}
for(cy = 18; cy >= -3;){
unsigned long currentMillis = millis();
control();
if (currentMillis - action > speed){
action = currentMillis;
if (ledState == true){
ledState = false;
ecar(px, py, ledState);
}
if (ledState == false){
ledState = true;
ecar(cx, cy, ledState);
py=cy;
px=cx;
cy--;
if(cy == 2){
speed=speed-1;
}
if(speed == 30){
win();
delay(99999);
}
}
}
}
}
void gameover(){
mx.setPoint(5,7, trfa[7]);
mx.setPoint(5,6, trfa[6]);
mx.setPoint(6,6, trfa[5]);
mx.setPoint(5,10, trfa[0]);
mx.setPoint(6,10, trfa[1]);
mx.setPoint(7,7, trfa[4]);
mx.setPoint(7,8, trfa[3]);
mx.setPoint(7,9, trfa[2]);
mx.setPoint(1,7, trfa[15]);
mx.setPoint(1,6, trfa[14]);
mx.setPoint(2,6, trfa[13]);
mx.setPoint(1,10, trfa[8]);
mx.setPoint(2,10, trfa[9]);
mx.setPoint(3,7, trfa[12]);
mx.setPoint(3,8, trfa[11]);
mx.setPoint(3,9, trfa[10]);
speed = 45;
}
void win(){
mx.clear();
mx.setPoint(3,9, true);
mx.setPoint(4,9, true);
mx.setPoint(3,8, true);
mx.setPoint(4,8, true);
mx.setPoint(3,7, true);
mx.setPoint(4,7, true);
mx.setPoint(2,6, true);
mx.setPoint(2,5, true);
mx.setPoint(5,6, true);
mx.setPoint(5,5, true);
mx.setPoint(1,8, true);
mx.setPoint(0,8, true);
mx.setPoint(1,7, true);
mx.setPoint(0,7, true);
mx.setPoint(1,9, true);
mx.setPoint(0,9, true);
mx.setPoint(6,8, true);
mx.setPoint(7,8, true);
mx.setPoint(7,7, true);
mx.setPoint(6,7, true);
mx.setPoint(7,9, true);
mx.setPoint(6,9, true);
mx.setPoint(6,6, true);
mx.setPoint(4,6, true);
mx.setPoint(3,6, true);
mx.setPoint(1,6, true);
mx.setPoint(7,10, true);
mx.setPoint(6,10, true);
mx.setPoint(0,10, true);
mx.setPoint(1,10, true);
}