24 Aralık 2013 Salı

Uzaklık Hesaplama

Bu yazıda matematik dersinden tanıdığımız, öğrendikten sonra “iyi ama hocam bu ne işimize yarayacak?” dediğimiz bir teoremin de yardımıyla iki nesne arasındaki uzaklığı bulmayı deneyeceğiz. Şimdi Pisagor Teoremi olmadan neler yapabileceğimize bir göz atalım.
  • Nesnelerin x koordinatı üzerindeki konumları birbirine eşitse:
|Y1 – Y2| yani birinci nesnenin ikinci nesneyle arasındaki farkın mutlak değeri uzaklığa eşittir.
  • Nesnelerin y koordinatı üzerindeki konumları birbirine eşitse:
|X1 – X2|
Pisagor Teoremi olmadan yapabileceklerimizi gördük. Şimdi sıra Pisagor Teoremini kullanmaya geldi. Yani:
  • Nesnelerin x ve y koordinatı üzerindeki konumları eşit değilse:
|Y1 – Y2| ^ 2 + |X1 – X2| ^ 2 = Hipotenüs(uzaklık)
Pisagor Teoremi ile ne yapabileceğimizi gördüğümüze göre artık yaptıklarımızı koda çevirelim.
Math.abs(birinci_obje.getY() - ikinci_obje.getY()); // birinci durum
Math.abs(birinci_obje.getX() - ikinci_obje.getX()); // ikinci durum
a = Math.abs(birinci_obje.getY() - ikinci_obje.getY()); // üçüncü durum
b = Math.abs(birinci_obje.getX() - ikinci_obje.getX());
c = Math.sqrt(Math.hypot(a,b));

9 Aralık 2013 Pazartesi

Basit Yapay Zeka

Yapmaya çalıştığımız oyun için hazırladığım yapay zeka örneği. Ninja objesi ile arasındaki farkı hesaplayıp farka göre işlemler yapan bir yapay zeka.
import greenfoot.*;
import java.awt.Graphics2D;
import java.awt.Color;
public class Polis extends Actor
{
    private int x;
    private Actor duvar;
    public Polis()
    {
        GreenfootImage katman1 = new GreenfootImage(10,10);
        GreenfootImage katman2 = new GreenfootImage("polis.png");
        katman2.drawImage(katman1,katman1.getWidth() / 2, katman1.getHeight() / 2);
        GreenfootImage katman3 = new GreenfootImage(100,100);
        Graphics2D oval = katman3.getAwtImage().createGraphics();
        oval.setColor(Color.BLUE);
        oval.drawOval(0,0,100,100);
        katman3.drawImage(katman2,30,30);
        setImage(katman3);
    }
    private void rastgele()
    {
        if(Greenfoot.getRandomNumber(150) <= 5)
        {
            turn(90);
        }
        if(getX() >= getWorld().getWidth() - 1 || getX() <= 1 || getY() 
        >= getWorld().getHeight() - 1 || getY() <= 1)
        {
            turn(180);
        }
        if(duvar != null)
        {
            x++;
            if(x == 1)
            {
                turn(180);
            }
        }
        else
        {
            x = 0;
        }
    }
    private double hipotenus()
    {
        Bolum1 bolum1 = (Bolum1) getWorld();
        Ninja ninja = bolum1.getNinja();
        int x = Math.abs(getX() - ninja.getX());
        int y = Math.abs(getY() - ninja.getY());
        double x_dogrusu = (double)x;
        double y_dogrusu = (double)y;
        return Math.hypot(x_dogrusu,y_dogrusu);
    }
    private int mesafe()
    {
        Bolum1 bolum1 = (Bolum1) getWorld();
        Ninja ninja = bolum1.getNinja();
        if(ninja.getY() != getY() && ninja.getX() != getX())
        {
            double hipot = hipotenus();
            int uzaklik = (int) Math.sqrt(hipot);
            return uzaklik;
        }
        else if(ninja.getY() == getY())
        {
            return Math.abs(ninja.getX() - getX());
        }
        else
        {
            return Math.abs(ninja.getY() - getY());
        }
    }
    public void act()
    {
        GreenfootSound ses = new GreenfootSound("bip.wav");
        Bolum1 bolum1 = (Bolum1) getWorld();
        Ninja ninja = bolum1.getNinja();
        Katman katman = bolum1.getKatman();
        duvar = getOneIntersectingObject(Duvar.class);
        move(2);
        if(mesafe() <= 10 && duvar == null)
        {
            if(duvar != null)
            {
                x++;
                if(x == 1)
                {
                    turn(180);
                }
            }
            else
            {
                x = 0;
            }
            turnTowards(ninja.getX(),ninja.getY());
            ses.setVolume(60);
            ses.play();
            katman.setAktif(true);
        }
        else
        {
         rastgele();
         katman.setAktif(false);
        }
    }
}

28 Kasım 2013 Perşembe

Kontrol Sistemi

Balık tutma oyunu için yapmaya çalıştığım kontrol sistemi.
import greenfoot.*;
import java.awt.Graphics2D;
import java.awt.Color;
public class Ark extends Actor
{
    private int obje_x;
    private int fare_x;
    private int uzunluk;
    public Ark()
    {
    }
    private int uzunluk_olc()
    {
        if(uzunluk < 0)
        {
            return Math.abs(uzunluk);
        }
        else
        {
            return uzunluk;
        }
    }
    public void act()
    {
        try
        {
            MouseInfo m1 = Greenfoot.getMouseInfo();
            if(getX() + Math.abs(uzunluk) == m1.getX())
            {
                System.out.println("Denklem doğru");
            }
            obje_x = getX();
            fare_x = m1.getX();
            uzunluk = obje_x - fare_x;
            GreenfootImage image = new GreenfootImage(uzunluk_olc(),200);
            Graphics2D g2 = image.getAwtImage().createGraphics();
            g2.setColor(Color.BLACK);
            g2.drawArc(0,0,uzunluk_olc(),200,-180,-180);
            setImage(image);
        }
        catch(NullPointerException e){}
        catch(IllegalArgumentException e){}
    }
}

