#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLEDSIFIRLA -1
#define ekranYukseklik 64
#define ekranGenislik 128
Adafruit_SSD1306 display(ekranGenislik, ekranYukseklik, &Wire, OLEDSIFIRLA);
#define POT_PIN A0
#define btn_up 11
#define btn_d 12
#define btn_select 13
int EP=46;
int C=47;
int D=48;
int E=49;
int G=50;
int F=51;
int A=52;
int B=53;
#define paletGenislik 30
#define paletYukseklik 4
#define PALET_Y ekranYukseklik - 2. //45
#define topYaricap 2
#define tuglaGenislik 21
#define tuglaYuksekligi 7
#define tuglaSayisi 6
#define Can 6
float hiz_artis_faktoru = 1.2; // Her seviyede hızın %20 artması için
int oyunSkoru = 0; // Oyunun başında skor sıfırdır
struct Tugla {
int x;
int y;
};
struct DusenNesne {
int x;
int y;
bool aktif;
};
DusenNesne dusenNesne;
Tugla tuglalar[tuglaSayisi];
int potansiyometre; // Potansiyometre değeri
int paletHizi = 5; // Palet hareket hızı
bool oyunBasladi = false; // Oyun başladı mı kontrol et
int topHizX = 2;
int topHizY = -2;
int topKonumX = ekranGenislik / 2;
int topKonumY = ekranYukseklik / 2;
int paletKonumX = (ekranGenislik - paletGenislik) / 2;
int baslangicTopHizX = 2;
int baslangicTopHizY = -2;
int canSayisi = Can;
int kirilanTuglaSayisi = 0;
int secilen_Menu= 0; // menüden komut seç
bool secimYapildiMi = false; // Seçim yapıldı mı kontrol et
void ledGosterge(int can) {
if (can == 6) {
digitalWrite(14, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
} else if (can == 4) {
digitalWrite(14, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
} else if (can == 2) {
digitalWrite(14, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
} else if (can == 0) {
digitalWrite(14, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
}
}
void nums(int sayi)
{
switch(sayi)
{
case 0 :
digitalWrite(E,LOW);
digitalWrite(D,LOW);
digitalWrite(C,LOW);
digitalWrite(B,LOW);
digitalWrite(A,LOW);
digitalWrite(F,LOW);
digitalWrite(G,HIGH);
break;
case 1:
digitalWrite(E,HIGH);
digitalWrite(D,HIGH);
digitalWrite(C,LOW);
digitalWrite(B,LOW);
digitalWrite(A,HIGH);
digitalWrite(F,HIGH);
digitalWrite(G,HIGH);
break;
case 2:
digitalWrite(E,LOW);
digitalWrite(D,LOW);
digitalWrite(C,HIGH);
digitalWrite(B,LOW);
digitalWrite(A,LOW);
digitalWrite(F,HIGH);
digitalWrite(G,LOW);
break;
case 3:
digitalWrite(E,HIGH);
digitalWrite(D,LOW);
digitalWrite(C,LOW);
digitalWrite(B,LOW);
digitalWrite(A,LOW);
digitalWrite(F,HIGH);
digitalWrite(G,LOW);
break;
case 4:
digitalWrite(E,HIGH);
digitalWrite(D,HIGH);
digitalWrite(C,LOW);
digitalWrite(B,LOW);
digitalWrite(A,HIGH);
digitalWrite(F,LOW);
digitalWrite(G,LOW);
break;
case 5:
digitalWrite(E,HIGH);
digitalWrite(D,LOW);
digitalWrite(C,LOW);
digitalWrite(B,HIGH);
digitalWrite(A,LOW);
digitalWrite(F,LOW);
digitalWrite(G,LOW);
break;
case 6:
digitalWrite(E,LOW);
digitalWrite(D,LOW);
digitalWrite(C,LOW);
digitalWrite(B,HIGH);
digitalWrite(A,LOW);
digitalWrite(F,LOW);
digitalWrite(G,LOW);
break;
case 7:
digitalWrite(E,HIGH);
digitalWrite(D,HIGH);
digitalWrite(C,LOW);
digitalWrite(B,LOW);
digitalWrite(A,LOW);
digitalWrite(F,HIGH);
digitalWrite(G,HIGH);
break;
case 8:
digitalWrite(E,LOW);
digitalWrite(D,LOW);
digitalWrite(C,LOW);
digitalWrite(B,LOW);
digitalWrite(A,LOW);
digitalWrite(F,LOW);
digitalWrite(G,LOW);
break;
case 9:
digitalWrite(E,HIGH);
digitalWrite(D,LOW);
digitalWrite(C,LOW);
digitalWrite(B,LOW);
digitalWrite(A,LOW);
digitalWrite(F,LOW);
digitalWrite(G,LOW);
break;
}
}
void setup() {
pinMode(E, OUTPUT);
pinMode(D, OUTPUT);
pinMode(C, OUTPUT);
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(F, OUTPUT);
pinMode(G, OUTPUT);
pinMode(EP, OUTPUT);
pinMode(14, OUTPUT); // 1. LED
pinMode(2, OUTPUT); // 2. LED
pinMode(3, OUTPUT); // 3. LED
pinMode(btn_up, INPUT_PULLUP);
pinMode(btn_d, INPUT_PULLUP);
pinMode(btn_select, INPUT_PULLUP);
Serial.begin(9600);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("fail"));
for(;;);
}
display.display();
delay(1800);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10,10);
display.println("Tugla Kirma Oyunu");
display.setCursor(10,25);
display.println(">Oyunu Baslat");
display.setCursor(10,40);
display.println("Oyundan Cik");
display.display();
randomSeed(analogRead(0));
TuglaDizayn();
}
void loop() {
// Potansiyometre değerini oku
potansiyometre = analogRead(POT_PIN);
nums(kirilanTuglaSayisi);
if (!oyunBasladi) {
menuSecim();
} else {
// paletin hareket etmesini sağla
paletKonumX = map(potansiyometre, 0, 1023, 0, ekranGenislik - paletGenislik);
Kontrol_oyun();
Paleti_ciz();
}
}
void Oyunu_Baslat() {
topKonumX = paletKonumX + paletGenislik / 2;
topKonumY = PALET_Y - topYaricap;
oyunBasladi = true;
// Tuğlaların dizaynı
TuglaDizayn();
// Düşen nesneyi başlat
dusenNesne.x = tuglalar[0].x + tuglaGenislik / 2; // Örnek olarak ilk tuğla pozisyonu
dusenNesne.y = tuglalar[0].y + tuglaYuksekligi; // Tuğlanın altında başlat
dusenNesne.aktif = false; // Başlangıçta nesne aktif değil
//gerekli düzenlemeleri yap
display.clearDisplay();
Paleti_ciz();
TopuCiz();
TuglaCiz();
display.display();
}
void menuSecim() {
// menü seçimi
if (digitalRead(btn_up) == LOW) {
if (secilen_Menu > 0) {
secilen_Menu--;
Secimi_Guncelle();
}
delay(200);
}
if (digitalRead(btn_d) == LOW) {
if (secilen_Menu < 1) {
secilen_Menu++;
Secimi_Guncelle();
}
delay(200);
}
if (digitalRead(btn_select) == LOW) {
secimYapildiMi = true;
}
if (secimYapildiMi) {
if (secilen_Menu == 0) {
Oyunu_Baslat(); //başlarsa
}
else if (secilen_Menu == 1) {// çıkarsa
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 10);
display.println("Cikis yaptiniz.");
display.println("Tesekkurler:)");
display.display();
while(true);
}
}
}
void Secimi_Guncelle() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10,10);
display.println("TUGLA KIRMA OYUNUNA HOS GELDINIZ");
display.setCursor(10,25);
if (secilen_Menu == 0) {
display.println(">Oyunu Baslat");
display.setCursor(10,40);
display.println("Oyundan Cik");
}
else if (secilen_Menu == 1) {
display.println("Oyunu Baslat");
display.setCursor(10,40);
display.println(">Oyundan Cik");
}
display.display();
}
void Paleti_ciz() {
display.fillRect(paletKonumX, PALET_Y, paletGenislik, paletYukseklik, SSD1306_WHITE);
if ((digitalRead(btn_up) == LOW || digitalRead(btn_d) == LOW)&& oyunBasladi) {
// oyun başladığında top paletin ortasında
topKonumX = paletKonumX + paletGenislik / 2;
}
}
void TopuCiz() {
display.fillCircle(topKonumX, topKonumY, topYaricap, SSD1306_WHITE);
}
void TopunHareketi() {
topKonumX += topHizX;
topKonumY += topHizY;
if (topKonumX >= ekranGenislik - topYaricap || topKonumX <= topYaricap) {
topHizX = -topHizX;
}
if (topKonumY <= topYaricap) {
topHizY = -topHizY;
}
// topun palette sekmesi
if (topKonumY >= PALET_Y -topYaricap && topKonumX >= paletKonumX && topKonumX <= paletKonumX + paletGenislik) {
topHizY = -topHizY;
topHizY = -abs(topHizY);
}
}
void TuglaCiz() {
for (int i = 0; i < tuglaSayisi; i++) {
display.fillRect(tuglalar[i].x, tuglalar[i].y, tuglaGenislik, tuglaYuksekligi, SSD1306_WHITE);
}
// Düşen nesneyi çiz
if (dusenNesne.aktif) {
display.fillRect(dusenNesne.x, dusenNesne.y, 5, 5, SSD1306_WHITE); // Örneğin 5x5 bir dikdörtgen
}
}
void TuglaDizayn() {
int BricksnumPr = 5; //
int Rowsnum = (tuglaSayisi + BricksnumPr - 1) / BricksnumPr; // Calculate number of rows needed
int bWidthGap = tuglaGenislik + 2; // Brick width including gap
int rHeightGap = tuglaYuksekligi + 2; // Row height including gap
int Xstart = (ekranGenislik - BricksnumPr * bWidthGap) / 2; // Starting x position for the bricks
int Ystart = 10; // Starting y position for the first row of bricks
// Create an array to track used positions to avoid overlaps
bool pozisyon[BricksnumPr][Rowsnum] = {false};
for (int i = 0; i < tuglaSayisi; i++) {
int row, col;
bool pozisyonbulundu = false;
// Find a random position that hasn't been used yet
while (!pozisyonbulundu) {
row = random(0, Rowsnum); // Random row index
col = random(0, BricksnumPr); // Random column index
if (!pozisyon[col][row]) {
pozisyonbulundu = true;
pozisyon[col][row] = true;
}
}
// Calculate x and y positions for the brick
int randomX = Xstart + col * bWidthGap;
int randomY = Ystart + row * rHeightGap;
// Set brick position
tuglalar[i].x = randomX;
tuglalar[i].y = randomY;
}
}
void toptuglacarp() {
for (int i = 0; i < tuglaSayisi; i++) {
int TuglaSol = tuglalar[i].x;
int TuglaSag = tuglalar[i].x + tuglaGenislik;
int TuglaUst = tuglalar[i].y;
int TuglaAlt = tuglalar[i].y + tuglaYuksekligi;
int TopSol = topKonumX - topYaricap;
int TopSag = topKonumX + topYaricap;
int TopUst = topKonumY - topYaricap;
int TopAlt = topKonumY + topYaricap;
if (TopSag >= TuglaSol && TopSol <= TuglaSag && TopAlt >= TuglaUst && TopUst <= TuglaAlt) {
kirilanTuglaSayisi++;
oyunSkoru += 1;
tuglalar[i].y = -tuglaYuksekligi;
tuglalar[i].x = -tuglaGenislik;
topHizY = -topHizY;
break;
}
}
}
void Kontrol_oyun() {
TopunHareketi();
display.clearDisplay();
Paleti_ciz();
TopuCiz();
TuglaCiz();
display.display();
// Skoru ekranda göster
display.setTextSize(1); // Yazı boyutunu 1 olarak ayarlıyoruz.
display.setCursor(10, 0);
display.print("Skor: ");
display.print(oyunSkoru);
// Düşen nesne kontrolü
if (!dusenNesne.aktif && random(0, 10) == 0) { // %10 şansla nesne düşsün
dusenNesne.aktif = true;
}
if (dusenNesne.aktif) {
dusenNesne.y++; // Nesneyi aşağı hareket ettir
if (dusenNesne.y > ekranYukseklik) {
dusenNesne.aktif = false; // Nesne ekranın dışına çıktıysa devre dışı bırak
}
}
yanarsa();
toptuglacarp();
oyunbittimi();
ledGosterge(canSayisi);
delay(20);
}
void oyunbittimi() {
if (kirilanTuglaSayisi == tuglaSayisi) {
display.clearDisplay(); // Ekranı temizleyin
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 10); // Skoru ekranda göster
display.print("Tum Tuglalar Kirildi.");
display.println("Tebrikler");
display.setCursor(10, 30); // Son skor bilgisi
display.print("Son Skor: ");
display.println(oyunSkoru);
display.setCursor(10, 50); // Yeni seviyeye geçiş mesajı
display.println("Yeni seviyeye");
display.println("geciliyor...");
display.display(); // Değişiklikleri ekranda göster
delay(3000); // Mesajı 3 saniye boyunca göster
yeniSeviyeBaslat(); // Yeni seviyeyi başlat
}
}
void yeniSeviyeBaslat() {
oyunBasladi = true;
kirilanTuglaSayisi = 0;
TuglaDizayn();
topKonumX = paletKonumX + paletGenislik / 2;
topKonumY = PALET_Y - topYaricap;
// Top hızını %20 artır
topHizX *= hiz_artis_faktoru;
topHizY *= hiz_artis_faktoru;
display.clearDisplay();
Paleti_ciz();
TopuCiz();
TuglaCiz();
display.display();
// Değişiklikleri ekranda göster
}
void yanarsa() {
// top alt trafa giderse
if (topKonumY >= ekranYukseklik - topYaricap) {
canSayisi--;
topKonumY = PALET_Y - topYaricap;
topKonumX = paletKonumX + paletGenislik / 2;
if (canSayisi <= 0) {
Oyunu_Bitir(); // can yoksa oyun bitsin
}
}
}
void Oyunu_Bitir() {
// Top hızını başlangıç hızlarına geri döndür
topHizX = baslangicTopHizX;
topHizY = baslangicTopHizY;
oyunSkoru=0;
oyunBasladi = false; // Oyun durdurulur
secimYapildiMi = false; // Seçim yapılmadı
kirilanTuglaSayisi = 0; // Kırılan tuğla sayısını sıfırla
secilen_Menu = 0; // Ana menüdeki başlangıç seçimi
canSayisi = Can; // Canları başlangıç değerine sıfırla
// Oyunun bittiğini belirtin ve ana menüye dönün
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 10);
display.println("Tum canlar tukendi.");
display.println("Ana Menuye Donucek..");
display.display();
delay(3000); // Birkaç saniye bekleyin
Secimi_Guncelle(); // Ana menüyü göster
}