#include <Button.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSans9pt7b.h>


#define veripin 8
#define depopin 9
#define saatpin 10
#define ldrpin 4
#define buzzerpin 6
#define OLED_ADDR   0x3C
#define OLED_RESET 4
Button yukariBtn(2);
Button secmeBtn(5);
Button asagiBtn(3);
Button atesetmeBtn(7);

#define SCREEN_WIDTH 128  
#define SCREEN_HEIGHT 64  
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

const unsigned char PROGMEM uzaygemisi  []  = {
  0xff, 0xc0, 0xf3, 0xc0, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xc0, 0xfb, 0xc0, 0xe1, 0xc0, 0xfc, 0xc0,
  0xff, 0xc0
};


void setup() {
  pinMode(veripin, OUTPUT);
  pinMode(saatpin, OUTPUT);
  pinMode(depopin, OUTPUT);
  pinMode(A0, INPUT);
  pinMode(ldrpin, INPUT);
  pinMode(buzzerpin, OUTPUT);
  yukariBtn.begin();
  secmeBtn.begin();
  asagiBtn.begin();
  atesetmeBtn.begin();
  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
  display.display();
 display.clearDisplay();
}


String engeller [3] = {"Meteor", "UzayCopu", "Dokunulmazlik"};
String oduller [2] = {"Can", "Silah"};

int oyunbasla = 0;
int gemikonum = 0;
int oyun1 = 0;
int oyun2 = 0;

byte menuSayac = 1;
bool mermi = false;
int zorluk = 0;
int z = 0;
int silah = 3;
int can = 3;
static int score = 0;
byte leds;
bool oyunvar = false;
int meteorx = 117; int meteory = 0;
int uzaycopux = 117; int uzaycopuy = 0;
int canx = 117; int cany = 0;
int silahx = 117; int silahy = 0;
int dokunulmazlikx = 117; int dokunulmazliky = 0;
int secim = 0;
int kaymahizi = 1;
int sayi = 0;
int flag = 0;  
int engelhareket = 0;  
int engelhiz = 1;  
int engelhiz1 = 10;
int kaymahizi1 = 5;
int siyah = 0;
int beyaz = 1;
int mermikonumx = 0;
int mermikonumy = 0;
static int engelsayac = 0;
int sayac = 0;
static unsigned long eskiZaman = 0;
static unsigned long yeniZaman = 0;
unsigned long gamestart = 0; 
unsigned long  rndm = 0;  
unsigned long zaman = 0;
  
void loop() {
  display.clearDisplay();

  if (oyunbasla == 0 && zorluk == 0 && z == 0) {
    buttonhareket();
    Menu();
    menuSecim();

  }

  if (oyunbasla == 1 && zorluk == 0 && z == 0) {
 
    basla(siyah, beyaz);
    canled();
 
  }
  if (oyunbasla == 0 && zorluk == 1 && z == 0) {

    zorluksec();

  }
  if (oyunbasla == 0 && zorluk == 1 && z == 1) {

    if (oyun1 == 1 )
    { 
      basla(siyah, beyaz);
      canled();
       
    }
    if (oyun2 == 1) {
 
      basla2(siyah, beyaz);
      canled();

    }

  }
 
  if (can == 0) {
    oyunbasla = 0;
    zorluk = 0;
    z = 0;
    display.clearDisplay();
    menuYinele();
  } 
}

void menuYinele() {

  oyunbasla = 0;
  gemikonum = 0;
  oyun1 = 0;
  oyun2 = 0;

  menuSayac = 1;
  mermi = false;
  zorluk = 0;
  z = 0;
  silah = 3;
  can = 3;
  score = 0;
  leds;
  oyunvar = false;
  meteorx = 117;   meteory = 0;
  uzaycopux = 117;   uzaycopuy = 0;
  canx = 117;   cany = 0;
  silahx = 117;   silahy = 0;
  dokunulmazlikx = 117;  dokunulmazliky = 0;
  secim = 0;
  kaymahizi = 1;
  sayi = 0;
  flag = 0;  
  engelhareket = 0;  
  engelhiz = 1;  
  engelhiz1 = 10;
  kaymahizi1 = 5;
  siyah = 0;
  beyaz = 1;
  mermikonumx = 0;
  mermikonumy = 0;
  engelsayac = 0;
  sayac = 0;
}

