Ders 17 – Mini OYUN ( lcd ve mesafe sensörü ile)

Merhaba arkadaşlar ;bu uygulamamızda LCD panel mesafe sensörü buzzer ve 2 adet led ile mini bir oyun tasarlayacağız iş bitiminde eğlenceli olacağından eminim

oyun seviye seviye hızlanıyor ve başlamak için sizin elinizi yaklaştırmanızı bekliyor iyi eğlenceler …..

#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

#define TRIG 9
#define ECHO 10
#define BUZZER 3

int obstaclePos = 15;
int playerRow = 1;
int score = 0;
int highScore = 0;
int level = 1;
int gameSpeed = 150;
int kirmiziled =7;
int sariled=6;


bool jumping = false;
unsigned long jumpStart = 0;
bool gameOver = false;
bool waitingStart = true;

// CUSTOM CHARACTERS
byte ship[8] = {
  B00100,B01110,B11111,B01110,B00100,B01010,B10001,B00000
};

byte asteroid[8] = {
  B00110,B01111,B11111,B11111,B11111,B01110,B00100,B00000
};

long readDistance() {
  digitalWrite(TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);
  long duration = pulseIn(ECHO, HIGH);
  return duration * 0.034 / 2;
}

void startMelody() {
  tone(BUZZER, 880, 150);
  delay(200);
  tone(BUZZER, 1200, 150);
  delay(200);
  noTone(BUZZER);
}

void jumpSound() {
  tone(BUZZER, 1500, 80);
}

void levelUpSound() {
  tone(BUZZER, 1000, 100);
  delay(120);
  tone(BUZZER, 1400, 100);
}

void gameOverSound() {
  tone(BUZZER, 400, 300);
  delay(350);
  tone(BUZZER, 300, 400);
  delay(450);
  noTone(BUZZER);
}

void resetGame() {
  score = 0;
  level = 1;
  gameSpeed = 150;
  obstaclePos = 15;
  jumping = false;
  playerRow = 1;
  gameOver = false;
}

void setup() {
  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);
  pinMode(BUZZER, OUTPUT);
  pinMode(kirmiziled, OUTPUT);
  pinMode(sariled, OUTPUT);
  
  lcd.begin();
  lcd.backlight();
  lcd.createChar(0, ship);
  lcd.createChar(1, asteroid);

  highScore = EEPROM.read(0);

  lcd.setCursor(2, 0);
  lcd.print("ROBOTIK ZIPLAMA");
  lcd.setCursor(4, 1);
  lcd.print("HAZIR...");
}

void loop() {

  long distance = readDistance();

  // ---- BEKLEME EKRANI ----
  if (waitingStart) {
    lcd.setCursor(0, 0);
    lcd.print("Baslamak icin...");
    lcd.setCursor(0, 1);
    lcd.print("Elini Yaklastir");
digitalWrite(kirmiziled,LOW);
    if (distance < 5) {
      waitingStart = false;
      resetGame();
      lcd.clear();
      startMelody();
    }
    return;
  }

  // ---- GAME OVER ----
  if (gameOver) {
    lcd.clear();
    lcd.setCursor(3, 0);
    lcd.print("OYUN BITTI");
    lcd.setCursor(0, 1);
    lcd.print("Puan:");
    lcd.print(score);
    digitalWrite(kirmiziled,HIGH);
    gameOverSound();
    delay(2000);

    if (score > highScore) {
      highScore = score;
      EEPROM.write(0, highScore);
    }

    waitingStart = true;
    lcd.clear();
    return;
  }

  // ---- JUMP ----
  if (distance < 10 && !jumping) {
    jumping = true;
    jumpStart = millis();
    playerRow = 0;
    jumpSound();
    digitalWrite(sariled,HIGH);
    delay(100);
    digitalWrite(sariled,LOW);
  }

  if (jumping && millis() - jumpStart > 400) {
    jumping = false;
    playerRow = 1;
  }

  lcd.clear();

  lcd.setCursor(0, playerRow);
  lcd.write(byte(0));

  lcd.setCursor(obstaclePos, 1);
  lcd.write(byte(1));

  obstaclePos--;

  if (obstaclePos == 0 && playerRow == 1) {
    gameOver = true;
  }

  if (obstaclePos < 0) {
    obstaclePos = 15;
    score++;

    if (score % 5 == 0) {
      level++;
      gameSpeed -= 15;
      levelUpSound();
    }
  }

  lcd.setCursor(12, 0);
  lcd.print("S:");
  lcd.print(score);

  lcd.setCursor(12, 1);
  lcd.print("L:");
  lcd.print(level);

  delay(gameSpeed);
}