İNÖNÜ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ 2. SINIF 1. DÖNEM VERİ YAPILARI DERSİ LABORATUAR ÖDEVİ AD SOYAD: TESLİM TARİHİ: OKUL NO: TESLİM SÜRESİ: 1 hafta ÖDEV NO: 4 1 Kısaca LIFE diye de anılan LIFE GAME İngiliz matematikçi John Horton Conway tarafından 1970 yılında hücresel simülasyon amaçlı olarak tasarlanmış bir hücresel otomattır. (Cellular Automata, Cellular Spaces) Game oyuncusuz bir oyundur. Bunun anlamı temel bir başlangıç durumundan başlayarak, gelişimin iterasyonlar boyunca devam etmesidir. Yani hücrelerin hayatta kalma ve ölüm kurallarına göre dizayn edimiş bir simülasyon aracı olarak tasarlanmıştır. Bu simülasyonda hücrelerin YAŞAM ve ÖLÜM olmak üzere iki durumu söz konusudur. Bu oyunda amaç belli bir başlangıç durumu referans alınarak, belli bir bölge içerisinde, zaman içerisinde hücrelerin hayat ve ölüm durumlarını test edip sonuçları görmektir. LIFE GAME KURALLARI: LIFE GAME nin evreni, her birinin sadece CANLI, ÖLÜ olmak üzere 2 olası duruma sahip olduğu 2 boyutlu karelerden oluşur. Her bir kare bir hücreyi temsil eder. Her hücre yatayda dikeyde ve çaprazda olmak üzere 8 bitişik komşu hücre ile etkileşim içindedir. Her zaman iterasyonunda aşağıdaki kurallara göre bir sonraki durum belli olur: 1 2 canlı hücre hücreden az komşusu olan herhangi bir hücre ölür. 2 2 veya 3 canlı hücre komşusu olan herhangi bir hücre bir sonraki nesilde yaşar. 3 3 den fazla canlı hücre komşusu olan herhangi bir hücre bir sonraki nesilde ölür. 4 3 canlı hücre komşusu olan her hangi bir ölü hücre bir sonraki nesilde yeniden üretilir ve yaşamaya başlar. LIFE GAME evreninin başlangıç deseni sistemin çekirdeğini oluşturur. İlk nesil yukarıdaki kuralları uygulayarak aynı anda çekirdekteki tüm hücrelere aynı anda yaratılır. Ölüm ve yaşam aynı anda meydan gelir. Her bir değişim döngüsüne bir iterasyon denir. Simülasyon yukarıdaki kurallar dahilinde devam eder. BAŞLANGIÇ DESENİ: TAVSİYE EDİLEN JAVA SINIFLARI: Uygulamada 2 adet sınıf olması tavsiye edilir. Sınıflardan birisi ugulamanın görselliğini sağlayan Java Applet tarafını oluşturur. Diğer sınıf ise LIFE GAME in kurallarının yazılacağı sınıftır. Şekil 1: Pulsar deseni Şekil 2: LIFE GAME uygulaması tavsiye edilen java sınıf görünümleri
1. class: public class LifeGameRules: Life Game 18 x 18 lik bir habitat üzerinde simüle edilecektir. Simülasyon başlamadan b önce habitatt şekil 1 de verilen pulsar deseni ile başlayacaktır. Her iterasyon için bir yedek 18 x 18 lik habitat üzerinde yukarıda belirtilen kurallar dahilinde değişiklikler yapılmalı ve sonuç sağlandığında iterasyon sonucuu tekrar anaa habitata aktarılmalıdır. Aktarılan bu yeni habitat değeri applet uygulamasındaa ekranda simüle edilecektir. 2. class: public class AppletLifeGame extends Applet implements Runnable: Bir önceki Applet uygulamasında ekrana çizilen bilginin tekrar tekrar tazelenmesine ihtiyaç duyulmamıştı. Bu Applet uygulamasındaa ise diğerinden farklı olarak her iterasyondan sonra sonucu belli zaman aralıklarıyla tekrar tekrar ekrana basılması, yani devamlı olarak çizimin ç yenilenmesi (repaint) ihtiyacı ortaya çıkmıştır. Bu nedenle java.lang ın altındaki Runable sınıfı Applet uygulamasına eklenmiştir. Bu uygulamaa içinde Thread konusunu barındırır. Threadlar hakkında detaylı bilgi edininiz. Aşağıda size uygulamanızda kullanacağınız 1 er saniye aralıklaa tekrar çizimm yaptırmakk için kurulmuş java kodları ve kod yazılacak boşluklar bırakılmıştır. Uygulamadaa yapılması gereken tek şey 1 er saniye aralıkla tekrar paint() fonksiyonu repaint() ile çağrılarak çalıştırılacağını bilmek ve ona göre kodları yazmak kalacaktır. Kod kısmında ise: Draw.Rect( ) fonksiyonu ile yan yana ve alt alta 188 x 18 lik yan yana kare çizdirmek, Karelerin içlerini başlangıç desenindeki duruma göre ölü ve canlı nesilleri ekrana basmak (ölü hücre: içi boş kare, canlı hücre içi doldurulmuş (fillrect(x, y, width, height)) İçi doldurulmuş yani canlı bir karenin, ölü konumuna geçtiğinde celearrect(..) fonksiyonu ile içi silinmelidir. 1. class tan alınan 18 x 18 lik habitat değeri dizisinin canlı, ölü durumlarına göre burada dolu boş kareler (Şekil 3) oluşturulmalıdır. Şekil 3: Tek bir karenin yanıpp söndürüldüğü Java Applet uygulama çıktısı
ÖRNEK JAVA APPLET UYGULAMA KODLARI: package LifeGame; import java.applet.*; import java.awt.*; import java.util.*; public class AppletLifeGame extends Applet implements Runnable{ Thread t1,t;// Runable altındaki thread tanımı yapıldı final int enboy=10; //karenin en boyu aynı olacağı için globalde tanımlandı final int karesutunsayisi=10; final int karesatirsayisi=10; boolean a; @Override public void start(){ // thread Applet uygulamasının start yordamında nesne t=new Thread(this); // ile birbirine bağlanır ve thread başlatılır t.start(); //runable nin run yordamında her 1 saniyede repaint yapılması sağlanılır public void run() { t1=thread.currentthread(); while (t1==t){ repaint(); try{ t1.sleep(1000); catch(interruptedexception e){ //Applet uygulamasının init yordamı applete giriste 1 kere calısır ve initial işlemleri yapılır public void init(){ a=false; // her repaint işleminde paint yordamı tekrar çalışacaktır. public void paint(graphics g){ for (int y=0;y<karesatirsayisi;y++){ for(int x=0;x<karesutunsayisi;x++){ g.drawrect(10*x, 10*y, enboy, enboy); if (a){ g.fillrect(10, 10, enboy, enboy); a=false; else{ g.clearrect(11, 11, enboy 1, enboy 1); a=true;
2 Java.util.LinkedList; sınıfı Java tasarımcıları tarafından geliştirilmiş ve JAVA ya eklenmiş bir Bağlı Liste sınıfıdır. Bu sınıf içerisinde hazır olarak verilmiş add( ), addfirst( ), addlast( ) gibi fonksiyonlar ile tanımlanan ve bir bağlı liste nesnesine ekleme çıkarma ve listeleme gibi bir çok işlem yapılabilir. Bu ön bilgilere dayanarak bir satranç oyununda karşılıklı olarak 2 oyuncunun yaptıkları hamleleri iki ayrı bağlı listede tutmak istenmektedir. Kullanıcılar A ve B oyuncusu olarak isimlendirilmelidir. Yapılan hamleleri tutacak iki bağlı liste LinkedList sınıfından yararlanarak tanımlanacaktır. Hamleler aşağıda gösterilen hamle formatı şeklinde saklanacak ve main yordamında da yine aynı formatla girdi alınması sağlanacak, bu formatın dışında girilen her girdi değeri bağlı listelere eklenmeyecek ve girdi yapan kişi mesajla girdinin yanlış olduğu konusunda uyarılarak yeni girdi istenecektir. Hamle Formatı: Hamle Satır Sütun: <taş_ismi_kısaltması><hamle_sutun><hamle_satır> şeklinde oluşturulacaktır. Örnek: AH5, SF3,. Taş İsmi Kısaltmaları: Kale: K, At: A, Fil: F, Şah: S, Vezir: V, Piyon: P Satır: 1, 2, 3, 4, 5, 6, 7, 8 Sütun: A, B, C, D, E, F, G, H SINIF BİLGİLERİ: HAMLE FORMATI SINIFI: Bu sınıfta hamle formatında tutulması gereken veriler tanımlanmalı ve LinkedList sınıfına bağlanmalıdır. class HamleFormati{ ANA SINIF: Bu sınıfta LinkedList sınıfları ile iki kullanıcıya özel sınıflar taımlanmalı ve LinkedList sınıfının hazır fonksiyonları* kullanılarak aşağıda tavsiye edilen metodlar yazılmalıdır: hamleeklea(hamleformati hamle) { hamleekleb(hamleformati hamle) { hamlelistelea() {. hamlelisteleb() {. sonhamleyigeriala(){ sonhamleyigerialb(){ sonhamlelerigerialab(){ karsiliklihamlelisteleab(){ Boolean hamleformatiuygunmu(string hamlegirdi){ MAİN METODU: Bu metod içerisinde A ve B oyuncuları içi sırayla karşılıklı hamle girdileri istenecektir. Girdi olarak alınan String ifadeler pars** edilerek her bir karakterin Hamle formatına uygun yapılıp yapılmadığının kontrolü yapan hamleformatiuygunmu() fonksiyonundan uygun değer dönerse hamleyi A veya B oyuncusunun listesine eklemelidir. Uygun değilse girdiyi tekrar istemelidir. Bu işlemler konsol ortamında olmalı ve aşağıdaki formatla kullanıcı ile etkileşimde bulunmalıdır. Girilen komuta göre işlem yapılması sağlanmalıdır. KONSOL EKRANI FORMATI: 1 Oyuncu A için hamle gir * LinkedList sınıfının hazır fonksiyonları hakkında genel 2 Oyuncu B için hamle gir bilgiler için bilgilendirici linkler Web sitesinde verilecektir. 3 Oyuncu A nın hamlelerini listele ** String ifadeleri char dizisine pars etmek için 4 Oyuncu B nin hamlelerini listele char c = s.charat(0); gibi bir fonksiyon kullanılabilir. 5 Oyuncu A nın son hamlesini geri al 6 Oyuncu B nin son hamlesini geri al *** LinkedList sınıfı ile ilgili örnek oluşturacak bir uygulama 7 Oyuncu A ve B nin tüm hamlelerini listele aşağıda verilmiştir. Komut Giriniz:
LinkedList SINIFI ÖRNEK KOD:*** import java.util.linkedlist; class Col{ int i; String g; byte a; public Col(int i, String g,byte a){ this.a=a; this.g=g; this.i=i; public class LinkList { public static void main(string args[]) { // bir bağlı liste oluştur // eğer tek bir temel tip tutulacaksa bağlı liste nesnesi aşağıdaki gibi tanımlanmalı LinkedList<Integer> llint=new LinkedList<Integer>(); LinkedList<String> llstr=new LinkedList<String>(); LinkedList ll=new LinkedList() //eğer birden fazla tip içeren bir liste isteniyorsa bağlı listeye bir sınıf atanabilir: LinkedList<Col> llc = new LinkedList<Col>(); //atanan sınıftan yeni nesne tanımlanır Col c=new Col(65,"fat",(byte) 3); //String de bir sınıftır. tanımlanan string sınıfı bilgi tutan bağlı listeye eleman ekleme: llstr.add("merhaba"); llstr.add("dünya"); System.out.println("String Bağlı listenin tüm içeriğine erişilir: " + llstr); //İnt. temel bir tiptir. tanımlanan int tip tutan bağlı listeye eleman ekleme llint.add(56); llint.add(3); System.out.println("Integer Bağlı listenin tüm içeriğine erişilir: " + llint); // Sınıf ile bağlı listeye ekleme aşağıdaki gibi yapılır llc.add(c); System.out.println("Con sınıfından c nesnesinin g değişkenine ulaşma: " + llc.get(0).g); System.out.println("Con sınıfından c nesnesinin a değişkenine ulaşma: " + llc.get(0).a); System.out.println("Con sınıfından c nesnesinin i değişkenine ulaşma: " + llc.get(0).i);