void hareket() {

  int konum = analogRead(A0);
  konum =  map(konum, 0, 1023, 0, 53);
  gemikonum = konum;

}

void Menu() {
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(10, 0);
  display.println("Menu");
  display.setTextSize(1);
  display.setCursor(10, 20);
  display.println("Baslat");
  display.setCursor(10, 30);
  display.println("Zorluk");
  display.setCursor(2, (menuSayac * 10) + 10);
  display.println(">");

  display.display();
}
 
void buttonhareket() {
  display.clearDisplay();

  if (yukariBtn.pressed()) {
    if (menuSayac <= 1)
      menuSayac = 2;
    else
      menuSayac--;
  }

  if (asagiBtn.pressed()) {
    if (menuSayac >= 2)
      menuSayac = 1;
    else
      menuSayac++;
  }
 
}

void menuSecim() {

  if (menuSayac == 1 && secmeBtn.pressed()) {
    oyunbasla = 1;
  }

  else if (menuSayac == 2 && secmeBtn.pressed())

  { zorluk = 1;
    menuSayac = 1;
  }
 
}


void zorluksec() {

  display.clearDisplay();

  if (yukariBtn.pressed()) {
    if (menuSayac <= 1)
      menuSayac = 2;
    else
      menuSayac--;
  }

  if (asagiBtn.pressed()) {
    if (menuSayac >= 2)
      menuSayac = 1;
    else
      menuSayac++;
  }


  display.setTextSize(2);
  display.setTextColor(WHITE);

  display.setCursor(10, 0);
  display.println("Zorluk");
  display.setTextSize(1);
  display.setCursor(10, 20);
  display.println("Zorluk 1");
  display.setCursor(10, 30);
  display.println("Zorluk 2");
  display.setCursor(2, (menuSayac * 10) + 10);
  display.println(">");

  if (menuSayac == 1 && secmeBtn.pressed()) {
    oyun1 = 1;
    z = 1;
  }
  else if (menuSayac == 2 && secmeBtn.pressed())
  { oyun2 = 1;
    z = 1;
  }

  display.display();

}

void sayaccan() {

  digitalWrite(depopin, LOW);
  shiftOut(veripin, saatpin, LSBFIRST, leds);
  digitalWrite(depopin, HIGH);
}

