#define CLK 13
#define DIN 11
#define CS 10
#define X_SEGMENTS 4
#define Y_SEGMENTS 2
#define NUM_SEGMENTS (X_SEGMENTS * Y_SEGMENTS)
byte fb[8 * NUM_SEGMENTS];
boolean pixels[16][32];
boolean before_up = false;
boolean before_left = false;
boolean before_down = false;
boolean before_right = false;
boolean current_up;
boolean current_left;
boolean current_down;
boolean current_right;
byte frog_i;
byte frog_j;
byte wins = 0;
boolean game_over = false;
boolean game_won = false;
void update_fb(boolean pixels[16][32]){
int pos = 0;
byte nr = 0;
for(int i = 0; i < 16; i++){
for(int j = 1 ; j <= 32; j++){
nr = (nr << 1) | pixels[i][j - 1];
if(j % 8 == 0){
fb[63 - pos++] = nr;
nr = 0;
}
}
}
}
void move(char dir){
pixels[frog_i][frog_j] = 0;
switch(dir){
case 'u':{
frog_i = (16 + frog_i - 1) % 16;
break;
}
case 'd':{
frog_i = (16 + frog_i + 1) % 16;
break;
}
case 'r':{
frog_j = (32 + frog_j + 1) % 32;
break;
}
case 'l':{
frog_j = (32 + frog_j - 1) % 32;
break;
}
}
pixels[frog_i][frog_j] = 1;
if(frog_i == 0){
wins++;
game_won = true;
}
}
void spawn_cars(){
for(int k = 0; k < 8; k++){
pixels[k][0] = rand() % 10 < 2;
}
for(int k = 8; k < 15; k++){
pixels[k][31] = rand() % 10 < 2;
}
}
void move_cars(){
for(int j = 31 ; j > 0; j--)
for(int k = 0; k < 8; k++)
{
if(k == frog_i && j == frog_j){
if(pixels[k][j - 1] == 1){ //sunt pe broasca
game_over = true;
return;
}
continue;
}
if(k == frog_i && (j-1) == frog_j)continue;
pixels[k][j] = pixels[k][j - 1];
}
for(int j = 0 ; j < 31; j++)
for(int k = 8; k < 15; k++)
{
if(k == frog_i && j == frog_j){ //sunt pe broasca
if(pixels[k][j + 1] == 1){
game_over = true;
return;
}
continue;
}
if(k == frog_i && (j+1) == frog_j)continue;
pixels[k][j] = pixels[k][j + 1];
}
pixels[frog_i][frog_j] = 1;
}
void shiftAll(byte send_to_address, byte send_this_data){
digitalWrite(CS, LOW);
for (int i = 0; i < NUM_SEGMENTS; i++) {
shiftOut(DIN, CLK, MSBFIRST, send_to_address);
shiftOut(DIN, CLK, MSBFIRST, send_this_data);
}
digitalWrite(CS, HIGH);
}
void setup() {
Serial.begin(115200);
pinMode(CLK, OUTPUT);
pinMode(DIN, OUTPUT);
pinMode(CS, OUTPUT);
// Setup each MAX7219
shiftAll(0x0f, 0x00); //display test register - test mode off
shiftAll(0x0b, 0x07); //scan limit register - display digits 0 thru 7
shiftAll(0x0c, 0x01); //shutdown register - normal operation
shiftAll(0x0a, 0x0f); //intensity register - max brightness
shiftAll(0x09, 0x00); //decode mode register - No decode
pinMode(7, INPUT);
pinMode(6, INPUT);
pinMode(5, INPUT);
pinMode(4, INPUT);
}
void show() {
for (byte row = 0; row < 8; row++) {
digitalWrite(CS, LOW);
byte segment = NUM_SEGMENTS;
while (segment--) {
byte x = segment % X_SEGMENTS;
byte y = segment / X_SEGMENTS * 8;
byte addr = (row + y) * X_SEGMENTS;
if (segment & X_SEGMENTS) { // odd rows of segments
shiftOut(DIN, CLK, MSBFIRST, 8 - row);
shiftOut(DIN, CLK, LSBFIRST, fb[addr + x]);
} else { // even rows of segments
shiftOut(DIN, CLK, MSBFIRST, 1 + row);
shiftOut(DIN, CLK, MSBFIRST, fb[addr - x + X_SEGMENTS - 1]);
}
}
digitalWrite(CS, HIGH);
}
}
long long int start_time = millis();
boolean start = true;
char dir = 'l';
boolean game_started = false;
void loop(){
if(!game_started){
frog_i = 15;
frog_j = 15;
pixels[frog_i][frog_j] = 1;
game_started = true;
game_over = false;
game_won = false;
}
if(millis() - start_time > 1000 / (wins + 1)){
start_time = millis();
spawn_cars();
move_cars();
}
if(game_won){
Serial.println("ai castigat, brosaca ta a trecut strada! -> nivel: " + String(wins));
for(int i = 0 ; i < 64; i++)
fb[i] = 0;
show();
delay(2500);
for(int i = 0 ; i < 64; i++)
fb[i] = 255;
show();
delay(2500);
game_started = false;
}
if(game_over){
Serial.println("ai lovit broasca, fii mai atent! -> te-ai intors la nivel: 0");
for(int i = 0 ; i < 64; i++)
fb[i] = 255;
show();
delay(2500);
for(int i = 0 ; i < 64; i++)
fb[i] = 0;
show();
delay(2500);
game_started = false;
wins = 0;
}
current_up = digitalRead(7);
current_left = digitalRead(6);
current_down = digitalRead(5);
current_right = digitalRead(4);
if(current_up)
before_up = 1;
if(current_left)
before_left = 1;
if(current_down)
before_down = 1;
if(current_right)
before_right = 1;
if(!current_up && before_up){
before_up = current_up;
move('u');
}
if(!current_left && before_left){
before_left = current_left;
move('l');
}
if(!current_down && before_down){
before_down = current_down;
move('d');
}
if(!current_right && before_right){
before_right = current_right;
move('r');
}
update_fb(pixels);
show();
}