#include <Wire.h> // OLED ekran için
#include <Adafruit_GFX.h> // OLED ekran için
#include <Adafruit_SSD1306.h> // OLED ekran için
#include <TM1637Display.h>
#define SCREEN_WIDTH 128 // OLED ekran genişliği
#define SCREEN_HEIGHT 64 // OLED ekran yüksekliği
#define yukariButonu 44
#define asagiButonu 43
#define secimButonu 42
#define potansiyometre A0
#define can1 31
#define can2 32
#define can3 33
#define DIO 2
#define CLK 3
#define pin1 22
#define pin2 23
#define SEGMENT_A 24
#define SEGMENT_B 25
#define SEGMENT_C 26
#define SEGMENT_D 27
#define SEGMENT_E 28
#define SEGMENT_F 29
#define SEGMENT_G 30
const byte rakamlar[10][7]={
{1,1,1,1,1,1,0},{0,1,1,0,0,0,0},{1,1,0,1,1,0,1},{1,1,1,1,0,0,1},{0,1,1,0,0,1,1},{1,0,1,1,0,1,1},{1,0,1,1,1,1,1},{1,1,1,0,0,0,0},{1,1,1,1,1,1,1},{1,1,1,1,0,1,1} //0-9 arası rakamlarin yanması gereken segment tanımı a,b,c,d,e,f,g
};
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); // OLED ekran nesnesi
TM1637Display scorboard(CLK,DIO);
int secilenSecenek = 1;
bool yukariButonaBasma = false;
bool asagiButonaBasma = false;
bool oyunubaslatma=false;
bool anaekranadon=false;
int paletX = 20; // Palet genişliği
int paletY = 5; // Palet yüksekliği
int palethiz = 5; // Palet hızı
int paletkonum = SCREEN_WIDTH / 2 - paletX / 2; // Paletin başlangıç pozisyonu
int oncekipotdegeri; // pot deger degistirilip degistirilmedigi için
bool tophareketbaslat=false; // top hareketi baslatmak için
int topboyut = 2; // Top boyutu
int topX = SCREEN_WIDTH / 2; // Topun başlangıç X pozisyonu
int topY = SCREEN_HEIGHT - paletY - topboyut - 1; // Topun başlangıç Y pozisyonu
int topyonX = 1; // Topun X yönündeki hareketi
int topyonY = -1; // Topun Y yönündeki hareketi
int tophiz = 1; // Top hızı
int tuglasatir = 4; // dalin satır sayısı
int tuglasutun = 10; // dalin sütun sayısı
int tuglaX = 10; // dalin genişliği
int tuglaY = 5; // dalin yüksekliği
int tuglamesafe = 2; // dalin arası boşluk
bool tugladurum[4][10]; // dalin durumu
int skor = 0; // Oyuncu skoru
uint8_t digitPinsIn[] = {24,25,26,27,28,29,30};
uint8_t segmentPinsIn[] = {22,23};
void setup() {
pinMode(yukariButonu, INPUT_PULLUP);
pinMode(asagiButonu, INPUT_PULLUP);
pinMode(secimButonu, INPUT_PULLUP);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 ekranı başlatılamadı"));
while (1);
}
display.clearDisplay();
display.display();
//display.clearDisplay(); // Ekranı temizleme
scorboard.setBrightness(0x0f); // Parlaklık seviyesi ayarı
scorboard.showNumberDec(skor, false); // Başlangıçta skoru sıfırlama
anaEkranGuncelleme(secilenSecenek);
pinMode(pin1,OUTPUT);
pinMode(pin2,OUTPUT);
pinMode(SEGMENT_A, OUTPUT);
pinMode(SEGMENT_B, OUTPUT);
pinMode(SEGMENT_C, OUTPUT);
pinMode(SEGMENT_D, OUTPUT);
pinMode(SEGMENT_E, OUTPUT);
pinMode(SEGMENT_F, OUTPUT);
pinMode(SEGMENT_G, OUTPUT);
pinMode(can1, OUTPUT);//can led1
pinMode(can2, OUTPUT);//can led2
pinMode(can3, OUTPUT);//can led3
pinMode(potansiyometre, INPUT);
tuglasifirla(); // dalin sıfırlama
}
void loop() {
if(anaekran()==false){
return;
}
else if(anaekranadon==true){
display.display(); // Ekranı temizleme
delay(2000); // 2 saniye bekletme
display.clearDisplay(); // Ekranı temizleme
yukariButonaBasma = false;
asagiButonaBasma = false;
oyunubaslatma=false;
anaekranadon=false;
skor=0;
anaEkranGuncelleme(secilenSecenek);
}
else if(oyunubaslatma==true){
oyuncizim(); // Oyunu çizme
oncekipotdegeri=analogRead(A0);//eklendi
canledleriniYak();
tuglacizim(); // dalin çizme
topcizim(); // Topu çizme
display.display(); // Ekranı güncelleme
oyunguncelle(); // Oyunu güncelleme
SEVENSEGMENT(skor);
}
}
//baslat ve cıkıs secim ekran kodu
bool anaekran(){
if (digitalRead(yukariButonu) == HIGH) {
yukariButonaBasma= false;
}
if (digitalRead(yukariButonu) == LOW && !yukariButonaBasma) {
secilenSecenek--;
if (secilenSecenek < 1) {
secilenSecenek = 2;
}
anaEkranGuncelleme(secilenSecenek);
yukariButonaBasma = true;
delay(100);
}
if (digitalRead(asagiButonu) == HIGH) {
asagiButonaBasma = false;
}
if (digitalRead(asagiButonu) == LOW && !asagiButonaBasma) {
secilenSecenek++;
if (secilenSecenek > 2) {
secilenSecenek = 1;
}
anaEkranGuncelleme(secilenSecenek);
asagiButonaBasma = true;
delay(100);
}
if (digitalRead(secimButonu) == LOW) {
if (secilenSecenek == 1) {
display.clearDisplay(); // Ekranı temizle
display.setTextSize(1); // Yazı boyutunu ayarla
display.setTextColor(SSD1306_WHITE); // Yazı rengini ayarla
display.setCursor(5, 30); // Cursor'u ayarla
display.println("Oyun baslatiliyor..."); // Mesajı ekrana yaz
display.display(); // Ekranı güncelle
delay(1000); // 1 saniye bekle
oyunubaslatma=true;
}
if(secilenSecenek==2) {
display.clearDisplay(); // Ekranı temizle
display.setTextSize(1); // Yazı boyutunu ayarla
display.setTextColor(SSD1306_WHITE); // Yazı rengini ayarla
display.setCursor(0, 5);
display.println(" Oyunumuza\n\n gosterdiginiz\n\n ilgi icin \n\n tesekkurler.");
display.display();
delay(1000); // 1 saniye bekle
oyunubaslatma=false;
}
delay(1000);
}
return oyunubaslatma;
}
void anaEkranGuncelleme(int secilen) {
// Ekranda temizle
display.clearDisplay();
// Başlangıç metnini yaz
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(30, 20); // Yükseklik değeri değiştirildi
display.println("BASLAT");
display.setCursor(30, 40); // Yükseklik değeri değiştirildi
display.println("CIKIS");
// Seçilen seçeneği işaretle
display.setCursor(10, secilen * 20); // Yükseklik değeri değiştirildi
display.write('>');
// Ekranı güncelle
display.display();
}
void oyuncizim() {
display.clearDisplay(); // Ekranı temizleme
display.drawRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, WHITE); // Oyun alanını çizme
//EKLEndi z
if(tophareketbaslat==true){
paletkonum = map(analogRead(A0), 0, 1023, 0, SCREEN_WIDTH - paletX); // Potansiyometreye göre paletin konumunu güncelleme
}
else{
paletkonum = SCREEN_WIDTH/2-paletX/2; // Potansiyometreye göre paletin konumunu güncelleme
}
display.fillRect(paletkonum, SCREEN_HEIGHT - paletY, paletX, paletY, WHITE); // Paleti çizme
tuglacizim(); // dalin çizme
topcizim(); // Topu çizme
scorboard.showNumberDec(skor, false); // Başlangıçta skoru sıfırlama
}
void tuglacizim() {
for (int i = 0; i < tuglasatir; i++) {
for (int j = 0; j < tuglasutun; j++) {
if (tugladurum[i][j]) {
int tuglayonX = j * (tuglaX + tuglamesafe);
int tuglayonY = i * (tuglaY + tuglamesafe);
display.fillRect(tuglayonX, tuglayonY, tuglaX, tuglaY, WHITE); // dalin çizme
}
}
}
}
void topcizim() {
display.fillCircle(topX, topY, topboyut, WHITE); // Topu çizme
}
void oyunguncelle() {
//eklendi yer
int potdegeri = analogRead(potansiyometre);
if (oncekipotdegeri != potdegeri) {
oncekipotdegeri = potdegeri;
tophareketbaslat = true;
}
if (tophareketbaslat==true) {
paletkonum = map(potdegeri, 0, 1023, 0, SCREEN_WIDTH - paletX); // Potansiyometre ile paleti hareket ettirme
topX += topyonX * tophiz; // Topun X pozisyonunu güncelleme
topY += topyonY * tophiz; // Topun Y pozisyonunu güncelleme
// Topun sınırlara çarpma kontrolü
if (topX <= 0 || topX >= SCREEN_WIDTH - topboyut) {
topyonX *= -1; // X yönünü tersine çevirme
}
if (topY <= 0) {
topyonY *= -1; // Y yönünü tersine çevirme
}
if (topY >= SCREEN_HEIGHT - topboyut) {
oyunbitti(); // Topun alt kısmından düşmesi durumunda oyunu sonlandırma
}
// Paletle çarpışma kontrolü
if (topX >= paletkonum && topX <= paletkonum + paletX && topY >= SCREEN_HEIGHT - paletY - topboyut) {
topyonY *= -1; // Y yönünü tersine çevirme
}
// dalin ile çarpışma kontrolü
for (int i = 0; i < tuglasatir; i++) {
for (int j = 0; j < tuglasutun; j++) {
if (tugladurum[i][j]) {
int tuglayonX = j * (tuglaX + tuglamesafe);
int tuglayonY = i * (tuglaY + tuglamesafe);
if (topX + topboyut >= tuglayonX && topX <= tuglayonX + tuglaX && topY + topboyut >= tuglayonY && topY <= tuglayonY + tuglaY) {
topyonY = 1; // Y yönünü tersine çevirme
tugladurum[i][j] = false; // dalin
skor++; // Skoru artırma
if (skor == tuglasatir * tuglasutun) {
levelatla(); // Tüm dalin bitiğinde bir sonraki seviyeye geçme
}
}
}
}
}
}
}
void oyunbitti() {
display.clearDisplay(); // Ekranı temizleme
display.setTextSize(1); // Yazı boyutunu ayarlama
display.setTextColor(WHITE); // Yazı rengini ayarlama
display.setCursor(0, SCREEN_HEIGHT / 2 - 5); // Yazının konumunu ayarlama
display.println("Game Over!"); // Yazıyı ekrana yazma
display.setCursor(0, SCREEN_HEIGHT / 2 + 5); // Yazının konumunu ayarlama
display.print("Score: "); // Skoru ekrana yazma
display.println(skor); // Skoru ekrana yazma
display.display(); // Ekranı güncelleme
delay(3000);
anaekranadon=true;
}
void levelatla() {
tophiz++; // Top hızını artırma
tuglasifirla(); // dalin sıfırlama
topX = SCREEN_WIDTH / 2; // Topu başlangıç pozisyonuna getirme
topY = SCREEN_HEIGHT - paletY - topboyut - 1; // Topu başlangıç pozisyonuna getirme
}
void tuglasifirla() {
for (int i = 0; i < tuglasatir; i++) {
for (int j = 0; j < tuglasutun; j++) {
tugladurum[i][j] = true; // dalin tamir etme
}
}
}
void SEVENSEGMENT(int skor){
int yuzlerbasamagi=skor/100;
int onlarbasamagi=skor/10;
int birlerbasamagi=skor%10;
digitalWrite(pin1, 1);
digitalWrite(pin2, 1);
skoruSegmentYaz(birlerbasamagi);
digitalWrite(pin1, 1);
digitalWrite(pin2, 0);
delay(1);
digitalWrite(pin1, 1);
digitalWrite(pin2, 1);
skoruSegmentYaz(onlarbasamagi);
digitalWrite(pin1, 0);
digitalWrite(pin2, 1);
}
void skoruSegmentYaz(int deger){
for (int i = 0; i < 7; i++) {
digitalWrite(SEGMENT_A + i, rakamlar[deger][i]); // Birinci basamak segmentlerini ayarla
}
}
void canledleriniYak(){
digitalWrite(can1, HIGH);
digitalWrite(can2, HIGH);
digitalWrite(can3, HIGH);
}