Arkanoid Game

Arkanoid Oyunu

  • Arkanoid, 1986 yılında Taito tarafından geliştirilen bir arcade oyunudur. Oyunun amacı ekrandaki topun bloklara değmesini sağlayarak onları yok etmek ve topun düşmesini engellemek. Oyun Java programlama dili ile geliştirilmiştir. Oyunun içerisinde 3 adet sınıf bulunmaktadır.-Main : Frame objesinin oluşturulduğu sınıf
    -Gameplay : oyun mekaniklerinin bulunduğu ve ekran tasarımlarının oluşturulduğu sınıf
    -MapGenerator : oyunda yok etmemiz gerek blokların oluşmasını sağlayan sınıf

    Oyunun kaynak kodlarına ve kod açıklamalarına aşağıdaki linkten erişebilirsiniz.

  • Kaynak kodlar ve Açıklamalar

İçerik Hazırlayan: Bilal Emre Gürkan

Flappy Bird Game

Flappy Bird oyununu Java programlama dili kullanılarak temel anlamda tekrardan geliştirilmiştir. Oyun geliştirmek için; karakter kontrol, platform oyunu geliştirme mantığı, Mouse Event Kontrol ve Key Event Kontrol gibi konular kullanılmıştır.

Bu oyundaki amaç Space ya daMouse kullanarak, ekranda duran kırmızı kareyi yeşil karelerin arasından geçirmektir. Her bir başarılı sonuç 1 puan olarak kullanıcının puan değerine yansıyacaktır.

 

Oyunun Kaynak Kodları: https://github.com/Jaryt/FlappyBirdTutorial

Oyunun Eğitim Videosu(62 dakika) : https://www.youtube.com/watch?v=I1qTZaUcFX0

İçerik Hazırlayan: Mehmet ASLAN

 

Java Junit

Java’da diğer pek çok programlama dilinde olduğu gibi test kodları yazılarak (white box testing), geliştirilen programın kodları test edilebilir . Java kodlarını test etmek için farklı araçlar bulunsa da. Temel anlamda Java’da  test için kullanılacak en iyi araç JUnit dir. Aşağıda bir kodun nasıl test edildiği ile ilgili bir örnek adım adım anlatılarak verilmiştir.

1.adım ana kodu yazın (Java Class).

package testing;

public class JunitTesting {
  public int square(int x) {
    return x*x;
  }
  public int countA(String word){
    int count=0;
    for (int i = 0; i < word.length(); i++) {
      if (word.charAt(i)=='a' || word.charAt(i)== 'A') {
        count++;
      }
    }
    return count;
  }

}

 

2.adım squareTest isimli (JUnit classını ekleyin)

Package’in üzerine gelip sağ click yapın. Açılan ekranda New->JUnitTestCase seçeneğini tıklayın. Açılan ekranda class ismi olarak squareTest olarak girip OK butonuna tıklayın. Yazılacak kod aşağıda verilmiştir.

package testing;

import static org.junit.Assert.*;

import org.junit.Test;

public class squareTest {

  @Test
  public void test() {
    JunitTesting test = new JunitTesting();
    int output= test.square(5);
    assertEquals(25,output);
  }

}

 

3.adım countAtest isimli (JUnit classını ekleyin)

Package’in üzerine gelip sağ click yapın. Açılan ekranda New->JUnitTestCase seçeneğini tıklayın. Açılan ekranda class ismi olarak countAtest olarak girip OK butonuna tıklayın. Yazılacak kod aşağıda verilmiştir.

package testing;

import static org.junit.Assert.*;

import org.junit.Test;

public class countAtest {

  @Test
  public void test() {
    JunitTesting test = new JunitTesting();
    int output= test.countA("alphabet");
    // alphabet yazısında 2 tane a olduğu için beklenen sonuç 2 olmalı.
    assertEquals(2,output);
  }

}

4.adım testleri teker teker çalıştırma

Aktif olan testti seçip testti çalıştırın. squareTest isimli classta beklenen değer 5 in karesi için 25 olduğundan ilk test başarı ile çalışacaktır. assertEquals(25,output);

5.adım testleri çoklu çalıştırın. (Alltests.Java)

