//Projekt na tablicy jednowymiarowej
//Z zastosowanymi zabezpieczeniami
//Dołożony ekran lcd wyświetlający czas i liczbę kliknięć
//Możliwość ponownej gry bez konieczności restartu arduino
//Mini menu
//(+) Poziomy trudności
//(+) Przycisk cofania/wyjścia z gry
//zrobic coś z losowaniem zer na początku - ROZWIĄZANO
//zabezpieczyć przed tym besty - ROZWIĄZANO
//po wyskoczeniu errora zapętlone menu - ROZWIĄZANO
//sprawdzić co z w momencie wygrania w ostatnim kliknieciu - ROZWIĄZANO
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
int dioda[6]={0,8,9,10,11,12};
int p1[6],p2[6],p3[6],p4[6],p5[6];
int pm1=2,pm2=3,pm3=4,pm4=5,pm5=6,pc=13;
int licznik; //liczba kliknięć
float czas=0; //czas gry
int best_licznik=1000;
float best_czas=1000;
int z;
int win;
int lm=0; //licznik menu
int lt=0; //licznik menu trudności
int wm=10; //wybór menu
int wt=10; //wybór poziomu trudności
int ogr;
void setup()
{
Serial.begin(9600);
pinMode(dioda[1], OUTPUT);
pinMode(dioda[2], OUTPUT);
pinMode(dioda[3], OUTPUT);
pinMode(dioda[4], OUTPUT);
pinMode(dioda[5], OUTPUT);
pinMode(pm1, INPUT_PULLUP);
pinMode(pm2, INPUT_PULLUP);
pinMode(pm3, INPUT_PULLUP);
pinMode(pm4, INPUT_PULLUP);
pinMode(pm5, INPUT_PULLUP);
pinMode(pc, INPUT_PULLUP);
digitalWrite(pm1,1);
digitalWrite(pm2,1);
digitalWrite(pm3,1);
digitalWrite(pm4,1);
digitalWrite(pm5,1);
digitalWrite(pc,1);
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print(" Projekt z pdst.");
lcd.setCursor(0,1);
lcd.print(" mechatroniki");
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Gra logiczna");
lcd.setCursor(0,1);
lcd.print("aut Szymon Orzol");
delay(2000);
lcd.clear();
randomSeed(analogRead(A0));
restart();
}
void restart()
{
wt=10;
wm=10;
int cz[5]; //czy zero
int dupli[5]; //do wychwycenia duplikatów
float a; //zmienna pomocnicza
bool powtorz=1;
while(powtorz==1)
{
cz[0]=cz[1]=cz[2]=cz[3]=cz[4]=0;
dupli[0]=dupli[1]=dupli[2]=dupli[3]=dupli[4]=0;
a=100000;
for(int i=1;i<=5;i++) //losowanie gry (cz. 1/2) i zabezpieczenie przed zerami, fullem i powtórzeniami
{
p1[i]=random(2);//losowanie diod przyciskom
p2[i]=random(2);
p3[i]=random(2);
p4[i]=random(2);
p5[i]=random(2);
cz[0]=cz[0]+p1[i];//zliczanie ilości zapalonych diod przypisanych do przycisku
cz[1]=cz[1]+p2[i];
cz[2]=cz[2]+p3[i];
cz[3]=cz[3]+p4[i];
cz[4]=cz[4]+p5[i];
a=a/10;
dupli[0]=dupli[0]+a*p1[i]; //tworzenie liczb na podstawie przypisanych diod
dupli[1]=dupli[1]+a*p2[i]; //np. przypisanie do przycisku diody pierwszej
dupli[2]=dupli[2]+a*p3[i]; //i ostatniej tworzy liczbę 10001
dupli[3]=dupli[3]+a*p4[i]; //niezwykle pomocne przy szukaniu zduplikowanych przycisków
dupli[4]=dupli[4]+a*p5[i];
}
if((cz[0]==0)||(cz[1]==0)||(cz[2]==0)||(cz[3]==0)||(cz[4]==0))//warunek zebezpieczający przed zerami
{
powtorz=1;
}
else if((cz[0]==5)||(cz[1]==5)||(cz[2]==5)||(cz[3]==5)||(cz[4]==5))//warunek zabezpieczający przed fullem
{
powtorz=1;
}
else if((dupli[0]==dupli[1])||(dupli[0]==dupli[2])||(dupli[0]==dupli[3])||(dupli[0]==dupli[4])||(dupli[1]==dupli[2])||(dupli[1]==dupli[3])||(dupli[1]==dupli[4])||(dupli[2]==dupli[3])||(dupli[2]==dupli[4])||(dupli[3]==dupli[4])) //warunek zebezpieczający przed duplikatami
{
powtorz=1;
}
else
{
powtorz=0;
}
}
//Serial.println(dupli[0]);
int min=0;
while(min<2)//zabezpieczenie przed wciśniętym tylko 1 przyciskiem
{
min=0;
for(int i=0;i<=4;i++) //losowanie gry(klucza) (cz. 2/2)
{
cz[i]=random(2);
//cz[i]=1; //###################################################################
min=min+cz[i];
}
}
while(wm!=0)//konstrukcja całego menu
{
wt=10;
if(((digitalRead(pm1)==0)||(digitalRead(pm2)==0))&&(lm>0))
{
lm--;
while((digitalRead(pm1)==0)||(digitalRead(pm2)==0))
{
}
delay(100);
lcd.clear();
}
else if(((digitalRead(pm4)==0)||(digitalRead(pm5)==0))&&(lm<1))
{
lm++;
while((digitalRead(pm4)==0)||(digitalRead(pm5)==0))
{
}
delay(100);
lcd.clear();
}
if(lm==0)
{
lcd.setCursor(0,0);
lcd.print("> Rozpocznij gre");
lcd.setCursor(0,1);
lcd.print(" Naj. wyniki");
}
else if(lm==1)
{
lcd.setCursor(0,0);
lcd.print(" Rozpocznij gre");
lcd.setCursor(0,1);
lcd.print("> Naj. wyniki");
}
if((lm==0)&&(digitalRead(pm3)==0))
{
while(digitalRead(pm3)==0)
{
}
delay(100);
lcd.clear();
while(wt!=0) //wybór poziomu trudności
{
if(lt==0)
{
lcd.setCursor(0,0);
lcd.print("> Latwy");
lcd.setCursor(0,1);
lcd.print(" Sredni");
ogr=9999;
}
else if(lt==1)
{
lcd.setCursor(0,0);
lcd.print(" Latwy");
lcd.setCursor(0,1);
lcd.print("> Sredni");
ogr=30;
}
else if(lt==2)
{
lcd.setCursor(0,0);
lcd.print(" Sredni");
lcd.setCursor(0,1);
lcd.print("> Trudny");
ogr=20;
}
else if(lt==3)
{
lcd.setCursor(0,0);
lcd.print(" Trudny");
lcd.setCursor(0,1);
lcd.print("> HARDCORE");
ogr=10;
}
if(((digitalRead(pm1)==0)||(digitalRead(pm2)==0))&&(lt>0))
{
lt--;
while((digitalRead(pm1)==0)||(digitalRead(pm2)==0))
{
}
delay(100);
lcd.clear();
}
else if(((digitalRead(pm4)==0)||(digitalRead(pm5)==0))&&(lt<3))
{
lt++;
while((digitalRead(pm4)==0)||(digitalRead(pm5)==0))
{
}
delay(100);
lcd.clear();
}
else if(digitalRead(pc)==0)
{
while(digitalRead(pc)==0)
{
}
delay(100);
lcd.clear();
wt=0;
}
else if(digitalRead(pm3)==0)
{
wt=0;
wm=0;
while(digitalRead(pm3)==0)
{
}
delay(100);
lcd.clear();
}
}
//wm=0;
}
else if((lm==1)&&(digitalRead(pm3)==0))
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Licznik:");
lcd.setCursor(9,0);
lcd.print(best_licznik);
lcd.setCursor(0,1);
lcd.print("Czas:");
lcd.setCursor(6,1);
lcd.print(best_czas);
while(digitalRead(pm3)==0)
{
}
delay(100);
while((digitalRead(pm3)==1)&&(digitalRead(pc)==1))
{
}
while((digitalRead(pm3)==0)||(digitalRead(pc)==0))
{
}
delay(100);
lcd.clear();
}
}
wm=10;
for(int i=1;i<=11;i++) //sygnalizacja gotowości gry(start gry)
{
if(i<=5)
{
digitalWrite(dioda[i],1);
}
else if(i==6)
{
delay(1000);
}
else
{
digitalWrite(dioda[i-6],0);
}
}
if(cz[0]==1) //seria 5 pętli odpowiadająca za stworzenie gry(gwarantowane rozwiązanie)
{
for(int j=1;j<=5;j++)
{
if(p1[j]==1)
{
digitalWrite(dioda[j],!digitalRead(dioda[j]));
}
}
}
if(cz[1]==1)
{
for(int j=1;j<=5;j++)
{
if(p2[j]==1)
{
digitalWrite(dioda[j],!digitalRead(dioda[j]));
}
}
}
if(cz[2]==1)
{
for(int j=1;j<=5;j++)
{
if(p3[j]==1)
{
digitalWrite(dioda[j],!digitalRead(dioda[j]));
}
}
}
if(cz[3]==1)
{
for(int j=1;j<=5;j++)
{
if(p4[j]==1)
{
digitalWrite(dioda[j],!digitalRead(dioda[j]));
}
}
}
if(cz[4]==1)
{
for(int j=1;j<=5;j++)
{
if(p5[j]==1)
{
digitalWrite(dioda[j],!digitalRead(dioda[j]));
}
}
}
z=0;
win=0;
licznik=0;
lcd.clear();
czas=millis();
//Serial.println(czas);
}
void loop()
{
if(digitalRead(pm1)==0)//długa instrukcja warunkowa odpowiadająca za sterowanie
{
licznik++;
for(int i=1;i<=5;i++)
{
if(p1[i]==1)
{
digitalWrite(dioda[i],!digitalRead(dioda[i]));
}
}
while(digitalRead(pm1)==0)
{
}
}
else if(digitalRead(pm2)==0)
{
licznik++;
for(int i=1;i<=5;i++)
{
if(p2[i]==1)
{
digitalWrite(dioda[i],!digitalRead(dioda[i]));
}
}
while(digitalRead(pm2)==0)
{
}
}
else if(digitalRead(pm3)==0)
{
licznik++;
for(int i=1;i<=5;i++)
{
if(p3[i]==1)
{
digitalWrite(dioda[i],!digitalRead(dioda[i]));
}
}
while(digitalRead(pm3)==0)
{
}
}
else if(digitalRead(pm4)==0)
{
licznik++;
for(int i=1;i<=5;i++)
{
if(p4[i]==1)
{
digitalWrite(dioda[i],!digitalRead(dioda[i]));
}
}
while(digitalRead(pm4)==0)
{
}
}
else if(digitalRead(pm5)==0)
{
licznik++;
for(int i=1;i<=5;i++)
{
if(p5[i]==1)
{
digitalWrite(dioda[i],!digitalRead(dioda[i]));
}
}
while(digitalRead(pm5)==0)
{
}
}
else if(digitalRead(pc)==0)
{
digitalWrite(dioda[1],0);
digitalWrite(dioda[2],0);
digitalWrite(dioda[3],0);
digitalWrite(dioda[4],0);
digitalWrite(dioda[5],0);
lcd.clear();
restart();
}
lcd.setCursor(0,0);
lcd.print("Licznik:");
lcd.setCursor(9,0);
lcd.print(licznik);
lcd.setCursor(0,1);
if(ogr<100)
{
lcd.print("Ograniczenie:");
lcd.setCursor(14,1);
lcd.print(ogr);
}
else if(ogr>100)
{
lcd.print("Bez limitu");
}
//digitalWrite(dioda[1],0);
//digitalWrite(dioda[2],0);
//digitalWrite(dioda[3],0);
//digitalWrite(dioda[4],0);
//digitalWrite(dioda[5],0);
//Serial.println(millis());
//delay(2000);
if((digitalRead(dioda[1])==0)&&(digitalRead(dioda[2])==0)&&(digitalRead(dioda[3])==0)&&(digitalRead(dioda[4])==0)&&(digitalRead(dioda[5])==0)&&((millis()-czas)>200))
{
czas=millis()-czas;
czas=czas/1000;
digitalWrite(dioda[1],0);
digitalWrite(dioda[2],0);
digitalWrite(dioda[3],0);
digitalWrite(dioda[4],0);
digitalWrite(dioda[5],0);
//Serial.println(licznik);
//Serial.println(czas);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" WYGRANA!");
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Licznik:");
lcd.setCursor(9,0);
lcd.print(licznik);
lcd.setCursor(0,1);
lcd.print("Czas:");
lcd.setCursor(6,1);
lcd.print(czas);
while(digitalRead(pm3)==1)
{
}
while(digitalRead(pm3)==0)
{
}
delay(100);
if(licznik<best_licznik)
{
best_licznik=licznik;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" NOWY REKORD!");
lcd.setCursor(0,1);
lcd.print("Nowy licznik:");
lcd.setCursor(14,1);
lcd.print(best_licznik);
while(digitalRead(pm3)==1)
{
}
while(digitalRead(pm3)==0)
{
}
delay(100);
}
if(czas<=best_czas)
{
best_czas=czas;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" NOWY REKORD!");
lcd.setCursor(0,1);
lcd.print("Nowy czas:");
lcd.setCursor(11,1);
lcd.print(best_czas);
while(digitalRead(pm3)==1)
{
}
while(digitalRead(pm3)==0)
{
}
delay(100);
}
lcd.clear();
restart();
}
else if((licznik>=ogr)&&((digitalRead(dioda[1])==1)||(digitalRead(dioda[2])==1)||(digitalRead(dioda[3])==1)||(digitalRead(dioda[4])==1)||(digitalRead(dioda[5])==1)))
{
digitalWrite(dioda[1],0);
digitalWrite(dioda[2],0);
digitalWrite(dioda[3],0);
digitalWrite(dioda[4],0);
digitalWrite(dioda[5],0);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" PRZEGRANA!");
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Przekroczono");
lcd.setCursor(0,1);
lcd.print(" limit klikniec");
while(digitalRead(pm3)==1)
{
}
while(digitalRead(pm3)==0)
{
}
delay(100);
lcd.clear();
restart();
}
else if((digitalRead(dioda[1])==0)&&(digitalRead(dioda[2])==0)&&(digitalRead(dioda[3])==0)&&(digitalRead(dioda[4])==0)&&(digitalRead(dioda[5])==0)&&((millis()-czas)<200))
{
lcd.clear();
lcd.print("ERROR");
while(digitalRead(pm3)==1)
{
}
while(digitalRead(pm3)==0)
{
}
delay(100);
restart();
}
}