Java ile Tetris Oyunu ve Kodları
Bu makalede Nesneye Dayalı Analiz ve Tasarım dersindeki grup ödevimizden bahsedeceğim..Her nekadar grup ödevi de olsa yapımı tamamen bana aittir. Oyun Java programlama dili kullanılarak yazıldı. Yeni başlayan arkadaşlar için çok önemli kodlar içermektedir. Kalıtım, sınıf yapısı ve grafik çizme gibi..
öncelikle kodları görmek için Netbeans adlı ide'yi
Linkleri sadece kayıtlı üyeler görebilir. Linkleri görebilmek için Üye Girişi yapın veya ücretsiz olarak Kayıt Olun
Oyunun Çalışması ve Kodların İşleyişi
[*=center]1)b_Pencere.java ;
Pencere sınıfımızı oluşturduk ve JFrame’in özelliklerini taşıyacağından dolayı JFrame’den kalıtım aldık, sonra pencerenin ekranımızın tam ortasında gözükmesi için gereken kodları yazdık, genişlik ve yükseklik değerlerini ve diğer parametreleri ayarladıktan sonra a_Main.java içerisine ekledik.
[*=center]2)c_Panel.java ;
Oyunumuzun en önemli sınıfıdır. JLayeredPane’den kalıtım aldık ve onun özelliklerinden faydalanacağız. Global değişkenlerimizi belirledik,birçok label oluşturup onları Yazilar() methoduna yerleştirdik ve methodu kurucu methodumuzun içerisine yazarak label’ların penceremizde görünmesini sağladık.
2 Adet Timer nesnesi oluşturduk, 1.si şekillerin aşağıya kayması için,2.si ise Oyunun süresini göstermek için. Oyunun en başında rastgele oluşan değerler ile bir şekli oluşturuyoruz ve o şekli AbstractSinif Türündeki Abs değişkenine atıyoruz, bu şekilde ilk şekil aşağıya doğru inmeye başlıyor.
JLayeredPane’in paintComponent methodunu ezdirerek kendimize uygun olarak tekrardan kullanıyoruz. Bu methotta pencereki sabit olan çizimler ve sonraki gelecek şekli çizdiriyoruz.
ActionListener’dan yararlanarak Zamanlayici adında bir sınıf oluşturduk ve şekillerin Timer nesnesiyle belirli aralıklarla aşağıya kaymasını sağladık.
Yine aynı şekilde Zamanlayici2 adında bir sınıf daha oluşturarak 2. Timer ile süreyi hesaplattırdık ve Zamana bağlı olarak Level’ın artmasını sağladık.
Keylistener özelliğini kullanarak KlavyeDinleyici sınıfını oluşturduk ve oyunun klavye kontrolleri ile oynanmasını sağladık. Klavye kontrolleri tablodaki gibidir:
2 Adet Timer nesnesi oluşturduk, 1.si şekillerin aşağıya kayması için,2.si ise Oyunun süresini göstermek için. Oyunun en başında rastgele oluşan değerler ile bir şekli oluşturuyoruz ve o şekli AbstractSinif Türündeki Abs değişkenine atıyoruz, bu şekilde ilk şekil aşağıya doğru inmeye başlıyor.
JLayeredPane’in paintComponent methodunu ezdirerek kendimize uygun olarak tekrardan kullanıyoruz. Bu methotta pencereki sabit olan çizimler ve sonraki gelecek şekli çizdiriyoruz.
ActionListener’dan yararlanarak Zamanlayici adında bir sınıf oluşturduk ve şekillerin Timer nesnesiyle belirli aralıklarla aşağıya kaymasını sağladık.
Yine aynı şekilde Zamanlayici2 adında bir sınıf daha oluşturarak 2. Timer ile süreyi hesaplattırdık ve Zamana bağlı olarak Level’ın artmasını sağladık.
Keylistener özelliğini kullanarak KlavyeDinleyici sınıfını oluşturduk ve oyunun klavye kontrolleri ile oynanmasını sağladık. Klavye kontrolleri tablodaki gibidir:
Aşağı Yön Tuşu | Hızlandırma |
Yukarı Yön Tuşu | Şekilleri Döndürme |
Sağ Yön Tuşu | Şekli Sağa Kaydırma |
Sol Yön Tuşu | Şekli Sola Kaydırma |
Space Tuşu | Duraklat / Devam Et |
Enter Tuşu | Yeni Oyun |
Kaydırma denetleyici methotlarımız ile şekillerin en sağda ve en soldaki durumlarına göre sorunsuz dönmelerini sağladık.
For döngüsünü kullanarak en alt satırdan itibaren sütunların dolu olup olmadığını kontrol ettik, eğer aynı satırın tüm sütunları dolu ise 2 boyutlu dizimizin tüm elemanlarını birer satır aşağı kaydırdık, Tüm bunları yapan SatirYokEt methodumuzu 4 kez kullandık, çünkü tek seferde en fazla 4 satır yokedebiliyoruz (Çubuk şekli ile).
For döngüsünü kullanarak en alt satırdan itibaren sütunların dolu olup olmadığını kontrol ettik, eğer aynı satırın tüm sütunları dolu ise 2 boyutlu dizimizin tüm elemanlarını birer satır aşağı kaydırdık, Tüm bunları yapan SatirYokEt methodumuzu 4 kez kullandık, çünkü tek seferde en fazla 4 satır yokedebiliyoruz (Çubuk şekli ile).
[*=center]3)d_Kutu.java ;
Oyunda kullanılacak kutuyu çizdireceğimiz sınıfımızı oluşturduk. JLabel’ın özelliklerini kullanacağımız için jlabel’dan kalıtım aldık. kurucu methodumuzun içine koordinatlarını ve boyutlarını girdik. Bir kutu için gerekli renkleri belirledik ve 25*25 lik çizimlerimizi yaptık.Aşağıya, sağa ve sola gitmesi için gerekli methotlarımızı yazdık.
[*=center]4)AbstractSinif.java ;
Tüm şekillerimizi oluşturduktan sonra hepsinde ortak olan işlemleri abstract sınıf oluşturarak biraraya topladık. Her şekil 4 kez dönüyor ve her şeklin başlangıç koordinatları aynı, ayrıca her şekil 4 adet kutudan oluşuyor. Her şeklin gidebileceği sınırlar aynı ve her oluşturulan kutu nesnesi bir arraylist’e atılıyor.
Sekil1_T.java ;
İlk olarak oluşturulan ilk kutuya başlangıç koordinatımızı verdikten sonra 2.,3., ve 4. Kutuları 1. Kutunun koordinatlarına göre ayarlıyoruz. Döndürme işlemleri 4 adet methottan oluşmakta ve herbir methotta merkezdeki kutunun koordinatlarına x ve y diyerek diğer kutuları onun koordinatına göre ayarlıyoruz, böylece kutu sadece kendi etrafında dönüyor yani dönerken sağa veya sola ilerlemiş olmuyor. Tüm bu dönme methotlarında önceden belirlediğimiz donmedenetleyicisi methodunu da kullanıyoruz. Çünkü şekiller döndüğünde bir kısmı dışarda kalabilir bu ise bizim için istenmeyen bir durumdur . Diğer kalan 6 şeklin çalışma mantığı da yine aynıdır, sadece kutuların birbirlerine göre x ve y koordinatları değişmektedir.
Diğer Açıklamalar :
Oyunda 2 boyutlu matris kullanılmış ve şekiller ile doldukça her kutunun bulunduğu yere denk gelen matris elemanına 1 değeri atanmıştır. Kontroller de buna göre yapılmıştır.” 1” Dolu, “0 “ ise o karenin boş olduğu anlamına gelmektedir. Ayrıca oyunumuzun b_pencere ve a_main sınıfını sildikten sonra eklediğimiz JApplet sınıfının init() methoduna add(new a_panel()); kodunu ekleyerek applet versiyonunu da yapmış olduk. Ayrıca kutu sınıfı panel’e, panel pencereye, pencere de main class’ına ekleneceği için ve bu sırada kalmaları bize kolaylık sağladığı için farklı bir isimlendirme yöntemi kullandık.
Puanlama Sistemi :
Sekil1_T.java ;
İlk olarak oluşturulan ilk kutuya başlangıç koordinatımızı verdikten sonra 2.,3., ve 4. Kutuları 1. Kutunun koordinatlarına göre ayarlıyoruz. Döndürme işlemleri 4 adet methottan oluşmakta ve herbir methotta merkezdeki kutunun koordinatlarına x ve y diyerek diğer kutuları onun koordinatına göre ayarlıyoruz, böylece kutu sadece kendi etrafında dönüyor yani dönerken sağa veya sola ilerlemiş olmuyor. Tüm bu dönme methotlarında önceden belirlediğimiz donmedenetleyicisi methodunu da kullanıyoruz. Çünkü şekiller döndüğünde bir kısmı dışarda kalabilir bu ise bizim için istenmeyen bir durumdur . Diğer kalan 6 şeklin çalışma mantığı da yine aynıdır, sadece kutuların birbirlerine göre x ve y koordinatları değişmektedir.
Diğer Açıklamalar :
Oyunda 2 boyutlu matris kullanılmış ve şekiller ile doldukça her kutunun bulunduğu yere denk gelen matris elemanına 1 değeri atanmıştır. Kontroller de buna göre yapılmıştır.” 1” Dolu, “0 “ ise o karenin boş olduğu anlamına gelmektedir. Ayrıca oyunumuzun b_pencere ve a_main sınıfını sildikten sonra eklediğimiz JApplet sınıfının init() methoduna add(new a_panel()); kodunu ekleyerek applet versiyonunu da yapmış olduk. Ayrıca kutu sınıfı panel’e, panel pencereye, pencere de main class’ına ekleneceği için ve bu sırada kalmaları bize kolaylık sağladığı için farklı bir isimlendirme yöntemi kullandık.
Puanlama Sistemi :
Zorluk | Hız (sn) | Zaman Aralığı (sn) | Bir Satır için Alınan Puan |
Level 1 | 0,50 | 0 - 119 | 1000 |
Level 2 | 0,45 | 120 -179 | 2000 |
Level 3 | 0,40 | 180 - 239 | 3000 |
Level 4 | 0,35 | 240 - 299 | 4000 |
Level 5 | 0,30 | 300 – 359 | 6000 |
Level 6 | 0,25 | 360 - 419 | 8000 |
Level 7 | 0,20 | 420 à | 10000 |
Not: Zorluk derecesi oyunda geçirilen süre arttıkça artmaktadır.
Kaynak kodlarını ve çalıştırılabilir dosyayı aşağıdaki butona tıklayarak indirebilirsiniz.
Linkleri sadece kayıtlı üyeler görebilir. Linkleri görebilmek için Üye Girişi yapın veya ücretsiz olarak Kayıt Olun
Linkleri sadece kayıtlı üyeler görebilir. Linkleri görebilmek için Üye Girişi yapın veya ücretsiz olarak Kayıt Olun
Linkleri sadece kayıtlı üyeler görebilir. Linkleri görebilmek için Üye Girişi yapın veya ücretsiz olarak Kayıt Olun