Renkli Yaşam

Onuncu sayımızda bir program yayınlamıştık. Adı LİFE GAME idi. Bir yaşam oyunuydu bu. Bir alandaki canlıların, gelişen nesiller boyu geçirdikleri evrim, matematiksel olarak ortaya konuyordu. Şimdi, bu ölüm kalım savaşının biraz daha karmaşık, çok daha renkli ve bir o kadar ilginç bir başka türünü sunuyoruz sizlere. En temel fark, eski oyun dikdörtgen bir ALAN üzerindeyken, bu oyun bir ÇİZGİ üstünde gerçekleşiyor. Bu çizgiyi yanyana konmuş yaşam hücreleri olarak düşünüyoruz. Her hücrede 0, 1, 2 veya 3 tane canlı var. Sadece üçe kadar canlı kullanmamızın nedeni, her canlı sayısı için farklı bir renk kullanmamız ve C-64'ün yüksek çözünürlüklü çokrenkli grafikte dört değişik renk kullanabilmesi. Eğer grafik özellikleri AMİGA gibi olan bir aletimiz olsaydı, bir hücreye 0-31 arası sayıda canlı koyabilirdik. Gene aynı nedenle, çizgimiz üstünde yanyana 160 hücre olduğunu düşünüyoruz. Çünkü çokrenkli grafikte X-ekseni 160 noktadan oluşuyor. Oyunu başlatmadan önce, 160 hücrenin içine değişik sayılarda canlılar yerleştiriyoruz. Tabii en az 0 en çok da 3 olmak üzere. Peki, her hücrenin bir sonraki nesilde içereceği canlı sayısı nasıl hesaplanacak? Bunu, o hücrenin sağındaki ve solundaki hücrelerde bulunan toplam canlı sayısı ile kendi içinde o anda bulunan canlı sayısını toplayarak belirliyoruz. Dolayısıyla, elde edeceğimiz toplam 0-9 arası bir sayı olacaktır. Ama her hücrede en fazla 3 canlı olabileceğini söylemiştik?! İşte bu nedenle, bir de kural tanımlıyoruz. 10 elemandan oluşan bu kuralın elemanlarını sırayla 0, 1, ...9 olarak numaralıyoruz ve her elemanın içine 0-3 arası bir sayı koyuyoruz. Diyelim ki yukarıdaki toplamımız 7 çıktı. Bu durumda kuralımızın yedinci elemanına bakıyoruz. Diyelim ki içinde 3 var. Bu durumda toplamını gerçekleştirdiğimiz hücrenin içinde bir sonraki nesilde 3 canlı olacak. İsterseniz bir örnek görelim... Örneğimiz için, sadece 5 hücre uzunluğunda bir yaşam çizgisini ele alalım ve içlerine de, tamamen tesadüfi olarak, şu sayıları yerleştirelim:

20312

—

Çizginin geri kalan kısımlarının 0 canlı içeren hücreler olduğunu varsayalım. Şimdi de bir kural belirleyelim:

0213201323

Bu kuralı sözle şu şekilde belirtebiliriz:

0) Eğer bir hücrenin toplamı 0 ise bir sonraki nesil için de 0 canlı olsun. 1) Eğer bir hücrenin toplamı 1 ise bir sonraki nesil için de 2 canlı olsun. 2) Eğer bir hücrenin toplamı 2 ise bir sonraki nesil için de 1 canlı olsun. 3) Eğer bir hücrenin toplamı 3 ise bir sonraki nesil için de 3 canlı olsun. 4) Eğer bir hücrenin toplamı 4 ise bir sonraki nesil için de 2 canlı olsun. 5) Eğer bir hücrenin toplamı 5 ise bir sonraki nesil için de 0 canlı olsun. 6) Eğer bir hücrenin toplamı 6 ise bir sonraki nesil için de 1 canlı olsun. 7) Eğer bir hücrenin toplamı 7 ise bir sonraki nesil için de 3 canlı olsun. 8) Eğer bir hücrenin toplamı 8 ise bir sonraki nesil için de 2 canlı olsun. 9) Eğer bir hücrenin toplamı 9 ise bir sonraki nesil için de 3 canlı olsun. Şimdi bu beş hücrenin gelecek nesildeki durumunu gözönüne alalım. İlk hücrenin içinde 2 canlı var. Solunda ve sağında ise 0 canlı. Toplamı 2 eder. İkinci kurala bakıyoruz, sonuç 1. Yani bir sonraki nesilde bu hücrede 1 canlı olacak. Aynı işlemi üçüncü hücre için yaparsak, 0+3+1=4 sonucunu ve dördüncü kuralda da 2 sayısını buluruz. Demek ki bu hücrenin canlı sayısı bir sonraki nesilde bir azalacakmış. Tüm çizgi için hesaplamayı yaparsak elde edeceğimiz yeni nesil şöyle olacaktır:

