Impugna il joystick e difendi la Terra dalla pioggia di asteroidi che appaiono rapidi e imprevedibili sullo schermo.
Versione 1.0 (“Target: 50”)
Strumenti
- Arduino UNO
- Matrice LED 8×8
- Modulo joystick a doppio asse
- Cavi elettrici e resistenze
I quadratini rossi, che rappresentano gli asteroidi, appaiono in maniera aleatoria in corrispondenza degli 8 punti cardinali della matrice LED. Direzionando il joystick contro un asteroide, lo si disintegra (il quadratino si spegne). Ogni 5 asteroidi abbattuti, la frequenza di apparizione di nuovi asteroidi aumenta. Lo scopo del gioco è disintegrare quanti più asteroidi possibile prima che siano presenti contemporaneamente 7 asteroidi sullo schermo. In tal caso, scorre la scritta “GAME OVER” e viene visualizzato il numero di asteroidi abbattuti, seguito da uno smiley che sorride se questo numero è pari almeno a 50.
Diagramma dei collegamenti
Codice
#include "LedControl.h"
const int SW_pin = 2;
const int X_pin = 0;
const int Y_pin = 1;
int c = 700; // delay iniziale tra un asteroide e l’altro
int difficolta = 150; // riduzione del delay quando aumenta la difficoltà
long last = 0;
int level = 0; // numero di asteroidi abbattuti
int asteroidi = 0; // numero di asteroidi presenti
int lista[8] = {0, 0, 0, 0, 0, 0, 0, 0}; // memorizza quali asteroidi sono presenti
LedControl lc=LedControl(12,10,11,1);
void setup() {
pinMode(SW_pin, INPUT);
digitalWrite(SW_pin, HIGH);
lc.shutdown(0,false);
lc.setIntensity(0,8);
lc.clearDisplay(0);
}
void writeGameOver() {
byte a[]={B00000000, B00111110, B01000001, B01001001, B01111010, B00000000, // G
B00000000, B01111110, B00010001, B00010001, B01111110, B00000000, // A
B00000000, B01111111, B00000010, B00001100, B00000010, B01111111, B00000000, // M
B00000000, B01111111, B01001001, B01001001, B01000001, B00000000, // E
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, //
B00000000, B00111110, B01000001, B01000001, B00111110, B00000000, // O
B00000000, B00001111, B00110000, B01000000, B00110000, B00001111, B00000000, // V
B00000000, B01111111, B01001001, B01001001, B01000001, B00000000, // E
B00000000, B01111111, B00001001, B00001001, B01110110, B00000000, B00000000 // R
};
for(int i=0; i<=49; i+=1) {
lc.setRow(0,0,a[i]);
lc.setRow(0,1,a[i+1]);
lc.setRow(0,2,a[i+2]);
lc.setRow(0,3,a[i+3]);
lc.setRow(0,4,a[i+4]);
lc.setRow(0,5,a[i+5]);
lc.setRow(0,6,a[i+6]);
lc.setRow(0,7,a[i+7]);
delay(120);
}
}
void writeSmile() {
byte a[8]={B00000000,B00010000,B00100110,B01000000,B01000000,B00100110,B00010000,B00000000};
lc.setRow(0,0,a[0]);
lc.setRow(0,1,a[1]);
lc.setRow(0,2,a[2]);
lc.setRow(0,3,a[3]);
lc.setRow(0,4,a[4]);
lc.setRow(0,5,a[5]);
lc.setRow(0,6,a[6]);
lc.setRow(0,7,a[7]);
}
void writeSad() {
byte a[8]={B00000000,B01000000,B00100110,B00100000,B00100000,B00100110,B01000000,B00000000};
lc.setRow(0,0,a[0]);
lc.setRow(0,1,a[1]);
lc.setRow(0,2,a[2]);
lc.setRow(0,3,a[3]);
lc.setRow(0,4,a[4]);
lc.setRow(0,5,a[5]);
lc.setRow(0,6,a[6]);
lc.setRow(0,7,a[7]);
}
void pallino(int n) { // disegna l’asteroide sulla matrice
if(n==1) {
lc.setLed(0,0,7,1);
lc.setLed(0,0,6,1);
lc.setLed(0,1,6,1);
lc.setLed(0,1,7,1);
}
if(n==2) {
lc.setLed(0,3,6,1);
lc.setLed(0,3,7,1);
lc.setLed(0,4,6,1);
lc.setLed(0,4,7,1);
}
if(n==3) {
lc.setLed(0,7,6,1);
lc.setLed(0,7,7,1);
lc.setLed(0,6,6,1);
lc.setLed(0,6,7,1);
}
if(n==4) {
lc.setLed(0,7,3,1);
lc.setLed(0,7,4,1);
lc.setLed(0,6,3,1);
lc.setLed(0,6,4,1);
}
if(n==5) {
lc.setLed(0,6,0,1);
lc.setLed(0,7,0,1);
lc.setLed(0,6,1,1);
lc.setLed(0,7,1,1);
}
if(n==6) {
lc.setLed(0,3,0,1);
lc.setLed(0,4,0,1);
lc.setLed(0,3,1,1);
lc.setLed(0,4,1,1);
}
if(n==7) {
lc.setLed(0,0,0,1);
lc.setLed(0,0,1,1);
lc.setLed(0,1,0,1);
lc.setLed(0,1,1,1);
}
if(n==8) {
lc.setLed(0,0,3,1);
lc.setLed(0,0,4,1);
lc.setLed(0,1,3,1);
lc.setLed(0,1,4,1);
}
}
void clearpallino(int n) { // cancella l’asteroide dalla matrice
if(n==1) {
lc.setLed(0,0,7,0);
lc.setLed(0,0,6,0);
lc.setLed(0,1,6,0);
lc.setLed(0,1,7,0);
}
if(n==2) {
lc.setLed(0,3,6,0);
lc.setLed(0,3,7,0);
lc.setLed(0,4,6,0);
lc.setLed(0,4,7,0);
}
if(n==3) {
lc.setLed(0,7,6,0);
lc.setLed(0,7,7,0);
lc.setLed(0,6,6,0);
lc.setLed(0,6,7,0);
}
if(n==4) {
lc.setLed(0,7,3,0);
lc.setLed(0,7,4,0);
lc.setLed(0,6,3,0);
lc.setLed(0,6,4,0);
}
if(n==5) {
lc.setLed(0,6,0,0);
lc.setLed(0,7,0,0);
lc.setLed(0,6,1,0);
lc.setLed(0,7,1,0);
}
if(n==6) {
lc.setLed(0,3,0,0);
lc.setLed(0,4,0,0);
lc.setLed(0,3,1,0);
lc.setLed(0,4,1,0);
}
if(n==7) {
lc.setLed(0,0,0,0);
lc.setLed(0,0,1,0);
lc.setLed(0,1,0,0);
lc.setLed(0,1,1,0);
}
if(n==8) {
lc.setLed(0,0,3,0);
lc.setLed(0,0,4,0);
lc.setLed(0,1,3,0);
lc.setLed(0,1,4,0);
}
}
void writeDigit(int i, int m, int r) {
switch(i) {
case 0:
lc.setRow(m,r,B00111110);
lc.setRow(m,r+1,B00100010);
lc.setRow(m,r+2,B00111110);
break;
case 1:
lc.setRow(m,r,B00000000);
lc.setRow(m,r+1,B00000000);
lc.setRow(m,r+2,B00111110);
break;
case 2:
lc.setRow(m,r,B00111010);
lc.setRow(m,r+1,B00101010);
lc.setRow(m,r+2,B00101110);
break;
case 3:
lc.setRow(m,r,B00101010);
lc.setRow(m,r+1,B00101010);
lc.setRow(m,r+2,B00111110);
break;
case 4:
lc.setRow(m,r,B00001110);
lc.setRow(m,r+1,B00001000);
lc.setRow(m,r+2,B00111110);
break;
case 5:
lc.setRow(m,r,B00101110);
lc.setRow(m,r+1,B00101010);
lc.setRow(m,r+2,B00111010);
break;
case 6:
lc.setRow(m,r,B00111110);
lc.setRow(m,r+1,B00101010);
lc.setRow(m,r+2,B00111010);
break;
case 7:
lc.setRow(m,r,B00000010);
lc.setRow(m,r+1,B00000010);
lc.setRow(m,r+2,B00111110);
break;
case 8:
lc.setRow(m,r,B00111110);
lc.setRow(m,r+1,B00101010);
lc.setRow(m,r+2,B00111110);
break;
case 9:
lc.setRow(m,r,B00101110);
lc.setRow(m,r+1,B00101010);
lc.setRow(m,r+2,B00111110);
break;
}
}
void writeNumber(int n, int m) {
int u = n % 10;
int d = n / 10;
writeDigit(d, m, 0);
writeDigit(u, m, 4);
}
void loop() {
if(millis() - last > c) { // inserisce un nuovo asteroide…
int z = random(1,9);
while(lista[z-1]==1) { // …assicurandosi di piazzarlo in una posizione non occupata
z = random(1,9);
}
pallino(z);
lista[z-1] = 1;
asteroidi = asteroidi + 1;
last = millis();
}
if(asteroidi >= 7) { // game over
writeGameOver();
delay(1000);
lc.clearDisplay(0);
writeNumber(level, 0);
delay(2000);
lc.clearDisplay(0);
if(level > 49) { writeSmile(); }
if(level < 50) { writeSad(); }
delay(2000);
lc.clearDisplay(0);
while(1==1) { } // fine del gioco
}
if(analogRead(Y_pin)<100 && analogRead(X_pin)>900 && lista[0]==1) {
clearpallino(1);
asteroidi = asteroidi - 1;
lista[0] = 0;
level = level+1;
if(level%5 == 0) { // la difficoltà aumenta ogni 5 livelli
c = c - difficolta;
}
}
if(analogRead(X_pin)>900 && analogRead(Y_pin)>350 && analogRead(Y_pin)<650 && lista[1]==1) {
clearpallino(2);
asteroidi = asteroidi - 1;
lista[1] = 0;
level = level+1;
if(level%5 == 0) { // la difficoltà aumenta ogni 5 livelli
c = c - difficolta;
}
}
if(analogRead(Y_pin)>900 && analogRead(X_pin)>900 && lista[2]==1) {
clearpallino(3);
asteroidi = asteroidi - 1;
lista[2] = 0;
level = level+1;
if(level%5 == 0) { // la difficoltà aumenta ogni 5 livelli
c = c - difficolta;
}
}
if(analogRead(Y_pin)>900 && analogRead(X_pin)>350 && analogRead(X_pin)<650 && lista[3]==1) {
clearpallino(4);
asteroidi = asteroidi - 1;
lista[3] = 0;
level = level+1;
if(level%5 == 0) { // la difficoltà aumenta ogni 5 livelli
c = c - difficolta;
}
}
if(analogRead(Y_pin)>900 && analogRead(X_pin)<100 && lista[4]==1) {
clearpallino(5);
asteroidi = asteroidi - 1;
lista[4] = 0;
level = level+1;
if(level%5 == 0) { // la difficoltà aumenta ogni 5 livelli
c = c - difficolta;
}
}
if(analogRead(X_pin)<100 && analogRead(Y_pin)>350 && analogRead(Y_pin)<650 && lista[5]==1) {
clearpallino(6);
asteroidi = asteroidi - 1;
lista[5] = 0;
level = level+1;
if(level%5 == 0) { // la difficoltà aumenta ogni 5 livelli
c = c - difficolta;
}
}
if(analogRead(Y_pin)<100 && analogRead(X_pin)<100 && lista[6]==1) {
clearpallino(7);
asteroidi = asteroidi - 1;
lista[6] = 0;
level = level+1;
if(level%5 == 0) { // la difficoltà aumenta ogni 5 livelli
c = c - difficolta;
}
}
if(analogRead(Y_pin)<100 && analogRead(X_pin)>350 && analogRead(X_pin)<650 && lista[7]==1) {
clearpallino(8);
asteroidi = asteroidi - 1;
lista[7] = 0;
level = level+1;
if(level%5 == 0) { // la difficoltà aumenta ogni 5 livelli
c = c - difficolta;
}
}
if(c < 200) { // raggiunta la massima velocità possibile
c = 200;
}
delay(10);
}
Galleria
Commenti