|
|
Bu makalenin farklı dillerde bulunduğu adresler: English ChineseGB Deutsch Francais Nederlands Turkce |
Philipp Gühring <p.guehring/at/poboxes.com> Yazar hakkında: Philipp EDP dalındaki yüksek teknik okulu yeni bitirdi. Futu reware 2001 adlı yazılım geliştirme grubu için artık yeteri kadar zamanı olacak. Türkçe'ye çeviri: Elif Büşra Güraksın <guraksineb(at)yahoo.com> İçerik:
|
Dialog - diyaloglar için bir programlama diliÖzet:
Dialog bir programlama dili olup kullanıcıyla diyalog ortamı sağlar. Bu çalışma
Würstelstand ticari-simülasyonda kullanıldı. Bu makale Dialog'un gelişimini ve
uygulamalarını açıklamaktadır.
|
Diyaloglar Ascii dosyaları olarak saklanmakta ve herhangi
bir zamanda daha ileriki satırlara geçişin de mümkün olacağı şekilde satır
satır yorumlanmaktadır. Diyalogları basit bir text editörüyle oluşturduk.
Dosyanın ismi İsim.BAT (örneğin: HALE.BAT) şeklindedir. Oyuncu
(Leni) bişey söylediğinde:
Leni: Text Leni: Gunaydin! Size ne verebilirim? Leni: Su cocuklara bakin! Inanilmaz! |
Su cocuklara bakin! Inanilmaz! Yataktan mi dustunuz? |
Ekmekli iki Frankfurter ve kola. Hadi! Acele et, yasli adam! |
Müşteri birşeyler söylediğinde: (Kunde Almancada müşteri demek, Telefon
telefon demek)
Kunde: Text Kunde: Ekmekli iki Frankfurter ve kola. Hadi! Acele et, yasli adam! Telefon: Futureware 2001, Philipp Gühring. Sizin icin ne yapabilirim? |
Her normal diyalog şununla biter:
Ende(Ende Almancada son demek)
Basit bir örnek: |
Leni: Gunaydin! Ne istersiniz? Kunde: İyi gunler! Bir Käsekrainer lutfen! Leni: Bir saniye. Leni: İste geldi. Kunde: Cok tesekkurler. Hoscakalin! Leni: Hoscakalin! Ende |
Atlanacak hedefler satırın başındaki iki nokta üstüste (:) işaretiyle tanımlanır ve devamında atlanacak hedefin ismi gelir. Hedeflere Sprung komutuyla atlayabilirsiniz (Sprung Almancada atlamak demek):
:Hedef //Atlama ornegi: Sprung Hedef
|
Yorumlayıcı bu örnekte ne yapmakta? Önce Leni: komutunu buluyor ve 1 tekstini veriyor. Bir sonraki satırda dikkate alınmayacak bir yorum bulunmakta (Once bunu yapariz). Bir sonraki satırda Sprung komutu bulunmakta. Yorumlayıcı bütün diyaloğu tarayarak MENU_0 hedefini arar, birkaç satır aşağıda bulur ve oraya atlar. Sonra tekrar bir yorum bulunmakta (Geldim!). Ve son komut ekrana 3 yazan Leni: komutudur. Yani, yorumlayıcı, örnekte Leni: 2 komutunu geçti ve Leni, 2'yi söylemedi. |
Gördüğümüz gibi, bir satır:
// Bu bir yorumdur. ************************************** *Bu sekilde birisi de yorum yapabilir* **************************************Yorumlar komutlarla aynı satırda olmamalıdır:
Leni: Artık birsey anlamiyorum. // YORUM YOKYorumlayıcı Artık birsey anlamiyorum. // YORUM YOK metnini output yapılacak metin olarak algılar!
|
Dialog şu sistemi icat etmektedir: Sistemde girişlerin yerleştirildiği
ve kullanıcının cevaplama olasılıklarından oluşan bir liste bulunmaktadır.
Zamanı geldiğinde, menü ekranda gösterilir. Bu durumda kullanıcı bir seçim
yapar ve yorumlayıcı, programın seçilen girişi içeren kısmına atlar.
Öncelikle NEU ve ALT komutlarıyla girişleri listeye eklersiniz. Her iki komuttan sonra gidilecek hedef ve giriş metni vardır. Metin çok uzun bir satır olursa sistem satırı otomatik olarak böler. MENÜ komutuyla listenin tamamı görüntülenir ve kullanıcı bir giriş seçebilir. |
Neu satinalma, Her zamanki gibi sicak olsun, tamam mi? Neu is,Isler nasil gidiyor? Neu dil,WIFI'deki dil kursuna devam ediyor musun? Neu aile,Ailen nasil? Neu hava,Havadan memnun musun? MenüBu tiple, oyuncunun sırayla bütün girişlerle oynaması mümkün olmaktadır. Seçenekler tekrar kullanılabilir. Seçilmemiş girişler listede kalır ve daha sonraki bir aşamada seçilebilirler. Şimdi yukarıdaki örnekten is'i seçelim:
:is Leni: Isler nasil gidiyor? Kunde: Cok yogun, her zamanki gibi. MenüBelirtildiği gibi seçilen satır söner. Aşağıdaki konular listede kalır:
Kunde: Kac tane istersiniz? Alt biraz, 10 Tane Alt fazla, 20 Tane Alt enfazla, 100 Tane Menü :biraz //Kullanıcı 10 tane seçerse :fazla ... :enfazla ...Örneğin kullanıcı 20 tane seçerse, yorumlayıcı fazla hedefine atlar:
:fazla Kunde: Emin misiniz? Leni: Evet, 20 tane istiyorum. Kunde: Ne zamana lazim? Alt 1, Yarin Alt 2, Yarindan sonraki gun Alt 3, Birazdan MenüSon olarak iki tip birleştirilebilir:
Kunde: Gecmisteki guzel gunleri hatirla. Alt Hafiza,Evet, şimdi hatırladım da... MENÜ
Liste 0 opsiyonlar için önerilir. Liste 1 genel konular için, örneğin aile, iş, boş vakit, yemek, ... Eğer birisi iş hakkında konuşmak isterse ve iş konusu içinde başka konular varsa liste 2 seçilir. Hale'in diyaloğunda bir örneğimiz var. Eğer yukarıdaki üç listeden daha fazla listeye ihtiyaç duyulursa, yorumlayıcının kaynak kodundaki sabitin değiştirilmesi gerekir.
LISTE 0 LISTE 1 LISTE 2Bu işlemde bütün listelerin bütün girişleri kendi listelerinde kalmaktadır. NEU, ALT, MENÜ, LÖSCHEN gibi komutlar her zaman geçerli liste ile bağlantı kurar.
Neu Hafiza,§Yeah, şimdi hatırladım da...Liste 0 otomatik olarak silinen menüden sonraydı. Bu yüzden sadece seçenekler için kullanışlıydı; konular için değil.
Şimdi, oldukça fazla liste kullandığımız HALE.BAT ve PETER.BAT örneklerine göz atmayı öneririm.
LÖSCHEN hedefhedef i gösteren geçerli listedeki her girişi siler. Örneğin:
LÖSCHEN aileGeçerli listedeki bütün girişleri silmek için asterisk eklenir:
LÖSCHEN *
Menü asıl listedeki bütün girişleri gösterir ve kullanıcıya bunların içinden seçmesini sağlar. Bundan sonra seçilen giriş ve ALT komutuyla eklenen bütün seçenekler silinir. Son olarak yorumlayıcı buna göre hedefe atlar. Listede tek bir girişin olması durumunda, bu girişin seçim olduğu anlaşılır ve bu sebeple çoktan seçmeli bir menu gösterilmez. Eğer listede giriş yoksa veya hedef bulunamıyorsa, yorumlayıcı MENÜ den sonra bir sonraki satırla devam eder.
1 | Event; | //olay numarası (texte.h ye bak) | |
2 | geliefert; | //S | //0-10 kaç tane onluk teslim edilecek |
3 | wtag; | //haftanın günü | |
4 | tag; | //ayın günü | |
5 | monat; | //ay | |
6 | jahr; | //yıl | |
7 | Datum; | //seri günü (1.1.1997 = 0) | |
8 | wetter; | //bugünün havası | |
9 | konto; | //S | //banka hesabı |
10 | kapital; | //S | //nakit |
11 | ausgaben; | //S | //bugünün harcamaları |
12 | einnahmen; | //S | //bugünün gelirleri |
13 | sterne; | //S | //hot-dog stand'in kalitesi (0-5 yıldız) |
14 | wverkauf; | //bu hafta satılan ürün sayısı | |
15 | weinnahmen; | //haftalık gelir | |
16 | wausgaben; | //haftalık harcama | |
17 | 0; | //S | //yeni gelir/masraf (diyalog sonucunda) |
18 | Nachrichtenserie; | //hangi haber serisi(0=Elch,1=...) | |
19 | Nachricht; | //geçerli serideki hangi haber(0=1.Tag,1=2...) | |
20 | LottoNr[0]; | //kaç tane piyango numarası kullanıldı(0-6) | |
21 | LottoErgebnis[0]; | //kaç tane piyango numarası doğruydu | |
22 | LottoGewinn[LottoErgebnis[0]]; | //Leni ne kadar kazandı | |
23 | S.Image; | //S | //Leni'nin resmi |
24 | S.Override; | //S | //Umursamama-Olay |
25 | S.wverkauf[1]; | //geçen hafta satılan ürünler | |
26 | S.weinnahmen[1]; | //geçen haftanın geliri | |
27 | S.wausgaben[1]; | //geçen haftanın masrafları | |
28 | S.wverkauf[2]; | //iki hafta önce satılan ürünler | |
29 | S.weinnahmen[2]; | //iki hafta önceki gelir | |
30 | S.wausgaben[2]; | //iki hafta önceki masraf | |
31 | S.NOverride; | //S | //yarının önemsenmeyecek olayı |
32 | S.wetter_bericht; | //hangi hava tahmini | |
33 | Gesamtwert(); | //hot-dog stand'in toplam değeri | |
34 | Wetterbericht[S.wetter_bericht].Ereignis; | //hangi hava olayı | |
35 | Tageszeit; | //dakika olarak gün zamanı | |
70..79 | Lagermenge | //stoklar | |
80..89 | Verkaufspreis | //S | //ürün fiyatı |
90..99 | Kaufmenge | //S | //sipariş miktarı |
Sonraki 100 kayıt (100'den 199'a) herbir diyalog için özeldir. Oyunun başında sıfıra ayarlanırlar ve diyalog için bütün oyun boyunca süreklidirler. savegames,..., de saklanırlar ve sadece kendi diyaloglarıyla erişilebilirler. Sistem ve diğer bütün diyaloglar kayıtları okuyamaz/değiştiremezler. Birisi, diyaloğun başlangıcında birinin hangi diyalog kayıtlarını neden kullanmak istediğini belgelemelidir.
batch.cpp |
// Musteri: Peter Hinzing // // Kayitlarin kullanimi //[100] Ne siklikla buradaydi //[101] Cep harcligi //[102] Birkac olay //[103] Random sayi: siparis //[104] Random sayi: siparise cevap //[105] Farkli diyaloglar: 5nci gunde is //[106] Anlasma //[107] Secildikten sonra oyun basliyor //[108] Oyun.stake.tip //[109] Oyun.stake.miktar //[110] Oyun.sec.Peter //[111] Oyun.sec.Leni //[112] Hobby aktivasyonu //[113] Home aktivasyonu //[114] Würstelstand hakkinda diyalog //[115] toplam stok kola //[116] cok fazla?************************* //* henuz yapilmadi |
[200]: Leni Hale ile göçmen bürosuna gidebilir [201]: Leni read the dog's wanted circular [202]: Leni Peter ile Stein-Schere-Papier oynadı! (kötü!)
Olayları nasıl tetiklerim?
Aktion ifade // aktivasyon Cheats: Aktion 3 // kayıt 100'deki olayın aktivasyonu: Aktion [100]Bu Olaylarla ne yapabilirsiniz? Aşağıda Würstelstand'ın Olay listesinin bir kısmı gösterilmiştir:
0 | Error/Never | Olay 0 yakalanıyor ve bırakılıyor |
1 | Initialising | başlangıçta tetiklenir ve birçok ürünü, müşteriyi,... aktive eder |
2 | End | oyunun sonunda tetiklenir |
3 | activating FW-Cheat | Bunu kim kodladı?!? |
4 | deactivating FW-Cheat | Bu sırrı sakla! |
5 | Leni.competition.activating newspaper | Leni'nin resmi oldukça iyi-> yaklaşan yarışmayla ilgili gazete makalesinin aktivasyonu |
6 | Leni.competition.Zeitung->TelefonNr | Gazete makalesi içeriğe dahil etmek üzere telefon numarasını aktive ediyor |
7 | Leni.competition.deactivating TelNr | Telefon açtıktan ve herşeyi sınıflandırdıktan sonra telefon numarası deaktive ediliyor |
8 | deactivating Hale | Hale kendisini deaktive ediyor çünkü Leni onu gücendirdi. |
9 | Hale recommends Josi | Hale onunla ilgili konuşur konuşmaz Josi'yi active ediyor (Küçük konuşma önemli!) |
10 | deactivating Josi | Josi kendisini deaktive ediyor |
11 | deactivating Peter | Peter kendisini deaktive ediyor |
12 | Sepp Nachricht without Leni aktivieren | Sepp yasal olmayan üretim öneriyor, Leni kabul etmiyor, bütün herşey açıkta ve gözler önünde oluyor. |
13 | Sepp Nachricht with Leni aktivieren | Leni yasal olmayan üretimi kabul ediyor, problemler takip ediyor |
14 | lost game | Postacı Gottfried oyunun sonunu başlatıyor |
15 | won game | Gottfried hot-dog stand'in değerinin farkına varıyor ve Leni kazanıyor |
16 | Hale.news article Asyl activate | Leni Hale'e ailesinden söz ediyor, iltica ile ilgili gazete makalesi başlatılıyor. |
17 | Hale.news article->Telefonnr activate | Gazete, şimdi kullanılabilecek telefon numarasını gösteriyor |
18 | Hale->Zeitungsbericht->Telefonnr deactivating | Konuşma telefon numarasını deaktive ediyor |
19 | Hale->Familie activating | Hale'in ailesi iltica hakkı alıyor |
20 | activating the spy | Leni bir dedektif tavsiye edebilirdi fakat bu hiç pratiğe geçmiyor. |
33 | New products 1 (New supplier) | Bu olay ürün yelpazesini genişletiyor |
100 | won contest | Leni yarışmayı kazanıyor, müşteriler bunun hakkında konuşabilir, ... |
101 | losts contest | |
102 | Lotteryprice | Leni piyangoyu kazanıyor |
Rechne [100]: 20 + [30] * 10Kayıt 30'un içeriği, 10 ile çarpılıp, 20 ekleniyor ve kayıt 100'de saklanıyor.
Aşağıdaki matematiksel işlemler yapılabilir:
İşlem | Notasyon | Örnek | Çözüm | |
Klammern | (a) | (10+20)*30 | 900 | |
Register | [a] | [20] | Kayıt 20'deki içerik | |
Multiplication | a*b | 3*4 | 12 | |
Division | a/b | 10/5 | 2 | |
Rest | a%b | 10%3 | 1 | |
Addition | a+b | 1+1 | 2 | |
Subtraction | a-b | 1-1 | 0 | |
Zuweisung | [a]:b | [10]:20 | Schreibt in Stelle 10 den Wert 20 | |
Vergleiche | a?b | Ja(1) oder Nein(0) | ||
Ist gleich | a=b | 10=20 | Nein(0) | |
Kleiner | a<b | 10<20 | Ja(1) | |
Größer | a>b | [10]>[20] | ||
AND | a&b | 1=1 & 2=2 | Wenn 1 gleich 1 ist UND 2 gleich 2 ist | |
OR | a|b | 1=1 | 2=2 | Wenn 1 gleich 1 ist ODER 2 gleich 2 ist | |
Random number | a Z b | 1 Z 6 | 1 ve 6 arasında bir sayı seçiyor |
Karşılaştırmalar sayılarla sonuçlanır: DOĞRU için 1, YANLIŞ için 0. Bunlar ayrıca kayıtta da yazılabilir. İfadeler arasında boşluklar bırakılabilir ( 10 + 20 ), fakat gerekli değildir (10+10).
En büyük gelişme, şimdi aşağıdaki türden işlemleri yapabilen matematiksel değerlendiricinin gelişimiydi:
Kabul: [100]=5, [24]=14, 1Z6=2 [[100]+1]:((1Z6)*([24]>3)+10/2-10%5) [5 +1]:((2 )*(14 >3)+10/2-10%5) [6 ]:(2 *(1 )+5 -0 ) [6 ]:(2 *1 +5 ) [6 ]:(7 ) [6 ]:7Çözüm: [6]:7 7 değeri kayıt 6'ya yazılıyor.
Wenn condition thenkarşılaştırmalar yapılabilir; örneğin:
Wenn [100+1]>10 Kunde: Kayıt 101'deki sayı 10'dan büyüktür ! Wenn 1>1 Kunde: ERROR!Eğer koşul doğruysa, yorumlayıcı bir sonraki satıra devam eder yoksa bir satır atlar. Eğer koşul yanlışsa bir sonraki satır atlanır. Bu atlamalarla birlikte kullanılabilir:
Wenn [102]<10 Sprung DAHA KUCUK Wenn [102]=10 Sprung ESIT Wenn [102]>10 Sprung DAHA BUYUK ... :DAHA KUCUK ... :ESIT ... :DAHA BUYUK
BILD expression(Bild Almancada resim demek) Örneğin HALE.BAT dosyasında;
Bild 5geçiyor, HALE5.DAT (özel bir resim formatı) gösteriliyor. Bunun için bir click beklenir ve diyalog devam eder.
// comment: | KOMUT REFERANSI |
Kunde: text | Müşteri birşey söylüyor |
Tel: text | Partneri birşey söylüyor |
Leni: text | Leni birşeyler söylüyor |
:target | Yorumlayıcının atlayabileceği Hedef |
Liste number | Geçerli listeyi yapıyor |
Löschen * | Geçerli listedeki bütün girişleri siliyor |
Löschen target | Geçerli listedeki, hedefi gösteren bütün girişleri siliyor |
Aktion number | Olayları tetikliyor |
Ende | Diyaloğu bitiriyor |
Bild number | Resmi dosya ismiyle birlikte gösteriyor NameNumber.dat |
Sprung target | Hedefe atlıyor |
Neu target,Text | Geçerli listeye yeni konu ekliyor |
Alt target,Text | Geçerli listeye yeni seçim ekliyor |
Menü | Menüyü gösterip kullanıcının seçim yapmasını sağlıyor |
Wenn condition | Karşılaştırma (sonraki satırlara bak) |
//then | Doğruysa, yorumlayıcı bir sonraki satıra geçiyor |
//else | Yanlışsa, yorumlayıcı bir satır atlıyor |
Rechne expression | İfadeleri bir kayıt içine hesaplıyor |
Bild expression | Resimleri gösteriyor, click bekliyor |
Bütün Würstelstand projesi yaklaşık 10.000 satırlık C(++) kodundan oluştuğundan ve derleme zamanları hala kabuledilir olduğundan, açık bir modülarizasyon yapmadan (tembellik işte) bunun yerine Test-Include sistemini geliştirdim: Modül kodu kendi kendine çalışabilen ve modüllerin routin lerine aynı zamanda bir test programı gönderen bir .c dosyasına entegre ediliyor. Bu da eğer ana modülde mevcutsa #ifdef tarafından deaktive ediliyor. Bu şekilde header dosyaları saklanıyor ;-)
batch.cpp |
#ifndef _DIALOG_H #define _DIALOG_H #ifndef MAIN_MODULE #define DIALOG_TEXT #define DEBUG //Gerekli Header dosyalari #include <stdio.h> //... #endif //butun diyalog routinleri //.. S2 Dialog(char *Filename, TYP Array[]) { //... } #ifndef MAIN_MODULE //Test programlari icin hersey TYP Feld[256]; int main(short argc,char *argv[]) { //Test programi Dialog(Filename,Feld); } #endif |
wurst.cpp |
#define MAIN_MODULE #include "batch.cpp" TYP Felder[10][256]; int main(short argc,char *argv[]) { Dialog(Filename,Felder[i]); } |
Görselyöre sayfalarının bakımı, LinuxFocus Editörleri tarafından yapılmaktadır
© Philipp Gühring "some rights reserved" see linuxfocus.org/license/ http://www.LinuxFocus.org |
Çeviri bilgisi:
|
2004-11-23, generated by lfparser version 2.50