Package’in üzerine gelip sağ click yapın. Açılan ekranda New->Other->Java->JUnit->JUnitTest Suite seçeneğini tıklayın. Açılan ekranda package kısıma testing yazın. Aşağıda daha önceden yazdığımız iki test kodu çıkacaktır.  Finish isimli butona tıkladıktan sonra testleri toplu olarak çalıştırmamıza yarayan kod otomatik olarak oluşturulacaktır. Bu kod ayrıca aşağıda verilmiştir.

package testing;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({ countAtest.class, squareTest.class })
public class AllTests {

}

Proje Alltests isimli class seçipip sağ click yapılıp Run As-> JUnit Test menüleri seçilerek çalıştırıldığında çıkacak ekran aşağıda verilmiştir. Aşağıdaki ekranda programın yazılan 2 farklı testtende başarı ile geçtiği görülmektedir. (Yeşil barlar ve yeşil onay işaretleri)

 

Video olarak anlatım aşağıda verilmiştir.

Java Shortcuts

1-) Getters ve Setters methodlarını otomatik olarak ekleme

Eclipse get ve set methodlarını otomatik olarak ekleyebilirsiniz. Tek yapmanız gereken şey değişkenleri tanımlamak ve değişkenlerin bulunduğu satırı seçip  ekranın üst kısmında yer alan Source menüsünden Generate Getters and Setters alt menüsünü seçmek.

public class Examples {
  private String name;
  private String address;
}

Çıkan ekranda address ve name yazan satırların sol tarafında bulunan checkboxları seçebiliriz. Seçim işleminden sonra eklenecek olan methodların nereye ekleneceğinin bilgisini seçip (Örnek kod içerisinde address satırının altına eklesin.) OK buttonunu tıklamak. Bu sayede get ve set methodlarının kodlarını yazmadan direk ekleyebiliriz.

 

Eklendikten sonraki hali.

 

2-) Constructor otomatik olarak ekleme

İlk örnekte olduğu gibi değişkenleri seçip Source menüsünden->Generate Constructor using Files menüsünü seçerek otomatik olarak Constructor ekleyebilirsiniz. Otomatik olarak eklenen constructor kodu aşağıda verilmiştir.

public Examples(String name, String address) {
  super();
  this.name = name;
  this.address = address;
}

3-) toString methodunu otomatik olarak ekleme.

İlk iki örnekte olduğu gibi değişkenleri seçip Source menüsünden->Generate toString menüsünü seçerek otomatik olarak toString methodunu ekleyebilirsiniz. Otomatik olarak eklenen toString methodunun kodu aşağıda verilmiştir.

public String toString() {
  return "Examples [name=" + name + ", address=" + address + "]";
}

4-) Kısa yolların listesini öğrenin

Windows Ctrl+Shift+L , Mac için Command + Shift + L  (Eclipse’te ekranın sağ alt kısmında kısa yolların bilgileri gelecektir.)

5-) Kısayolların bilgilerini değiştirme yada ekleme.

Window->Preferances->General->Keys menüleri kullanılarak herhangi bir kısa yol ataması kaldırılabilir yada değiştirilebilir.

6-) Main methodunu otomatik olarak ekleme

Classın içerine main methodu eklemek için tek yapmamız gereken main yazıp Ctrl+Space tuşlarına başmak.

public class Examples {

main

}

Arkasından main methodu aşağıdaki örnektede gözüktüğü gibi otomatik olarak ekrana yazılacaktır.

package shortcuts;

public class Examples {

public static void main(String[] args) {
  
}

}

6-) public mehdodunu otomatik olarak ekleme

Beş numaralı örnekte gözüktüğü gibi public yazıp Ctrl + Space tuşlarına basarsak aşağıdaki public methodu otomatik olarak eklenecektir.

public return_type name() {
  
}

7-) private methodu otomatik olarak ekleme

Beş numaralı örnekte gözüktüğü gibi private yazıp Ctrl + Space tuşlarına basarsak aşağıdaki private method otomatik olarak eklenecektir.

private return_type name() {
  
}

8 – ) Sizin tanımlayacağınız bir methodu otomatik olarak ekleme

