Monday, December 16, 2013

Oynat

Oynat.java sınıfında bir karenin yerini değiştirmek için gerekli olan

    static void oynaDogruHamle(ilk.nokta,  son.nokta);               

metodu en önemli olanıdır.

Sınıflar içindeki static metodlar o sınıftan bir nesne  yaratmaya gerek kalmadan her yerden sınıf ismi ile çağrılabilmektedir.
Oynat.oynaDogruHamle(ilk.nokta,  son.nokta);   ifadesinde görüldüğü gibi  ilk terim Oynat nesne değil sınıftır.

Aşağıda satranç tahtası  C.tAHTA [8][8] adı ile iki değişkenli bir alan olarak tanımlanmıştır. Ben çok kullanılan değişken ve sabitleri C.java sınıfında statik olarak tanımladığım için aşağıdaki şekilde kullanıyorum.

Java'da nesneler arasında değişim kolay olmasa da bir alan içinde mümkün olmaktadır. yerDegistir rutini alan içerisinde alan değişkenlerine yer değiştirerek iki kareye yer değiştirtmektedir.

Değişim yapmadan önce karelerin bulundukları yer sınırlarını ve geri plan renkleri saklamak daha sonra da tekrar yerlerine yerleştirmek gerekiyor. Gidilen karede bir taş varsa(taş almak) o taş gelinen kareye yer değiştirdiği için o karenin taş kutusuna kutuyaKoy rutini ile gönderilmesi ve o kareye boş kare ikonun yerleştirilmesi ve numara olarak da boş bir kare numarası verilmesi gerekiyor. Ayrıca kare ismi de "BOS" yapılıyor. Gidilen karede taş yoksa  değişikliğe gerek yok.

Bir hareket gerçekleştiği için tasOYNADI değişkeni de true olarak değiştiriliyor. C.onceIlk ve C.onceSon değişkenlerine de bir önceki hareketin kare noktalarını saklayarak piyonlar son kareye ulaşıp üstün piyon olurken ihtiyaç duyuluyor.

Oynat.java

public class Oynat {

   static void yerDegistir(Point ilk, Point son){
        SatrancKare z=new SatrancKare();
        Point p=new Point();
        z=C.tAHTA[son.x][son.y];
        C.tAHTA[son.x][son.y]=C.tAHTA[ilk.x][ilk.y];
        C.tAHTA[ilk.x][ilk.y]=z;
        p=C.tAHTA[son.x][son.y].nokta;
        C.tAHTA[son.x][son.y].nokta=C.tAHTA[ilk.x][ilk.y].nokta;
        C.tAHTA[ilk.x][ilk.y].nokta=p;
    }
      
