Software Construction Term Project

https://github.com/AlpEgeAkarsu/BrickBreakerGameJavaSwing

Yukarıda video altında vermiş olduğum GitHub linkinin içerisinde projeye dair her şey var ancak yine de raporu Türkçe olarak aşağıya da ekledim.

          Projeme başlamadan önce, oluşturacağım sınıfları belirledim. Elbette bu sınıfların bazıları kod yazmaya başladıktan sonra ortaya çıksa da bir ön dizayn yarattım. Tasarlamak istediğim oyunun örneklerini internette araştırdım.Bu projede zayıf noktam hiç Java Swing bilmiyor olmamdı. Daha öncesinde hiç Swing projesi geliştirmemiştim. Proje geliştirme sürecimde, baya bir süre yalnızca Java Swing kütüphanesini ve mantığını öğrenmek ile geçirdim.

Kağıt üzerinde bir ön tasarım yaptıktan sonra projemin kodlarını yazmaya başladım.

İlk olarak, yalnızca bir frame ve bir panel oluşturdum. Bütün kodlar panel ve frame içerisinde yer alıyordu. Ben yeni kodları yazdıkça, yeni fikirler ortaya çıkmaya başladı. Panel sınıfının içerisindeki kodların sayısı artmaya başlayınca projeyi sınıflara bölmem gerektiğini farkettim. Swing kütüphanesini de yeni öğrenmemden dolayı her yeni yazdığım kodda yeni şeyler öğreniyordum ancak bu durum kodun karmaşıklığını arttırıyordu. Sınıflara ayırma aşamasında ilk olarak BrickGenerator sınıfını oluşturdum. Bu sınıfta topun çarpacağı bricklerin oluşturulması vardı.

Her ne kadar derste gördüğümüz kurallara aşina olsak da bir proje üzerinde gerçekleştirmek hayli uzun zamanımı alıyordu. Bazı durumlarda panel sınıfının içinden bir rutini başka bir sınıfa aktarmam bir günümü alabiliyordu. Örneğin yalnızca MenuCreator adındaki rutini başka bir sınıfa aktarmam 4 günümü aldı. Gerçekçi olmak gerekirse bu süre hiç inandırıcı değil. Ancak daha önceden tam anlamıyla bir proje geliştirmediğim için ve yeterince nesne yönelimli dilde pratiğimin olmamasından dolayı basit olarak yapılabilecek işlemler bile çok zamanımı aldı. Projeyi oluşturmamın belki %80’i internette araştırma yaparak geçti.

Proje aşamalarına devam edecek olursam, oluşturduğum sınıfların neredeyse hepsini ilk olarak Panel sınıfının içerisinde yazdım. Panel sınıfında çalıştırıldıktan sonra, panel sınıfının karmaşıklığını azaltmak için rutinleri elimden geldiğince sınıflara bölmeye çalıştım. Projenin ilk 15-20 günü Panel sınıfı ve Main sınıfını oluşturmak ile geçti (araştırmalar, Java Swing kütüphanesinin öğrenimi, nesne yönelimli programlama ders tekrarı). Geri kalan zamanımda ise Panel sınıfını başka sınıflara bölmek ile geçirdim.

Projenin sonlarına doğru oyun tam anlamıyla çalışmaya başladıktan sonra oyuna ek özellikler eklemek üzerinde yoğunlaştım. Her geçen gün Java Swing kütüphanesinin daha fazla özelliğini öğrendiğim için, oyuna bir Menu eklemeye karar verdim. Bu Menu için ne eklesem diye düşünürken aklıma Level değişkenini eklemek geldi. Oyuncu her seviye arttırdığında ekrana bir mesaj gelmeliydi. İlk olarak bunun kodunu yazdıktan sonra ek olarak, oyuncu seviyeyi arttırdığında Bricklerin iki seferde kırılması gerekliydi. Bu dışarıdan bakınca çok kolay gelse de üzerinde neredeyse bir günlük bir araştırma yapmamı gerektirdi. Aynı zamanda oyuncu seviyeyi arttırdığı zaman topun hızının artması gerekiyordu ve topun hızı arttığı zaman Paddle da ona göre hızlı hareket etmesi gerekiyordu. Oyuna Level mantığını koyduktan sonra da yeni bir Menu ekledim ve bu Menude de oyuncuya yardımcı olacak bilgiler olmalıydı.

Bu aşamadan sonra, Panel sınıfına ek olarak MenuCreator ve BrickGenerator sınıfları da eklenmişti. Bu aşamada oyun efektif bir şekilde çalışıyordu. Ancak Panel kodu hala karmaşıktı ve bir şekilde bunu düzeltmem gerekiyordu. Panel kodunun içerisindeki Componentlerde bulunan bazı değişkenleri (Ball, Paddle gibi) başka sınıflara aktarmam gerekiyordu. Bu süreçte de bu değişkenleri başka sınıflara aktarırken bir sürü hata ile karşılaştım ve Variables adlı sınıfını oluşturdum. Panel sınıfının içerisinde durma değişikliğe uğrayan bazı değişkenleri Variables sınıfında çalıştırdığımda proje başarılı bir şekilde çalışıyordu. Variables, Panel ve Ball sınıfları da projeye eklendikten sonra Panel sınıfının karmaşıklığı önemli ölçüde azaldı.