methodadi + Ctrl + Space tuşlarına basarsak aşağıdaki sizin tanımladığınız isimde bir method otomatik olarak eklenecektir.

private void ogrenci() {
  // TODO Auto-generated method stub

}

9-)  System.out.println(); kodunu otomatik olarak ekleme.

Her hangi bir methodun içerisinde sysout yazıp Ctrl+Space tuş konbinasyonu ile otomatik olarak eklenir.

10-)  Döngüleri otomatik olarak ekleme

Her hangi bir methodun içerisinde, her hangi bir döngünün adını yazıp Ctrl+Space dersek o döngü ile ilgili kodlar otomatik olarak eklenecektir.

Örnek: for+Ctrl+Space

for (int i = 0; i < array.length; i++) {
    
  }

Diğer örnekleri deneyin (foreach, while, try, do)

11-) Kod Hizalama

Oldukça yararlı bir tuş konbinasyonudur.

Kullanımdan önce

package maltepe;

public class Master extends Graduate {
private int bsGANO;
public String toString(){
return super.toString() + 
"Student's Undergraduate GANO: " + bsGANO;
}
public boolean equals(Object obj){
if (obj instanceof Master){
Master newStudent = (Master) obj;
if (this.name == newStudent.name &&
this.surname == newStudent.surname &&
this.stdNo == newStudent.stdNo &&
this.institute == newStudent.institute &&
this.program == newStudent.program &&
this.bsGANO == newStudent.bsGANO)
return true;
else
return false;
}
return false;
}
public void doHomeWork(){
System.out.println("Master Student is doing homework");
}
}

Kullanımı kodları seçtikten sonra Ctrl+i  tuş konbinasyonudur.

Kullanımdan sonra

package maltepe;

public class Master extends Graduate {
  private int bsGANO;
  public String toString(){
    return super.toString() + 
        "Student's Undergraduate GANO: " + bsGANO;
  }
  public boolean equals(Object obj){
    if (obj instanceof Master){
      Master newStudent = (Master) obj;
      if (this.name == newStudent.name &&
          this.surname == newStudent.surname &&
          this.stdNo == newStudent.stdNo &&
          this.institute == newStudent.institute &&
          this.program == newStudent.program &&
          this.bsGANO == newStudent.bsGANO)
        return true;
      else
        return false;
    }
    return false;
  }
  public void doHomeWork(){
    System.out.println("Master Student is doing homework");
  }
}

12- Kodları otomatik olarak bir methodun içerisine ekleme

Yazdığınız kodları otomatik olarak bir method içerisine almak için tek yapmanız gereken kodları seçmek. Alt+Shift+M tuş konbinasyonu yapmak. Çıkan ekranda istenilen methodun adını yazıp OK buttonuna tıktadığımız da oluşturulan method hazır olarak karşımıza gelecektir.

 

Eklendikten sonraki hali

package shortcuts;

public class Examples {

  public static void main(String[] args) {
    dongu();

  }

  private static void dongu() {
    int i=0;
    while (i<10) {
      System.out.println(i++);
    }
  }
}

13-) Kodları taşıma

Seçilen herhangi bir kod bölümünü Alt tuşu ve klavyedeki üst ok ve alt ok tuşları yardımı ile yukarı veya aşağı taşıyabilirsiniz.

14-) Zenginleştirilmiş arama

Herhangi bir kod parçasını seçip Ctrl+Shift+m tuşuna tıklarsanız o kod parçasının o proje içerisinde nerelerde geçtiğinin satır satır bilgilerini detaylı olarak görebilirsiniz.

15-) Kendi yazdığınız methodları otomatik olarak ekleyin

Öncelikli olarak başka projelerde kullanmak istediğiniz bir methodun kodlarını kopyalayın. Arkasından Window->Preferances->Java->Templates menüsüne gelin. Ekranın sağ tarafında bulunan New buttonuna tıklayarak. Method bilgilerini girin. Aşağıda bir örnek verilmiştir.

Yapılan işlemden sonra artık Eclipse içerisinde herhangi bir projede doHomeWork yazıp Ctrl+Space dersek o yazmış olduğumuz method otomatik olarak sistem içerisine eklenecektir.