    static void oynat(Point ilk, Point son){
        if ((C.BENP)||(C.SENP))return;
        Icon bosKare= new ImageIcon();
        bosKare=(ImageIcon) C.tasResmi[1][6];
        java.awt.Color ilkGeriplanRengi=C.tAHTA[ilk.x][ilk.y].getBackground();
        java.awt.Color sonGeriplanRengi=C.tAHTA[son.x][son.y].getBackground();
        Rectangle boundsFrom=C.tAHTA[ilk.x][ilk.y].getBounds();
        Rectangle boundsTo=C.tAHTA[son.x][son.y].getBounds();
        yerDegistir(ilk,son);
        C.tAHTA[son.x][son.y].setBounds(boundsTo);
        C.tAHTA[ilk.x][ilk.y].setBounds(boundsFrom);
        if (C.tAHTA[ilk.x][ilk.y].getName() == "BOS"){
        }
        else{
            Satranc.kutuyaKoy(C.tAHTA[ilk.x][ilk.y]);
            C.tAHTA[ilk.x][ilk.y].setIcon(bosKare);
            C.tAHTA[ilk.x][ilk.y].setName("BOS");
            C.tAHTA[ilk.x][ilk.y].yerNo=20;
        }
        C.tAHTA[son.x][son.y].setBackground(sonGeriplanRengi);
        C.tAHTA[ilk.x][ilk.y].setBackground(ilkGeriplanRengi);
        C.tAHTA[son.x][son.y].tasOYNADI=true;
        C.onceIlk=ilk;
        C.onceSon=son;
    }

Wednesday, December 11, 2013

FareNeYapar

FareNeYapar kalıbı MouseInputAdapter isimli kütüphanede mevcut bir sınıftan türemektedir.


Fare hareketleri ile nesneler arasında organizmada sinirlerde oluşan akıma benzeyen bir iletişim mevcuttur. Event driven diye anılan tekniğe göre fare tuşuna basış bir uyarı olarak yayınlanmakta ve bir nesnelerden de kontrol edilerek bu uyarı yakalanabilmektedir.

Amacım, bir satranç karesine basılınca(mousePressed)  o karenin  saptanması(ilk) ve fare tuşu basılı olarak sürüklenip gittiği noktada bırakılınca(mouseReleased) gene o karenin (son) olarak belirlenmesidir.

Nokta, kütüphanede mevcut basit bir sınıf olup Point ismi ile anılmaktadır. Her Point nesnesinin x ve y olarak iki değeri bulunmaktadır. Kullandığım ilk.nokta ve son.nokta nesneleri Point kalıbından türedikleri için o nesneler hareketin başladığı ve bittiği noktaların yerlerini satır ve sütun sayısı olarak içermektedir. Bu örnek olarak ilk.x=1. ilk.y=1 noktasından son.x=1, son.y=3 noktasına bir taşı oynatırken kullanılacaktır.

private SatrancKare sonKare()  metodu da bir fonksiyon olarak farenin ekran üzerinde bulunduğu pixel olarak koordinatlarından satranç karesinin pixel olarak genişlik miktarlarına bölerek bulunan satır ve sütun sayılarına dönüşümü sağlayıp sonucu sonKare olarak vermektedir.

Fare ile tıklama(mouseClicked ) metodunun amacı, piyon son kareye kadar ulaşıp değerli taş olunca istenen taşı  tahta veya taş kutusundan seçmektir. Daha sonra da piyon son kareye sürüklenecektir.

Fare tuşu sürüklenip gittiği noktada serbest bırakılınca
                Oynat.oynaDogruHamle(ilk.nokta,  son.nokta); 
Oynat sınıfındaki oynaDogruHamle metodunu harekete geçirerek taşı oynatacaktır.

              

       public static class FareNeYapar extends MouseInputAdapter {

            public C c=new C();

            private  SatrancKare ilk=new SatrancKare();
            private  SatrancKare son=new SatrancKare();
            private  SatrancKare klk=new SatrancKare();
            Point basilanNokta=new Point();
            Point birakilanNokta=new Point();
            Point karedeBasiNokta=new Point();
             
        
         
            public FareNeYapar () {
                             }


            private SatrancKare sonKare() {
                int dx=0;
                int dy=0;
                if (birakilanNokta.x>basilanNokta.x)
                    dx=(int)((+karedeBasiNokta.x+birakilanNokta.x-basilanNokta.x)/C.kd);
                else
                    dx=(int)((-karedeBasiNokta.x+birakilanNokta.x-basilanNokta.x)/C.kd);
                if (birakilanNokta.y>basilanNokta.y)
                    dy=(int)((+karedeBasiNokta.y+birakilanNokta.y-basilanNokta.y)/C.kd);
                else
                    dy=(int)((-karedeBasiNokta.y+birakilanNokta.y-basilanNokta.y)/C.kd);
                son.nokta.x=ilk.nokta.x+dx;
                son.nokta.y=ilk.nokta.y-dy;
                return son;   
            }

            @Override
            public void mousePressed(MouseEvent e)  {
                ilk=(SatrancKare) e.getSource();
                basilanNokta=e.getLocationOnScreen();
                karedeBasiNokta=e.getPoint();
            }