10213

Aslında kolay, değil mi? Zaten tüm bu işlemleri bilgisayar yapacak. Şimdilik...

Eğer C-64'ün çokrenkli grafiğinde bize sunduğu 160*200 noktalık grafiği ve 4 renk özelliğini kullanırsak ne olur? Her nesil bir grafik satırı olarak gösterilebilir ve her değişik canlı sayısı değişik bir renk anlamına gelir. Böylece bir defada, 200 nesil boyunca sistemin geçirdiği değişimi bir anda görebiliriz. Ve tüm bu işlemin sonucunda, inanılmaz güzellikte görüntüler elde etmek mümkün. Gelelim programımız hakkındaki teknik bilgilere (programın kendisini Döküm Eki'nde bulabilirsiniz). Programımızın ana iskeletini, MDE ile yazacağınız kısa bir makine dili programı oluşturuyor. Tüm çizim ve hesaplama işlemi bu program tarafından yapılıyor. Bu nedenle de, her ekran 4 saniyede hazırlanıyor. Eğer BASIC kullansaydık (hattâ SIMONS' BASIC), bu süre 25-30 dakika olacaktı. İşte makine dilini öğrenmeniz için bir sebep daha! Ancak bu rutini SYS 49152 ile çağırmadan önce bazı hazırlıklar yapmanız gerekiyor. Hücrelerin ilk nesildeki durumunu ve kullanılacak kuralı saptamak lazım. Bunun nasıl yapıldığını da örnek demo programlarını inceleyerek görelim. YAŞAM DEMO 1 programı önce, POKE 56,32 ile kullanacağı hafıza sınırını aşağıya indiriyor. Bu çok gerekli, yoksa programınız ve değişkenler grafik tarafından silinebilir. Sonraki işlem, yaşam çizgisinin ve kuralın hafızada yerleştirilecekleri adreslerin başlangıçlarının saptanması. Yaşam çizgisi, $5000 adresinden başlar ve bunu takip eden 159 byte boyunca devam eder. Makine dili programı, ilk nesille ilgili bilgiyi bu bölgeden okur. Kural ise $4000 ve bunu takip eden 9 byte içinde yeralır. Bir kez daha tekrarlayalım, tüm bu byte'ların içine POKE ile 0-3 arası sayılar yerleştirilmelidir. İlk satırın son komutu, bilgisayarın rasgele sayı üretimini yeniden başlatıyor, 20-23 arası satırlar, çizim renklerini ayarlıyor. Tesadüfi olarak birbirinden farklı üç renk seçiliyor. Dördüncü renk hep siyah olarak kalacak ve boş hücreler bu renkle çizilecektir. 25. satır, kuralın belirlendiği yer. Dikkat ederseniz, kuralın ilk elemanına 0 konuyor. Bu genelde daha iyi sonuçlar elde etmek için yapılıyor. İsterseniz değiştirip ortaya çıkan sonuçlara bir bakın. Kuralın geri kalanı gene tesadüfi olarak belirleniyor. İsterseniz, YAŞAM DEMO 2'de olduğu gibi DATA satırlarından da okuyabilirsiniz. 30. satır ise yaşam çizgimizin ilk halini belirliyor. Gene dikkat ederseniz, en baştaki ve en sondaki hücrelere 0 konuyor, geri kalanları tesadüfen belirleniyor. Böylece, grafiğimizin sağ ve sol kenarlarında bir tür çit yaratmış oluyoruz. Siz isterseniz değiştirin. Örneğin, ikinci örnekte tüm çizgi sıfırlanıyor, sadece ortasına 2123 dizisi yerleştiriliyor. Sonuç oldukça ilginç. Bu arada RND(8)*4 komutuna açıklık getirelim. Bu işlem 0-3.999999 arasında bir sayı yaratır. POKE komutu ile kullandığımız için, bu sayının tamsayı kısmı kullanılır, ki bu da bize 0-3 arası bir sayı verir. Bizim istediğimiz de buydu zaten. 40. satırda makine dili rutin çağırılıyor. Bu rutin, ekranı siliyor, grafik ekranına geçip multicolor'u açıyor, renkleri ayarlıyor ve çizimi yapıyor. Tüm programın SUPER ASSEMBLER dökümü açıklamalı olarak verilmiştir. Gene bu sayımızda verdiğimiz C-64 İLE GRAFİK yazısının ışığı altında inceleyip, istediğiniz değişiklikleri yapabilirsiniz. 50-60 arası satırlar, grafik çizimi bitince sizin bir tuşa basmanızı bekliyor. Eğer boşluk tuşuna basarsanız yeni bir grafik çiziliyor. Başka bir tuşa basarsanız 70-80 arası satırlarda grafik ekranı ve multicolor kapatılıp yazı ekranı normale döndürülüyor. Ve program bitiyor. Burada, isterseniz yeniden 40. satıra atlayarak, sistemin bir sonraki 200 nesilini de görebilirsiniz. Ama bunun için programa bir GOTO 40 eklemeniz lazım.

Dediğimiz gibi, bu örnek programlar sadece birer iskelet program. Üstlerde istediğiniz değişiklikleri yaparak yeni canlı türleri yaratabilirsiniz. Son olarak matematikçi, bilgisayarcı ve ilginç şeylerden hoşlanan tüm arkadaşlara düşünmeleri için birkaç soru: İlk nesili, kuralı ve hattâ renkleri bile tamamen tesadüfi olarak seçtikten sonra, nasıl oluyor da tüm sistem iki-üç nesil sonra kendiliğinden bir düzene giriyor ve bu düzeni sürdürüyor. Ekranın üst tarafında ortaya çıkan bir koloni grubu, ortadan kaybolduktan 50-60 nesil sonra aynı düşey doğrultuda nasıl yeniden ortaya çıkabiliyor? Bazı sistemler üç-dört satır sonra ölürken neden bazıları periyodik olarak devam ediyor? Neden bazı koloni grupları, ekranda hiç engel tanımadan önlerine çıkanı yiyerek belli bir doğrultuda hareket ediyor? Kalın sağlıcakla...

Oyunumuzda Berk (ekranda kumanda ettiğiniz sevimli yaratık) THE THING'in iğrenç yemeklerini hazırlamak zorunda. Bu konuda Berk de canavarların ve nesnelerin yardımını alıyor. Canavarlar trap door'dan (tuzak kapısından) çıkıyorlar, nesneler de bodruma yerleştirilmiş. Eğer Berk bir görev için gerekli nesnelerden bazılarını kaybederse, o görevi bırakıp sonrakine hazırlanabilir. Nesneler her zaman Berk'in son koyduğu yerde olacaklar. Eğer sonraki göreve geçmek istemiyorsanız, kendinizi trap door'dan aşağı atın. Böylece oyun baştan başlayacak. Berk nesneleri taşıyabilir, itebilir. Ama bunları yapması için uygun pozisyonda olması gerekli. Ayrıca Berk istediği bölgede dolaşabilir. Her yeri dolaşmanız oyunun gelişimi içinde çok işinize yarayacaktır. Dolaştığınız yerlerde bulunan nesnelerin yerini de ezberleyin. Dolaşacağınız yer toplam üç kattan oluşuyor; başladığınız yer, balkon ve bodrum. Berk ileri geri de hareket edebilir. Ayrıca door'u açıp kapatan kolu kullanmaya alışmanızda da yarar var. Böylece acil bir durumda bu işi kolayca yapabilirsiniz. Berk'in iki yamağı var. Boni konuşan bir kafatası. Alındığında bazen tavsiyelerde bulunuyor, bazen de hiç aldırış etmiyor. Adı Drutt olan örümcek ise yalnızca ayakbağı oluyor ve hiçbir işe yaramıyor.

Birinci Görev

Berk'in birinci görevi oldukça basit. The Thing için bir kutu kurt hazırlayacak. Bu görevi başarıyla tamamlamak için doğru tenekeyi almaya dikkat edin. Trap Door'u açıp kurtları bırakın ve hemen kapağı kapatarak başka şeylerin çıkmasını önleyin. Drutt onları yemeden mümkün olduğunca fazla kurt yemeğe yakalamaya çalışın. Burada Drutt'dan kurtulmak için trap door'u kullanabilirsiniz. Trap door'u açarak daha fazla kurt yakalayabileceğinizi unutmayın. Konserve kutusunu alın ve aptal garsona yerleştirin. Sonra onu The Thing'e göndermenin bir yolunu bulmalısınız. Kurtların işini bitirdiğinizde size iyi şeyler söyleyecek ve ikinci emrini verecektir.

İkinci Görev İkinci göreviniz kızarmış yumurta hazırlamak. Bunun için kapıyı açıp tavuğu dışarı bırakın ve kapıyı hemen kapamayı unutmayın. Tavuğu yumurtlatmak için arkasına mermi ile hamle yapmanız gerekli. Bu mermiyi nasıl bulacağınızı söylemeyeceğiz, ama mermi yerine (mermiyi kaybetmeniz ihtimali için de geçerli) başka nesneler de kullanabilirsiniz. Hattâ Drutt'u bile. Yumurtaları koymak için bir kap bulmanız gerektiğini ve yumurtaların kolay kırılır nesneler olduğunu unutmayın. Tavuğun yumurtlamaya hazır olduğunu gözlerinin büyümesinden anlayabilirsiniz. Yumurtaları bir kapta topladıktan sonra pişirin ve yollayın.

Üçüncü Görev

İşiniz gittikçe zorlaşıyor. Üçüncü göreviniz, kaynamış solucan hazırlamak. Bir kova ile su basmış bodruma inin ve birkaç solucan yakalayın. Bunları kaynatmak için büyük kırmızı kaba koymanız gerekiyor. Ama boyunuz kaba ulaşmak için yeterli değil. Bu nedenle daha yüksek bir yere çıksanız iyi olur. Bu işlemden sonra ateş püskürten canavarı trap door'dan bırakmanız gerekiyor. Onu kullanarak solucanları kaynatacaksınız. Eğer kap kaynamazsa bu iş olmadı demektir. Öyle ki, yolladığınızda kap hâlâ kaynar vaziyette olmalı. Bu iş bittikten sonra canavardan kurtulmanız gerekli ama canavar trap door'a gitmeyecektir. Onun için ağır bir şey bulup canavarı ezerseniz daha iyi olur.

| Br HER GAR or

MK A

Dördüncü Görev

Dördüncü göreviniz, gözbebeği ezmesi yapmak. Gözbebeğini hiçbir yerde bulamazsınız. Sizin yetiştirmeniz lazım. Bunun için kullanabileceğiniz bir paket tohum var. Tohumları ekmek için makul bir yer bulun ve tohumları ekin. Büyülü bir şekilde bitki olmalarını izledikten sonra ürettikleri gözbebeklerini toplayabilirsiniz. Ezmeyi hazırlamaya başlayabilirsiniz. Sıvıyı uygun bir kapta toplayın ve The Thing'e yollayın, oldukça susamış olmalı (bu yediklerinden sonra).

Beşinci Görev

Son göreviniz ortalığı toplamak. Bunun birçok yolu var, ama en uygunu hareket ettirilebilecek her şeyi toplayıp trap door'dan atmak. Hayalet göründüğünde yiyebilsin diye yenilebilir bir-iki şey saklamanız doğru olur. Kapıyı kapatmayı unutmayın. İşte şimdi kasayı açmanın tam zamanı. Ne kasası diye soracaksınız. Onu aşağıda bulamayacaksınız, o zaman yukarıda olmalı. Ayrıca bulunca kasayı açmanın bir yolunu da bulmalısınız. Size bir ipucu verelim, kasayı açmak için oldukça ağır bir nesne kullanmanız lazım.