Ps TODO listesi ekleme Window->ShowView->Tasks  ( // TODO I will make this method) + SaveAs (Yapılacakların listesi Tasks kısmında görülecektir.)

Kısa yollar ile ilgili bilgilerin videolu anlatımı.

 

Java Eclipse Debug

Eclipse’te diğer IDElerde olduğu gibi kodlar üzerinde kolayca debug yapılabilir. Örnek olması açısından aşağıda iki farklı class kodu verilmiştir. Bu kodları bir Java projesi içerisinde açıp kopyalayabilirsiniz.

package debug;

public class FractionTester {

    public static void main(String[] args) {
  Fraction ilk = new Fraction(1, 5);
  Fraction son = new Fraction("1/5");
  Fraction[] myFractions = new Fraction[5];

  System.out.println("ilk = " + ilk + " ve son = " + son);

  // Add the fractions, store the result

  Fraction toplam = ilk.add(son);
  
  myFractions[0] = ilk;
  myFractions[1] = son;
  myFractions[3] = toplam;

  // Print the result
  System.out.println(myFractions[3]);
    }
}

package debug;

public class Fraction {

    protected int numerator;
    protected int denominator;

    public Fraction(int numerator, int denominator) {
  this.numerator = numerator;
  this.denominator = denominator;
    }

    public Fraction(int numerator) {
  this(numerator, 1);
    }

    public Fraction(String fraction) {
  String[] nums = fraction.split("/");
  this.numerator = Integer.parseInt(nums[0]);
  this.denominator = Integer.parseInt(nums[1]);
    }
   
    public Fraction add(Fraction that) {
  int num = (this.numerator * that.denominator)
      + (this.denominator * that.numerator);
  int den = this.denominator * that.denominator;
  Fraction sum = new Fraction(num, den);
  sum.simplify();
  return sum;
    }

    public static int greatestCommonDivisor(int a, int b) {
  if (b == 0)
      return a;
  else if (a >= b && b > 0)
      return greatestCommonDivisor(b, a % b);
  else
      return greatestCommonDivisor(b, a);
    }

    public void simplify() {
  int gcd = greatestCommonDivisor(numerator,denominator);
  numerator = numerator / gcd;
  denominator = denominator / gcd;
    }

    public String toString() {
  return numerator + "/" + denominator;
    }
  
    public static void main(String[] args) {

  Fraction f = new Fraction(Integer.parseInt(args[0]),
          Integer.parseInt(args[1]));
  System.out.println(f);

  Fraction ff = f.add(f);
  System.out.println(f + " + " + f + " = " + ff);
    }
}

Uygulamayı debug modunda satır satır çalıştırmak için Eclipse’te üst kısımda görülen debug buttonuna tıklayın. Debug yapacağınız classı seçin arkasından ekranın sağ tarafında bulunan debug yazan (debug görünümüne geçin)

1-)

Debug_eclipse.png

2-)  Kodun hangi kısmından itibaren debug yapacaksanız kodun bulunduğu satırın en soluna gelip çift tıklayın. Aşağıdaki resimdede görüldüğü gibi mavi ufak bir daire şekli eklenecektir.

Toogle_Break_Point.png

3-) Kodları satır satır debug yapmak için ekranın üzerinde görülen sarı next line butonuna tıklayın.

Next_Step_3.png

4-)Eğer debug modu Eclipse’te açık değilse ve ekranın altında kırmızı olarak Soruce not found yazısını görürseniz. Ekranın en üst kısmında bulunan Window menüsünden Preferences alt menüsünü seçin.Sonrasında aşağıda görülen resimde olduğu gibi Java->Debug->Step Filtering menüsünü açın. Açılan menüden Use Step Filters özelliğini açıp Defined step filterların sol tarafında bulunan onay kutularının hepsini onaylayın.

Step_Filtering

 

5-) Arkasından Apply ve Ok buttonlarına basarak ekranı kapatın. Artık satır satır kodları debug edebilir. Hangi satırda hangi değişkenin hangi değere sahip olduğunu görebilirsiniz. Aşağıda verilen videoda örnekte verilen classlar için bu işlemlerin nasıl yapıldığı detaylı olarak anlatılmıştır.