            @Override      
            public void mouseReleased(MouseEvent e) {
                birakilanNokta=e.getLocationOnScreen();
                son=sonKare();          
                Oynat.oynaDogruHamle(ilk.nokta,  son.nokta);              
            }  

          
            @Override
            public void mouseClicked(MouseEvent e){
                klk=(SatrancKare) e.getSource();
                C.ustunIkon=klk.getIcon();
                C.ustunYer=klk.yerNo;
            }
        
    }

Sunday, December 1, 2013

Satranç Kareleri

Satranç tahtasında 64 kare bulunmaktadır. Araştırdığım açık programlarda taş(piece) nesnelerinin oluşturulduğunu ve onların kareler arasında yer değiştirdiğini gördüm. Ben ise kare nesnelerini değiştirerek taş hareketini sağlamayı düşündüm.

Ben kare sınıfını(SatrancKare) aşağıdaki gibi tasarladım. Bu yeni sınıf (class) benim satranç tahtamda oluşturacağım her karenin ana kalıbı olacak. Javada Swing adlı bir kütüphane mevcut ve burada ekranda kullandığımız  Label(etiket), Button(tuş), Frame(çerçeve) gibi nesneler hazır bulunuyor.

import javax.swing.JButton;
     public class SatrancKare  extends JButton 


yazarak, import ile o kütüphaneden alınan button sınıfı kullanılabilir duruma geliyor  ve extends  ile de benim tasarladığım yeni sınıf bu JButton sınıfından türetiliyor. Ben kütüphanedeki sınıf hakkında genel bir bilgiyle yetinerek orda yazılmış tüm rutinleri kendim yazmış gibi kullanabiliyorum. Hareket ettirirken değiştirmeyi düşündüğüm ikonlar hakkında bir satır bile yazmıyorum.

JButton sınıfında olmayan bir değişken olarak her karede, tahtada kareyi belirleyen bir numara bulunsun istiyorum bu numaraya bakarak boş bir kare mi yoksa vezir olan kare mi olduğunu bileceğim ve taş oynanınca gidilen karede bu numarayı gelinen karenin numarası olarak değiştireceğim. yerNo değişkenini bunun için kullanıyorum.

Karenin bulunduğu noktanın tahtanın alt sol köşesine göre sütun ve satır olarak yerlerini de nokta değişkeni ile belirliyorum. Bu değişken Point kalıbından üretien bir nesne olup nokta.x ve nokta.y sayıları 0 ile 7 arasında sütun ve satır değerlerini saklıyor.

Genelde satranç kurallarında bir taşın oynanmış olması bazı sonuçlar doğurur. Piyonlar ilk oynamadan sonra iki hane çıkamazlar. Karede bir hareket olduğu zaman tasOYNADI değişkeni bu bilgiyi saklayacaktır.

Kareye fare ile basıp sürükleyince, bırakınca veya click yapınca nasıl davranacağı da FareNe Yapar sınıfı ile belirlediğim fare davranışlarını kapsayan fny nesnesini esas alarak her kareye addMouseListener(fny) eklenerek sağlanmış durumda.

Java'nın  üstünlüklerinden biri de aynı isimle çok sayıda alt yordam yazılabilmesi. parametre tiplerinin farklı oluşu sayesinde bu imkan kullanılabiliyor. Üç tane farklı konstüktör biraz da açıklama amaçlı.


SatrancKare.java

import java.awt.Point;
import java.awt.event.MouseEvent;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.event.MouseInputAdapter;


@SuppressWarnings("serial")
public class SatrancKare  extends JButton  {

    int yerNo ;
    Point nokta=new Point();
    boolean tasOYNADI;

    SatrancKare(){
    }
   
    SatrancKare(ImageIcon ikon) {
        super(ikon);
        FareNeYapar fny=new FareNeYapar();
        addMouseListener(fny);
        addMouseMotionListener(fny);
        yerNo=0;
        nokta.x=0;
        nokta.y=0;
        tasOYNADI=false;
    }

    public SatrancKare(String string) {
    }