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) {
    }

Friday, November 1, 2013

Sınıf ve Nesne (Class-Object)

1990-95 yılları arasında Object Pascal, Borland Delphi gibi program dillerinde nesnel programlama mümkün olurken. Java-1.0, 1995 yılında ayrıca applet olanakları ve platformdan bağımsızlığı sağlaması ile çabucak yaygınlaştı. 2013 yılında Java-7.0 kullanmaktayız.

Nesnel programlama tekniği 60'lı yıllardan beri Simula, Smalltalk gibi programlar ile kullanılıyordu fakat sınırlı bir çalışma alanına sahipti(otomasyon). 90'lı yıllara kadar kullandığımız program dilleri arka arkaya gelen procedure'lerden oluşuyordu. Dillerdeki gelişmeler ise yapısal düzenlemeler sağlamaktan ileri gitmemişti.-(structured programming)

Nesnel programlama tekniği biraz da doğadaki yapıyı örnek almıştır. Program bir organizma olarak düşünülürse onu oluşturan her hücre(nesne) bir yapı taşı olarak bilgi saklamayı(data) ve davranışlarını(metod) kendisi belirlemektedir. Hücreler kalıp diyebileceğimiz sınır şartlarını oluşturan(sınıf-class) tipler yardımı ile oluşturulmaktadır. Sinir hücreleri(nesne-object), sinir kalıbından, beyin hücreleri beyin kalıbından oluşturulmaktadır. Her bir nesne kendisine ait renk, uzunluk ve benzer bilgileri içerirken nasıl çoğalacağı, nasıl yok olacağı gibi davranışları da metodlar(altyordam-subroutine) yolu ile bilmektedir. Kalıplar birbirinden geliştirilerek de üretilebilmektedir(kalıtım-inheritance). Bir kalıbın içeriği ile oynamadan yeni metodlar ekleyerek yeni kalıplar ve onunla da yeni nesneler oluşturmak mümkün olmaktadır.

Nesneler ile fare, klavye gibi ortamlar arasında olay iletişimi kurmak (event driven) mümkün olmaktadır. Parmağımıza iğne batsa ilgili hücrelerin uyarılması gibi.

Nesnel programlamada, kütüphaneler ve test edilmiş sağlam yapılar esas alındığı için çok az ekleme yapılarak hata bakımından daha sorunsuz yeni programlar üretmek mümkün olmaktadır.

İngilizce:
https://drive.google.com/file/d/0B1ZLTHm7f6oaQjBhUDByR2dpX3M/edit?usp=sharing

Türkçe Kaynak:
http://tdsoftware.wordpress.com/2011/06/25/java-ile-nesneye-yonelik-programlama-dersleri-pdf/

https://drive.google.com/file/d/0B1ZLTHm7f6oaSFd4a3drMkNDejQ/edit?usp=sharing

Thursday, October 31, 2013

Satranç

Satranç Java Example

Satranç ile Java

Bu bloga başlarken amacım JAVA ve OOPS (nesneye yönelik programlama) konularında öğrendiklerimi kendim için belgelemek ve blogumu okuyanlara da yardımcı olmaktı. Kendi çalışmalarımla ve internet olanaklarından faydalanarak yeni gelişmeleri izliyorum. Kaynağı açık programları, öğrenmek için çok faydalı buluyorum.

"Object Oriented Programming" nisbeten yeni ve öğrenilmesi gereken bir programlama tekniği. Java programlama dili de bu tekniği kullanarak hızla gelişiyor. Açık kaynak kodlarını incelerken satranç programlamasının java öğrenmek için ideal bir başlangıç olduğunu farkettim. Şimdi hazırladığım programı bir applet olarak Satranc sayfamda veriyorum. Zaman zaman bu programın açık kaynak kodlarını vererek açıklamalar yapacağım.

Bu satranç programı ile satranç taşları fare yardımı ile sürüklenip kaydırılarak oyun oynanabilir. PGNLoad tuşu ile satranç dosyası yüklenerek, oyun tuşları yardımı ile oyunlar izlenebilir.

Örnek olarak aşağıdaki pgn dosyasını indirirseniz bu yıl dünya şampiyonu olan Magnus Carlsen'in son oyunlarını izleyebilirsiniz 

https://drive.google.com/file/d/0B1ZLTHm7f6oablVNeHFmT2JHQ1k/edit?usp=sharing

Aşağıda vereceğim bağlantıdan bilgisayarınızda oluşturduğunuz satranç klasörüne indireceğiniz pgn dosyalarını da izlemeniz mümkün.
http://www.pgnmentor.com/files.html


İlk Programlama Yılları

Programlama konusunda bir blog oluşturmamın benim için iddialı olacağını düşündüm. Ben daha çok bu konuda kendi gözlemlerimi aktarmaya çalışacağım.

İnşaat mühendisi olarak programlama pratiğinden geliyorum. Üniversite yıllarımızda( 1963-68) Taşkışla'da IBM1620 kurulmuş ve bizde de bilgisayar hevesi doğmuştu. Bilgisayar derslerinin eğitimi programına alınması için daha erkendi. O yıllar ODTÜ'de de fortran dersleri verilmeye yeni başlamıştı. Özel çalışmalarımızla biz de fortran dilini kitaplardan öğrendik.

1971 yılında Bremen'de Ingenieurbüro Ropers'de çalışmaya başlayınca ilk olarak basit bir bilgisayar ile karşılaştım. Bu bir IME bilgisayardı. Makina programı dediğimiz arka arkaya girilen komutlar ve döngülerle işlemler oluşturulabiliyor ve program delinerek kartlarda saklanabiliyordu. Kartlar IBM kartlar gibi deste halinde değil fakat katlanarak sürekli bir dizi oluşturuyordu. 99 adet hafıza ufak aküler gibi bir masanın gözlerini dolduruyordu. Kart okuyucu kafa ve baskı yapan özel bir daktilo, sistemi tamamlıyordu.

Bir mühendislik bürosu için kesit değerleri, gerilme tahkikleri, moment hesapları gibi sayfalarının oluşturulması ve bunların basılabilmesi çalışmaları kolaylaştırıyor ve düzene sokuyordu. Baskı yapan daktilo da sistemin en önemli unsurlarından biriydi. 70'li yıllarda 40.000 DM gibi bir para harcayarak böyle bir yatırım yapmış olan Bremen'de üç büroyu ben biliyorum. Daha gelişmiş bir makina da MAEL makina idi. O da komşu bir büroda idi. Bu makinalar 80'li yıllarda yaygınlaşacak mikro-kompüterlerin öncüleriydiler.