Oyun Dünyamız için Verileri Tanımlamak


Formlar hakkında daha fazla bilgi edinmek için oyun dünyamızın verilerini oluşturacak formları yaratalım. Oynumuzda oyuncunun alıp kullanabileceği objeler olacak, öncelikle bu objeleri tanımlayalım:

(setf *nesneler* '(viski-sisesi kova kurbaga zincir))

Şimdi bu satırı parçalara bölelim ve ne dediğine bakalım: Bir Lisp derleyicisi hep Kod Kipinde okumaya başlar ve bir form bekler, yani ilk sembol, setf, bir komut olmalıdır. Bu durumda komut, değişkene bir değer atamaktadır: Değişken *nesne*dir (Lispçiler global değişkenleri iki yıldız arasına yazmayı severler) ve onu eşitlediğimiz değer de dört nesneli listemiz.Şimdi, listemiz veri tipinde olduğu için (derleyicinin viski-sisesi isimli bir fonksiyonu çağırmaya çalışmasını istemiyoruz yani) derleyiciyi listeyi okurken Veri Kipine döndürmemiz gerekiyor. Listenin önündeki kesme işareti derleyiciye dönmesini söyleyen komuttur:


Komutun neden setf olarak isimlendirildiğini merak ediyor olabilirsiniz. Açıkçası ben de pek emin değilim ama fark edeceksiniz ki Lispte pek çok komutun garip isimleri var, ne de olsa Lisp çok eski bir dil. Bu aslında yararlı bir durum, genel komutların Lisp sürümleri Lispe özel tüm zarif güçlerine sahiptir yani bu garip isimler Lispteki komutlarla diğer dillerdeki komutların karışmasını engeller. Mesela setf komutu bu klavuzda değinebileceğimizin ötesinde becerilere sahiptir.

Şimdi dünyamızdaki bazı nesneleri tanımladık, bir adım daha ileri gidip dünyanın gerçek halini tanımlayalım. Dünyamızın neye benzediğine ilişkin resim:


Bu basit oyunda sadece üç değişik mekan olacak: oturma odası ve çatı katı ile bahçesi olan bir ev. Bu küçük dünyayı anlatacak *harita* isimli yeni bir değişken tanımlayalım:

(setf *harita* '((oturma-odasi (büyücünün evindeki bir oturma odasindasiniz. kanepede horul horul uyuyan bir büyücü var.)
                         (bati kapi bahce)  
                         (ustkat merdiven cati-kati))
               (bahce (güzel bir bahcedesiniz. onünüzde bir kuyu var.)
                         (dogu kapi oturma-odasi))
               (cati-kati (terk edilmis evin cati katindasiniz. kösede dev bir kaynak makinasi var.)
                         (altkat merdiven oturma-odasi))))

Bu harita bizim üç mekanımızla da ilgili önemli olan her şeyi içermektedir: mekana ait özel bir isim (yani ev, bahce ve cati-kati), oradan görülenlerle ilgili kısa bilgi (büyük listenin içinde kendine ait bir listede saklanmakta), ve o yerin içeri ve dışarı yollarıyla ilgili nereye ve nasıl yöntemleri. Bu tek değişkenin ne kadar bilgi zengini olduğuna ve sadece bilmemiz gerekenleri anlattığına dikkat edin Lispçiler küçük, kısa ve öz olan, fazlalık yapan her şeyi dışarda bırakan ve sadece bakarak anlaşılabilen kod parçacıkları yaratmayı severler.

Artık bir haritamız ve çeşitli nesnelerimiz olduğuna göre bu nesnelerin haritada nerelerde olduğunu söyleyen bir değişken yaratmamız mantıklıdır:


(setf *nesne-yerleri* '((viski-sisesi oturma-odasi)
                                (kova oturma-odasi)
                                (zincir bahce)
                                (kurbaga bahce)))

Burda her nesneyi bir yer ile ilişkilendirdik. Bu cins listeler Lispte tahmin edeeğiniz üzere ilişkilendirme listeleri olarak adlandırılır. Bir ilişkilendirme listesi kısaca bir listeler listesidir, bu iç listelerin her birinin ilk elemanı bir anahtar semboldür ve diğer bir takım verilerle ilişkilendirilmiştir. Aynı zamanda *harita* değişkenimiz de bir ilişkilendirme listesidir burdaki üç anahtar ise oturma-odasi, bahce ve cati-kati.

Dünyamızı ve içindeki nesneleri tanımladığımıza göre geriye kalan tek şey oyuncunun nerede olduğunu tanımlamaktır:

(setf *yer* 'oturma-odasi)
Şimdi oyun komutları yapmaya başlayalım!

<< ÖNCEKİ BÖLÜM                   SONRAKİ BÖLÜM >>