Oyun Dünyamızda Yürümek


Artık dünyamızı görebildiğimize göre artık içinde yürüyebilmemizi sağlayacak kodu yazabiliriz. bir-yönde-yürü fonksiyonu (fonksiyonel stil'de değil) bir yön seçer ve o yönde yürümemizi sağlar:

(defun bir-yönde-yürü (yön)
  (let ((sonraki (assoc yön (cddr (assoc *yer* *harita*)))))
    (cond (sonraki (setf *yer* (third sonraki)) (bak))
          (t '(bu yönde gidemezsiniz.)))))

let özel komutu bize sonraki yerel değişkenini yaratmamıza izin verir ve buna oyuncunun yürümek istediği yöne ait yol tanımını atarız- cddr ise sadece ilk elemanı listeden kesip alır. Eğer kullanıcı sahte bir yön yazarsa sonraki artık nil olur. cond komutu ise Lisp'te bir dizi if-then komutu gibidir: cond içindeki her satırın kontrol etmesi gereken bir değer ve yapması gereken bir görev vardır. Bu durumda, eğer sonraki yer nil değil ise oyuncunun yerini yol tanımındaki üçüncü elemana setf'leyecektir, ki bu da yeni yönü anlatan sembolü tutar, ve sonra kullanıcıya yeni yerin nasıl göründüğünü söyler. Eğer sonraki yer nilise o satırı gerçeklestiremeyip bir sonraki satıra gecer ve kullanıcıyı da uyarır. Haydi bunu deneyelim:

(bir-yönde-yürü 'bati)

==> (|GÜZEL| BIR BAHCEDESINIZ.
     |ÖNÜNÜZDE| BIR KUYU VAR.
     DOGU ILE KAPI ARASINDA BIR YOL VAR.
     ZEMINDE BIR KURBAGA |GÖRÜYORSUNUZ.|
     ZEMINDE BIR ZINCIR |GÖRÜYORSUNUZ.|)

Tanımlama fonksiyonlarımızı, oyuncumuza yazması kolay, bir bak komutu ile basitlestirmiştik. Benzer bir şekilde bir-yönde-yürü komutumuza da oyuncumuzun yazması gereken sinir bozucu işaretlemelerden arındıracak bir ayarlama yaparsak hoş olur. Ancak öğrendik ki, derleyici bir formu Kod Kipi'nde okumaya başlarsa bütün parametrelerini de, bir kesme işareti aksini söylemedikçe Kod Kipi'nde okur. Derleyiciye bati'nin sadece bir parça veri olduğunu kesme işareti kullanmadan bir şekilde söyleyemez miyiz?


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