14 Ekim 2013 Pazartesi

1. Senem

Bu kadar uzun süre yazacağımı tahmin edemezdim. Neyse LEGEPE'nin 1. yıldönümü kutlu olsun!

21 Ağustos 2013 Çarşamba

Greenfoot ile Top Sektirme Oyunu

Bu yazıda sizlere bir top sektirme oyunu üzerinden fare olaylarını anlatmaya çalışacağım. Öncelikle fareyi kontrol etmek için hangi sınıfların hangi metodlarını kullanacağımıza bir göz atalım.

Greenfoot sınıfının mousePressed() metodu farenin tuşlarından birine basıldığında true değer döndürür. Bir önceki cümleden anlaşıldığı üzere boolean bir metoddur. Parametre olarak this veya null değerini alır. This değerini alırsa sadece fare kendi üzerine tıklarsa koşul gerçekleşir. Null değerindeyse herhangi bir yere tıklandığında koşul gerçekleşmiş olur.
turnTowards(fare.x,fare.y) metodu nesnenin açısını farenin açısına eşitler.
mouseClicked() metodu mousePressed() metoduna benzer. Aralarındaki fark şudur: mousePressed() metodunda farenin herhangi bir tuşuna basma ile çekme arasında sonsuz defa işlem yapabilir. Ancak mouseClicked() metodu bu arada sadece bir defa işlem yapar. Şimdi diğer sınıfımıza geçelim. MouseInfo sınıfını kullanabilmek için bir MouseInfo türünden bir referans oluşturmamız gerekir. Şu şekilde:

MouseInfo fare = Greenfoot.getMouseInfo();
Şimdi sınıfın metodlarına bakalım.

getX(): Farenin x koordinatı üzerindeki değerini geri döndürür.
getY(): Farenin y koordinati üzerindeki değerini geri döndürür.
getButton(): Farenin hangi tuşuna basıldığını gösterir. Eğer döndürdüğü değer bire eşitse sol tuşa, ikiye eşitse ortadaki tuşa ve üçe eşitse sağ tuşa bastığı anlamına gelir. Sınfıfların metodlarını gördüğümüze göre oyunumuzu yapmaya başlayabiliriz. Öncelikle yeni bir Greenfoot Projesi açıyoruz.

Hemen ardından "Top" adında bir aktör ve "Oyun" adında bir dünya yaratıyoruz. "Oyun" adlı dünyamıza çift tıklayıp açılan pencereye şu kodları yazıyoruz:

Oyun.java
import greenfoot.*;
import java.awt.Color;
public class Oyun extends World
{
public Oyun()
{
super(300,300,1); // 300x300 boyutlarında bir dünya yarattık.
getBackground().setColor(Color.GREEN);
getBackground().fill(); // arkaplanı yeşil yaptık.
Top top = new Top(); // top nesnesi oluşturduk.
addObject(top,150,150); // nesnemizi dünyaya ekledik.
}
}
Şimdi "Top" adlı aktörümüze çift tıklayıp açılan pencereye şu kodları
yazıyoruz:

Top.java
import greenfoot.*;
public class Top extends Actor
{
private int yercekimi;
public Top()
{
setImage("top.png");
}
private void yercekimi(int ekle) // bununla ilgili bir yazı yazmıştım.
{
yercekimi += ekle;
setLocation(getX(),getY() + yercekimi);
}
private void sektir()
{
if(Greenfoot.mouseClicked(this))
{
yercekimi = 0;
setLocation(getX(),getY() - 10);
}
}
public void act()
{
yercekimi(1);
sektir();
if(getY() >= getWorld().getHeight() - 1)
{ /* eğer y koordinatımız dünyamızın boyunun 1 eksiğine eşitse
ölürüz. */
getWorld().removeObject(this);
}
}
}
Gördüğünüz gibi öğrendiklerimizi uygulayarak basit bir oyun yaptık. Siz isterseniz oyuna skor ekleyebilir ve topun x koordinatında hareket etmesini de sağlayabilirsiniz.

17 Ağustos 2013 Cumartesi

Square Kart

Yapmaya çalıştığım yeni araba oyunu. Bugün ilk versiyonunu yayınladım ilk versiyon şu özelliklere sahip:
17/08/13
- Araba
- Tur ve güç göstergesi
- Bitiş çizgisi
- Fare veya klavyeyle kontrol sistemi
19/08/13
- Hata giderildi
- Motor sesi.
28/08/13
- Kontrol noktası sistemi yapıldı.
- Çimen deseni eklendi.
11/09/13
-Tur sayısını belirleme
-2 kişilik
-Daha fazla ses
Oyun bitmiştir, http://www.greenfoot.org/scenarios/9186 bu adresten oyuna erişebilirsiniz.

15 Temmuz 2013 Pazartesi

Lanetlenmiş Renkler

Aslında yaptığım oyunun adı Black-White ancak Türkçe film adı çevirilerine gönderme olsun diye başlığın adını Lanetlenmiş Renkler koydum ehehhhe
Oyunun açık kaynağına http://cl.ly/2P0r1Z3n2G0w adresinden ulaşabilirsiniz. Veya http://www.greenfoot.org/scenarios/9008 adresinden çevrimiçi olarak oynayabilirsiniz. İyi günler.