Oyunum tamamen bitmiş durumdaydı ve bu süreçten sonra değişken isimlerinin düzeltilmesi, yorum satırlarının oluşturulması, metod isimlerinin daha anlamlı hale getirilmesi üzerinde çalıştım.

Proje raporunun bu kısmında yazılım yapma konusunda öğrendiğim şeyleri açıklayacağım ve öz eleştiri yapacağım. Projenin değerlendirilmesi için bu bölümün oldukça yararlı olacağını düşünüyorum. Bu kısımda maddeler halinde bu durumları inceleyeceğim.

1-  İlk olarak, öz eleştiri ile başlayacağım. Projeye başlamadan önce hiç GUI projesi geliştirmediğim için öğrenme aşamamın biraz uzun sürdüğünü itiraf edebilirim. Ayrıca derste gördüğümüz, bir proje oluşturmadaki gereksinim analizlerinin ve dizayn aşamalarının tam anlamıyla iyi olmadığını söyleyebilirim. Kodlarımı yazmaya başlamadan önce bir kağıda aklımda dizaynı çizmiş olsam da profesyonel olarak bir dizayn oluşturmadım denebilir. Dürüst olmam gerekirse UML grafiklerini projemi bitirdikten sonra oluşturdum. Çünkü projeye başladığımda gerçekten ne yapacağım hakkında hiçbir fikrim yoktu. Öğrenme aşamasında olduğumdan ötürü, projeye başlamadan önce tam anlamıyla bir dizayn ve gereksinim analizi oluşturamadım.

2- Değişkenleri Global olarak tanımlamak

Öz eleştirilere devam edecek olursam projemdeki ikinci problem ise bazı değişkenleri global olarak tanımlamam olabilir. Bu sorunu çözmek için çok fazla araştırma yapmış olsam da tam anlamıyla bir çözüme ulaşamadığım için bunu düzeltemedim.

3- Unit Testing hakkında

Projemi oluşturduktan sonra Unit Testleri yazmaya başlamam en büyük hatam olduğunu maalesef proje bittiğinde farkına varabildim. Derste öğrendiklerimize ek olarak internetten oldukça fazla Unit Testing hakkında makale okumama rağmen tam anlamıyla Unit Testingi bu süre içinde öğrendiğimi söyleyemem. Çünkü projem bir oyun geliştirmek olduğu için GUI Testing öğrenmem gerekiyordu. Ne kadar internette araştırma yapsam da projenin deadline yaklaştığı için GUI Testing çalışmaya maalesef proje bittikten sonra devam edeceğim. Projemde Unit Testing için denediğim şeyleri de raporuma ekleyeceğim ancak şimdiden belirtmeliyim ki bu Unit Testlerin Unit Test ile alakası yok. GUI içeren projelerin Unit Testleri üzerinde ek olarak araştırma yapmam gerekli. Unit Testleri güzel olarak oluşturamamın sebebi kodlarımın karmaşık olmasından kaynaklı olabilir. Son olarak projemde Unit Testing kısmı eksik.

4- Grafiksel Arayüz Hakkında

Raporumun diğer kısımlarında belirttiğim gibi ilk defa GUI projesi geliştirdiğim için Java Swing kütüphanesi ve mantığını öğrenmem çok uzun süremi aldı. Bu yüzden projenin başında aklımda tasarladığım görünümü oluşturamadım. Örneğin top Bricklere isabet edip kırdıktan sonra Bricklerin içerisinden itemler düşürmeyi de istiyordum ancak bunu yapabilecek zamanım ve yeterli bilgim olmadı. Aynı şekilde oyuna Level mantığını koyduktan sonra top iki kere vurduktan sonra duvarlar yıkılıyordu ve top duvara ilk çarptığı anda duvarın çatlamasını istiyordum ancak bunu da başaramadım.

5- About What I Learned In This Project

İlk olarak, bu projeyi geliştirmeye başlamak bana oyun geliştirmenin ne kadar zor ancak zevkli olduğunu gösterdi. Grafiksel arayüz geliştirmek için Java Swing öğrenmem gerekti ve Java Swing temellerini öğrendiğimi düşünüyorum. Raporda projenin oluşturulması kısmında tam olarak her şeyi anlatamasam da 1 ay önce projeye yapmaya başladığım zamandan bu zamana çok fazla şey öğrendim. Nesne yönelimli programlama dersini geçtiğim için nesne yönelimli programlamayı bildiğimi düşünüyordum. Ancak durumun hiç de böyle olmadığını gördüm. Proje için her yeni özellik eklemem gerektiğinde, öğrenmem gereken kuralların veya Java kütüphanesindeki rutinlerin olduğunu farkettim. Her ne kadar projem eksikler içerse de projemi yaparken çektiğim zorlukların bana çok faydalı olduğunu düşünüyorum.

6- In Conclusion

Rapor anında defalarca tekrar ettiğimin farkındayım ancak GUI projesi oluşturmak için hiçbir ön bilgim olmadığından dolayı projem benim için çok faydalı oldu. Çok yeni bilgiler öğrendim, oyun programlama hakkında bir giriş oldu. Nesne yönelimli programlamanın inceliklerini yalnızca kitap okuyarak öğrenilemeyeceğini, yazılımcının ancak proje geliştirdikçe bu kavramları öğrenebileceğini öğrendim. Projemdeki eksik kısımların farkındayım. Belki daha fazla süre olsaydı geliştirdiğim projeye ek özellikler ekleyebilirdim.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir