Herkese merhabalar,Kısa bir süre önce Bilgisayar Mühendisliği öğrencisi bir arkadaşım ödevi için Warnsdorff algoritmasının görsel olarak uygulanışını rica etmişti, ricasını bazı sebeplerden dolayı geri çevirmiştim ancak merakımı gidermek için biraz araştırdım ve Warnsdorff algoritması ve Allegro kütüphanesiyle “Dıgıdık” adını verdiğim bir uygulama hazırladım. Bu yazıda Warnsdorff algoritmasına yer verecek olsam da daha çok bildiğim kadarıyla Allegro üzerinde duracağım.Nedir Warnsdorff Algoritması?
Konuyla ilgili problem şu; satranç tahtası üzerinde atı her kareye sadece 1 defa uğramak şartıyla bütün tahta üzerinde gezdirmeniz gerekiyor. Warnsdorff algoritmasının çalışma prensibi ise “en az alternatif sunan alternatif sonuca götürür” şeklinde. Algoritmayı uygularken yapmanız gereken olay, bir başlangıç konumu alıyorsunuz, sonrasında daha önce ziyaret edilmemiş alternatif konumları buluyorsunuz. Aynı şekilde, bu alternatif konumların “ziyaret edebileceği” alternatif konumları hesaplıyorsunuz. En az alternatif sunan konuma hamle yapıyorsunuz. Dikkat etmeniz gereken tek nokta ise, hiç alternatif sunmayan konuma en son yönelmek.Dıgıdık için hazırladığım Warnsdorff algoritmasını kullanmak isterseniz şu şekilde kullanabilirsiniz:extern int dpos[8][2]; // saat yonunde farklar.char x = ‘A’; // baslangic konumuint y = 1, yeni = 0, hamle = 1; // baslangic konumu, alternatif konum indisi, hamle sayaciwhile(yeni != -1){yeni = set_position(x,y,hamle);printf(“%d.Hamle: %c%dn”,hamle,x,y);if(yeni != -1){x += dpos[yeni][0];y += dpos[yeni][1];hamle++;}}
Bu şekilde uygulandığı taktirde belirtilen başlangıç konumundan (A1) sonuca giden tüm hamleler gösterilecektir.
Allegro Kütüphanesi
“Allegro kütüphanesi nedir?” diyecek olursanız, basitçe; Allegro kütüphanesi, açık kaynak kodlu, ücretsiz, bir çok dil için bağlayıcısı (binding) olan, platformdan bağımsız bir oyun programlama kütüphanesi. Genellikle 2 boyutlu oyunlar için tercih edilen bir kütüphane.Allegro4 kütüphanesini Ubuntu üzerinde kurmak için terminalde “sudo apt-get install liballegro4.2” komutunu vermeniz yeterli olacaktır. Diğer dağıtımlar ve platformlar için bu adreslerdeki belgelere [1][2] göz atabilirsiniz.Şimdi Dıgıdık örneğinden yararlanarak biraz Allegro kütüphanesini inceleyelim. İndireceğiniz kaynak kodlarında yer alan digidik.c dosyasını burada biraz özet geçip basitleştirerek anlatmaya çalışacağım./*bazi baslik dosyalari*/#include // Allegro kutuphanesi baslik dosyasi#include “./datafile.h” // datafile.dat dosyasindaki verilere erismemizi kolaylastiran tanimlarin bulundugu baslik dosyasiDATAFILE *dfile = NULL; // datafile.dat dosyasina erisim icin tanimladigimiz DATAFILE turundan bir pointer.BITMAP *buffer; // gecerli goruntuyu 1.hamlede yazdiracagimiz bir buffer, BITMAP turunda pointer.int main(){/*bazi degiskenler*/if(allegro_init() != 0){// oncelikle allegroyu hazir hale getiriyoruz.printf(“Error initializing allegron”);return -1;}install_mouse();install_keyboard();// uygulamada klavye ve mouse girdilerini alabilmek icin bu fonksiyonlari cagiriyoruz*set_color_depth(24);/*ekran derinligini 24-Bit Truecolor olarak ayarladik. Eger pixel basina 8-Bit resim dosyalarini kullanacaksanız 8, 16-Bit kullanacaksanız 16ve 32-Bit resim kullanacaksaniz 32 parametrelerini verebilirsiniz. Bu arada 8-Bit resimleri kullanabilmek icin allegro’nun palet fonksiyonlarinaihtiyaciniz olacak.*/if(set_gfx_mode(GFX_AUTODETECT, 800, 600, 0, 0) != 0){set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);// goruntu modunu 800×600 cozunurlukte grafik moda ayarlamayi deniyoruz, basarisiz olursa text moda gecis yapiyoruz***allegro_message(“Error setting GFX mode.n%sn”,allegro_error);return -1;}if((dfile = load_datafile(dfilep)) == NULL){// datafile.dat dosyamizi yukluyoruz, dfilep degiskenimizi “/home/kullaniciadi/datafile.dat” kabul edin****set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);allegro_message(“Error loading data file:n%sn%sn”,dfilep,allegro_error);return -1;}clear_to_color(screen, makecol(0, 0, 0));buffer = create_bitmap(800, 600);clear(buffer);//once screen global degiskenimizi***** siyah renk kullanarak temizledik ( ilginc bi anlatim oluyor )//sonrasinda buffer olarak kullanacagimiz buffer degiskenimize 800×600 ebatinda bos bir bitmap atadik//ve onu da temizledik.while(!key[KEY_ESC]){/*bu uygulamada dananin kuyrugu burda kopuyor. klavyeden ESC tusuna basilmadigi surece bu dongu devam edecek.fark ettiginiz gibi key adinda bir array degiskenimiz var (boyutunu hic merak etmedim) ve KEY_* olarak tanimlanmisindisler ile (KEY_ESC tanimi kacinci indis icin tanimlanmis onu da merak etmedim) degerin 1 veya 0 olma durumu kontrol ediliyor.biz degerin 1 olmama durumundan istifade ettik. Bu donguden cok yararlanacagiz.*/draw_sprite(buffer, (BITMAP *) dfile[img_board].dat, 0, 44);/* ekrana bir sprite grafigini basan fonksiyonparametreler: buffer, image, x, yben datafile kullandigimdan dolayi ikinci verdigim parametre bu sekilde oldu. Diger durumlarda olay biraz degisiyor.incelemenizde fayda var */textout_ex(buffer, font, “Use ESC button for to exit”, 550, 44, makecol(255, 255, 255), -1);/* ekrana yazi yazmamizi saglayan fonksiyon.parametreler: buffer, font, text, x, y, color, background color*//*Mouse tiklanma kontrolu (sol tus: mouse_b & 1)Tiklanilan yerin tahta uzerinde bir konum olup olmadigi kontroluWarnsdorff algoritmasinin yurutulmesi*//*Bu satirlar arasinda onemli olan 3 nokta:textprintf_ex(buffer, font, 550, 57, makecol(255, 255, 255), -1, “Starting point: %c%d”, tx, ty);ekrana formatli yazi yazma fonksiyonuparametreler: buffer, font, x, y, color, background color, formatli text, arguman1, arguman2, …clear_keybuf();Oyun bittikten sonra yeniden baslatilabilmesi icin key[KEY_SPACE] in durumunu kontrol ettim. 1 oldugu taktirdebelirli degiskenleri baslangic degerlerine getirdim ve sonrasinda key degiskenini baslangic durumuna getirdim.yani tum degerler ( key[0], key[1], …, key[n] ) 0 oldu. clear_keybuf fonksiyonunun gorevi bu.Son olarak timer rutinleri ugrasmadan, time fonksiyonu yardimiyla isimi gorebilecek basit bir timer yaptim.bu timer, ilk key[KEY_ESC] dongumuzden istifade ediyor.*/blit(buffer, screen, 0, 0, 0, 0, 800, 600);// buffer degiskenimizdeki tum degerleri donanimla iliskili screen degiskenimize aktariyoruzclear(buffer);// ve buffer’imizi dongu boyunca temizliyoruz.}unload_datafile(dfile);// datafile dosyamizi kapattik. vereturn 1; // uygulama sonlandirildi.}
Burda elimden geldiğince konuyu özet geçmeye çalıştım; ilk aşamada Dıgıdık örneğini incelemek, sonrasında Allegro4 Manuel’ini güzelce bir incelemek ilgilenen arkadaşlar için yardımcı olacaktır.*Klavye ve mouse rutinleri**Palet rutinleri***Grafik modları****Datafile*****Screen Globali