void canled() {
  leds = 0;
  sayaccan();

  if (can == 0)
    oyunvar = false;

  if (can == 1) {
    if (silah == 0) {
      bitSet(leds, 4);
      sayaccan();
    }
    if (silah == 1)
    { bitSet(leds, 1);
      sayaccan();
      bitSet(leds, 4);
      sayaccan();
    }
    else if (silah == 2) {
      bitSet(leds, 1);
      sayaccan();
      bitSet(leds, 2);
      sayaccan();
      bitSet(leds, 4);
      sayaccan();
    }
    else if (silah == 3) {
      bitSet(leds, 1);
      sayaccan();
      bitSet(leds, 2);
      sayaccan();
      bitSet(leds, 3);
      sayaccan();
      bitSet(leds, 4);
      sayaccan();
    }
  }
  else if (can == 2) {
    if (silah == 0) {
      bitSet(leds, 4);
      sayaccan();
      bitSet(leds, 5);
      sayaccan();

    }

    if (silah == 1)
    { bitSet(leds, 1);
      sayaccan();
      bitSet(leds, 4);
      sayaccan();
      bitSet(leds, 5);
      sayaccan();
    }
    else if (silah == 2) {
      bitSet(leds, 1);
      sayaccan();
      bitSet(leds, 2);
      sayaccan();
      bitSet(leds, 4);
      sayaccan();
      bitSet(leds, 5);
      sayaccan();
    }
    else if (silah == 3) {
      bitSet(leds, 1);
      sayaccan();
      bitSet(leds, 2);
      sayaccan();
      bitSet(leds, 3);
      sayaccan();
      bitSet(leds, 4);
      sayaccan();
      bitSet(leds, 5);
      sayaccan();
    }
  }
  else if (can == 3) {

    if (silah == 0) {
      bitSet(leds, 4);
      sayaccan();
      bitSet(leds, 5);
      sayaccan();
      bitSet(leds, 6);
      sayaccan();

    }
 
    if (silah == 1)
    { bitSet(leds, 1);
      sayaccan();
      bitSet(leds, 4);
      sayaccan();
      bitSet(leds, 5);
      sayaccan();
      bitSet(leds, 6);
      sayaccan();
    }
    else if (silah == 2) {
      bitSet(leds, 1);
      sayaccan();
      bitSet(leds, 2);
      sayaccan();
      bitSet(leds, 4);
      sayaccan();
      bitSet(leds, 5);
      sayaccan();
      bitSet(leds, 6);
      sayaccan();
    }
    else if (silah == 3) {
      bitSet(leds, 1);
      sayaccan();
      bitSet(leds, 2);
      sayaccan();
      bitSet(leds, 3);
      sayaccan();
      bitSet(leds, 4);
      sayaccan();
      bitSet(leds, 5);
      sayaccan();
      bitSet(leds, 6);
      sayaccan();

    }

  }
}
void basla(int siyah, int beyaz)
{
  hareket();

  display.drawBitmap(0, gemikonum, uzaygemisi, 10, 10, 1);


  if (sayac == 0) {
    gamestart = millis();
    rndm = random(400, 1200);
    sayac = 1;
  }
  zaman = millis();

  if ((zaman - eskiZaman ) > 8000)  
  {
    eskiZaman = zaman;
    engelhiz = engelhiz + 1;

  }

  if ((rndm + gamestart) < zaman) {
    sayac = 0;
    secim = secim + 1;
    if (secim == 1) {
      meteorx = 117;
      meteory = engelhareket;
      engelsayac++;
    } if (secim == 2) {
      uzaycopux = 117;
      uzaycopuy = engelhareket;
      engelsayac++;
    }
    if (secim == 3) {
      dokunulmazlikx = 117;
      dokunulmazliky = engelhareket;

    }
  }

  if (secim > 0) {

    display.fillCircle(meteorx, meteory, 6, beyaz);
    meteorx = meteorx - kaymahizi;
 
  }
  if ( secim > 1)
  {

    display.fillCircle(uzaycopux,  uzaycopuy, 3, beyaz);
    uzaycopux = uzaycopux - kaymahizi;
 
  }
  if ( secim > 2)
  {

    display.drawCircle(dokunulmazlikx, dokunulmazliky, 3, beyaz);
    dokunulmazlikx = dokunulmazlikx - kaymahizi;

  }

  if (flag == 0) {  
    engelhareket = engelhareket + engelhiz; 

  }else
  {
    engelhareket = engelhareket - engelhiz;
  }

  if (engelhareket >= 54)  
    flag = 1;             
  if (engelhareket <= 10)
    flag = 0;


  if (dokunulmazlikx < 1) {
    secim = 0;  
    dokunulmazlikx = 200;  
  }
 
  if ((uzaycopuy <= (gemikonum + 15 )) && ( uzaycopuy >= (gemikonum - 15) ) )
  {

    if (uzaycopux <= 10 && uzaycopux >= 0 )
    { digitalWrite(buzzerpin, HIGH);
      delay(100);
      digitalWrite(buzzerpin, LOW);
      delay(100);
      can--;
 
      uzaycopux = 117; uzaycopuy = -50;
    }
 
  }

  if ((meteory <= (gemikonum + 15 )) && ( meteory >= (gemikonum - 15)  ))

    if (meteorx <= 10 && meteorx >= 0 )
    {
      digitalWrite(buzzerpin, HIGH);
      delay(100);
      digitalWrite(buzzerpin, LOW);
      delay(100);
      can--;
        meteorx = -50; meteory = -50;
    }
 
  if (engelsayac == 14) {
    can++;
    silah++;
    if (can > 3)
      can = 3;
    if (silah > 3)
      silah = 3;
    engelsayac = 0;
  }


  if (atesetmeBtn.pressed() && mermi == false) {

    if (silah < 0)
      silah = 0;

    if (silah > 0)
    { mermi = true;
      mermikonumx = 0;
      mermikonumy = gemikonum + 3;

      silah--;

    }

  }

  if (mermi == true) {
    mermikonumx = mermikonumx + 3;
    display.writeFillRect(mermikonumx, mermikonumy, 10, 1, 1);

  }
  if (mermikonumx > 128)
  {
    mermi = false;
    mermikonumx = 0;
  }
 
  display.display();
 
}
void basla2(int siyah, int beyaz) {
  hareket();

  display.drawBitmap(0, gemikonum, uzaygemisi, 10, 10, beyaz);


  if (sayac == 0) {
    gamestart = millis();
    rndm = random(400, 1200);
    sayac = 1;
  }
  zaman = millis();

  if ((zaman - eskiZaman ) > 5000)  
  {
    eskiZaman = zaman;
    engelhiz1 = engelhiz1 + 1;

  }

  if ((rndm + gamestart) < zaman) {
    sayac = 0;
    secim = secim + 1;
    if (secim == 1) {
      meteorx = 117;
      meteory = engelhareket;
      engelsayac++;

    } if (secim == 2) {
      uzaycopux = 117;
      uzaycopuy = engelhareket;
      engelsayac++;
    }
    if (secim == 3) {
      dokunulmazlikx = 117;
      dokunulmazliky = engelhareket;

    }
  }

  if (secim > 0) {
    display.fillCircle(meteorx, meteory, 6, beyaz);
    meteorx = meteorx - kaymahizi1;


  }
  if ( secim > 1)
  {

    display.fillCircle(uzaycopux,  uzaycopuy, 3, beyaz);
    uzaycopux = uzaycopux - kaymahizi1;


  }
  if ( secim > 2)
  {
    display.drawCircle(dokunulmazlikx, dokunulmazliky, 3, beyaz);
    dokunulmazlikx = dokunulmazlikx - kaymahizi1;

  }

  if (flag == 0) {   
    engelhareket = engelhareket + engelhiz1; 
  }
  else
  {
    engelhareket = engelhareket - engelhiz1;
  }

  if (engelhareket >= 35)  
    flag = 1;            
  if (engelhareket <= 15)
    flag = 0;


  if (dokunulmazlikx < 1) {
    secim = 0;  
    dokunulmazlikx = 200;   
  }

  if ((uzaycopuy <= (gemikonum + 15 )) && ( uzaycopuy >= (gemikonum - 15) ) )
  {

    if (uzaycopux <= 10 && uzaycopux >= 0 )
    { digitalWrite(buzzerpin, HIGH);
      delay(100);
      digitalWrite(buzzerpin, LOW);
      delay(100);
      can--;
      canled();
       uzaycopux = 117; uzaycopuy = -50;
    }
 
  }

  if ((meteory <= (gemikonum + 15 )) && ( meteory >= (gemikonum - 15)  ))

    if (meteorx <= 10 && meteorx >= 0 )
    { digitalWrite(buzzerpin, HIGH);
      delay(100);
      digitalWrite(buzzerpin, LOW);
      delay(100);
      can--;

      canled();

      meteorx = -50; meteory = -50;
    }

  if (engelsayac == 14) {
    can++;
    silah++;
    if (can > 3)
      can = 3;
    if (silah > 3)
      silah = 3;
    engelsayac = 0;
  }
 
  if (atesetmeBtn.pressed() && mermi == false) {

    if (silah < 0)
      silah = 0;

    if (silah > 0)
    { mermi = true;
      mermikonumx = 0;
      mermikonumy = gemikonum + 3;
      silah--;

    }

  }

  if (mermi == true) {
    mermikonumx = mermikonumx + 3;
    display.writeFillRect(mermikonumx, mermikonumy, 10, 1, 1);

  }
  if (mermikonumx > 128)
  {
    mermi = false;
    mermikonumx = 0;
  }
 
  display.display();
 
}


74HC595
74HC595
74HC595
74HC595
74HC595