Skip to content

AWKenture

Vor längerem habe ich ein wenig AWK Know-How aufgebaut und es in ein kleines Text-Adventure fliessen lassen.
Viel Spaß dabei....

#!/usr/bin/gawk -f
#Aufruf von der Kommandozeile mit "./prog.awk prog.dat"
#11-07-2007

BEGIN{
   printf("\f\n-- Herzlich Wilkommen zum AKWenture.\n Benutze: look - look bag - get - nosw - help\n\n")

   bag[0]=2                # bag-Array beschreibt Gegenstaende im Inventar
   bag[1]="Wuerfel"        # bag[0]=Anzahl der Gegenstaende im Inventar
   bag[2]="Muenze"         # bag[x]=[Objekt]

   items[1,0]=4            # items-Array beschreibt Gegenstaende pro Raum items[<raumnr.>,"<itemnr.>"]=item
   items[1,1]="Kaugummi"   # an Position items[x,0] steht immer die Anzahl der Gegenstaende im Raum x.
   items[1,2]="Schraube"
   items[1,3]="Feder"
   items[1,4]="rostiger Schluessel"
   items[2,0]=2
   items[2,1]="Visier"
   items[2,2]="Vogel"
   items[3,0]=1
   items[3,1]="Klavier"

       


       
   # getlimit-Array
       
   getlimit["klavier"]=1
       
   # Description Array - Beschreibt die Objekte
   descr["kaugummi"]=sprintf("Die ist ein bereits gekauter Kaugummi. Himbeer-Geschmack.\n")
   descr["schraube"]=sprintf("Dies ist eine gew????iche Schraube aus Metall.\n")
   descr["feder"]=sprintf("Dies ist eine Feder aus einem Kugelschreiber. \n")
   descr["visier"]=sprintf("Ein kleines Visier, passend zu einem Schnabel von einem Vogel. \n")
   descr["vogel"]=sprintf("Ein kleiner Spatz. Er piept! \n")
   descr["klavier"]=sprintf("Ein alter Steinway - Unbezahlbar!\n")  

   keys["rostiger schluessel"]=9

   door[1,"s"]=2        # door-Array beschreibt Tueren pro Raum: door[<raumnr.>,"<richtung>"]=<zielraum>
   door[2,"s"]=3
   door[2,"n"]=1
   door[3,"n"]=2
   door[3,"e"]=0        # secret or hidden door
   door[3,"w"]=255      # exit

   keylock[1,"s"]=0     # keylock-Array definiert welche Tuer mit welchem Schluessel geoeffnet wird
   keylock[2,"n"]=0     # Muster: keylock[<raumnr.>,"<richtung>"]=<keynr.>
   keylock[2,"s"]=0
   keylock[3,"n"]=0
   keylock[3,"e"]=0
   keylock[3,"w"]=9

   lock[1,"s"]=0        # lock-Array: Speichert den Zustand jeder Tuer. 0-offen, 1-geschlossen
   lock[2,"s"]=0        # lock[<raumnr.>,"<richtung>"]=zustand
   lock[2,"n"]=0
   lock[3,"n"]=0
   lock[3,"e"]=1
   lock[3,"w"]=1

   # action-Array: Beschreibt Informationen die in einem Raum angezeigt werden, wenn Kommando 'look' benutzt wird.
   # action[<raumnr.>,"<kommando>"]=sprintf("<Info-Text>")

   action[1,"look"]=sprintf("Es befindet sich eine Tuer im Sueden.\n")
   action[2,"look"]=sprintf("Es befindet sich eine Tuer im Sueden und eine im Norden.\n")
   action[3,"look"]=sprintf("Es befindet sich eine Tuer im Norden und im Westen\n")
   
   # text-Array: Beschreibt Informationen die angezeigt werden, wenn ein bestimmtes Ereignis auftritt.
   # text[<raumnr.>,"<EREIGNIS>"]=sprintf("<Info-Text>")
 
   text[1,"ENTER"]=sprintf("Sie befinden sich in Raum 1\n")
   text[2,"ENTER"]=sprintf("Sie befinden sich in Raum 2\n")
   text[3,"ENTER"]=sprintf("Sie befinden sich in Raum 3\n")
   text[255,"ENTER"]=sprintf("\nPRIMA! Sie haben es geschafft!\nENDE\n")

   # combi-Array: Beschreibt welches Objekt mit einem anderen interagieren kann.
   # combi[<item1>,<item2>]=action
   combi[items[2,1],items[2,2]]="newobject#MotoVogel"
   combi[items[2,2],items[2,1]]="newobject#MotoVogel"
   
   combi[items[1,1],items[3,1]]="changedescr#Ein ekelhafter Steinway mit Kaugummi dran! Pfui!"
   combi[items[3,1],items[1,1]]="changedescr#Ein ekelhafter Steinway mit Kaugummi dran! Pfui!"
   
   startrom=1
   actualrom=1
   state=idle
}

### NAVIGATION ###
tolower($0)~/^[nesw]$/{
        if($0=="n"){ print "Du gehst nach Norden."}
        if($0=="o"){ print "Du gehst nach Osten."}
        if($0=="s"){ print "Du gehst nach Sueden."}
        if($0=="w"){ print "Du gehst nach Westen."}
        if(door[actualrom,$1]>0){
                if(lock[actualrom,$1]){
                        printf("Die Tuer ist verschlossen!\n")
                }else{
                        pass(actualrom,door[actualrom,$1])
                }
        }else{
                printf("...es geht aber nicht weiter nach %s\n",$1)
        }
}

#/^[Ll][Oo][Oo][Kk]$/{printf("There is nothing to look at.\n")}
### LOOK ###
tolower($0)~/^look$/{
        printf(action[actualrom,"look"])
        if(items[actualrom,0]>0)print("\nFolgende Gegenstaende befinden sich in diesem Raum:")
        for(j=1;j<items[actualrom,0]+1;j++){
                if(length(items[actualrom,j])>0)printf(" %s\n",items[actualrom,j])

        }
                printf "\n"
               
}
### LOOK BAG ###
tolower($0)~/^look bag$/{
        if(countelem(bag)>0){
                printf("Sie haben %d Gegenstaende in der Tasche:\n",bag[0])
                for(j=1;j<bag[0]+1;j++){
                        printf("%d. %s\n",j,bag[j])
                }
        }
}
### LOOK OBJECT ###
tolower($0)~/^look .*$/{
                if(tolower($2)!="bag"){
                        retcode=1
                        if(items[actualrom,0]>0){
                                for(j=1;j<items[actualrom,0]+1;j++){
                                        if(tolower($2)==tolower(items[actualrom,j])){
                                                print descr[tolower($2)]
                                        }
                                }                              
                        }              
                       
                        #if(countelem(bag)>0){
                        #               printf("Sie haben %d Gegenstaende in der Tasche:\n",bag[0])
                #                       for(j=1;j<bag[0]+1;j++){
                #                                       printf("%d. %s\n",j,bag[j])
                #                       }
                #       }
                        for(j=1;j<bag[0]+1;j++){
                                if(tolower($2)==tolower(bag[j])){
                                        print descr[tolower($2)]
                                }
                        }
                }
}
### GET OBJECT ###
tolower($0)~/^get .*$/{
                if(tolower($3)!="schluessel"){
                        retcode=1                      
                        if(getlimit[tolower($2)]==0){
                                for(j=1;j<items[actualrom,0]+1;j++){                                   
                                                if(tolower($2)==tolower(items[actualrom,j])){
                                                                bag[bag[0]+1]=items[actualrom,j]
                                                                bag[0]++
                                                                items[actualrom,j]=items[actualrom,items[actualrom,0]]
                                                                items[actualrom,0]--
                                                                printf("Sie haben den Gegenstand genommen. %s\n",bag[bag[0]])
                                                                retcode=0
                                                                break
                                                }
                                }
                        }else{
                                printf("Der Gegenstand %s kann nicht genommen werden.\n",$2)
                                retcode=0
                        }
                        if(retcode)printf("Ich kann das Objekt nicht finden!\n")
                }
}

### GET KEY ###
tolower($0)~/^get .<strong> schluessel$/{
        retcode=1
        for(j=1;j<items[actualrom,0]+1;j++){
                if(tolower($2 " " $3)==tolower(items[actualrom,j])){
                        bag[bag[0]+1]=items[actualrom,j]
                        bag[0]++
                        items[actualrom,j]=items[actualrom,items[actualrom,0]]
                        items[actualrom,0]--
                        printf("Du hast den %s genommen.\n",bag[bag[0]])
                        retcode=0
                        break
                }
        }
        if(retcode)printf("Konnte den Schluessel nicht finden!\n")
}

### PUT OBJECT ###
tolower($0)~/^put .*$/{
        retcode=1
        for(j=1;j<bag[0]+1;j++){
                if(tolower($2)==tolower(bag[j])){
                        items[actualrom,items[actualrom,0]+1]=bag[j]
                        items[actualrom,0]++
                        bag[j]=bag[bag[0]]
                        bag[0]--
                        printf("Du hast den Gegenstand abgelegt: %s\n",items[actualrom,items[actualrom,0]])
                        retcode=0
                        break
                }
        }
        if(retcode)printf("In Deiner Tasche befindet sich dieser Gegenstand nicht!\n")
}
### PUT <qual> SCHLUESSEL ###
tolower($0)~/^put .</strong> schluessel$/{
        retcode=1
        for(j=1;j<bag[0]+1;j++){
                if(tolower($2 " " $3)==tolower(bag[j])){
                        items[actualrom,items[actualrom,0]+1]=bag[j]
                        items[actualrom,0]++
                        bag[j]=bag[bag[0]]
                        bag[0]--
                        printf("Du hast den Schluessel abgelegt: %s\n",items[actualrom,items[actualrom,0]])
                        retcode=0
                        break
                }
        }
        if(retcode)printf("In Deiner Tasche befindet sich dieser Gegenstand nicht!\n")
}

### USE KEY WITH DOOR ###
###tolower($0)~/^use .<strong> .</strong> with door [nosw]$/{
tolower($0)~/^use .<strong> .</strong> with door [nosw]$/{
        # Identify Object
        retcode=1
        for(j=1;j<bag[0]+1;j++){
                if(tolower($2 " " $3)==tolower(bag[j])){
                        if(door[actualrom,$6]>0){   # Tuer existiert auch
                                if(keylock[actualrom,$6]==keys[tolower($2 " " $3)]){
                                        unlock(actualrom,$6)
                                        retcode=0
                                        break
                                }else{
                                        printf("%s %s passt nicht zur Tuer %s in Raum %d.\n",$2,$3,$6,actualrom)
                                        retcode=0
                                        break
                                }
                        }else{
                                printf("Tuer %s in Raum %d gibt es nicht.\n",$6,actualrom)
                                retcode=0
                                break
                        }
                }
        }
        if(retcode)printf("Du besitzt diesen Schl0ssel nicht!\n")
}

### USE OBJ1 WITH OBJ2 ###
tolower($0)~/^use .* with .*$/{
        if(tolower($3)!="schluessel"){
                printf("Du versuchst %s mit %s zu benutzen!\n",$2,$4)
                obj1=0;obj2=0;combinated=0
                for(j=1;j<bag[0]+1;j++){
                        if(tolower($2)==tolower(bag[j])){
                                obj1=1
                                geg1=bag[j]
                        }
                        if(tolower($4)==tolower(bag[j])){
                                                        obj2=1
                                geg2=bag[j]
                                        }
                }
                if(obj1==0){
                        printf("Du besitzt das Objekt %s nicht!\n",$2)
                }
                if(obj2==0){
                                        printf("Du besitzt das Objekt %s nicht!\n",$4)
                        }
                if(obj1==1&&obj2==1){
                        split(combi[geg1,geg2],v,"#")
                        if(v[1]=="newobject"){
                                ret=newObject(v[2])
                                combinated=1
                        }
                        if (!combinated){ printf("Du kannst die Gegenstaende nicht miteinander benutzen!\n")}
                }else{
                         printf("Das geht nicht!\n")
                }
        }
}

### ABORT GAME ###
tolower($0)~/^quit|exit|bye|by|end$/{
        printf("\f")
        exit 0

}

### SHOW HELP ###
tolower($0)~/^info|help|?$/{
        printf("Kommandos:\nlook\nlook bag\nn|e|s|w\nget [object]\nget [quali] schluessel\nput [object]\nput [quali] schluessel\n")
        printf("use [quali] schluessel with door [n|e|s|w]\n")
        printf("quit|exit|bye|by|end\n\n")
}

#/^[^[Ll][Oo][Oo][Kk]$]/{print "Du befindest dich in Raum" actualrom }

######## FUNCTION BLOCK #########

function unlock(rom,dir){
        if(lock[rom,dir]>0){
                lock[rom,dir]=0
                printf("Raum %d Tuer in Richtung %s wurde aufgeschlossen.\n",rom,dir)
        }else{
                lock[rom,dir]=1
                printf("Raum %d Tuer in Richtung %s wurde abgeschlossen.\n",rom,dir)
        }
}

function pass(old,new){
   actualrom=new
   printf(text[actualrom,"ENTER"])
   if(new==255) exit
}

function countelem(arr){
    x=0
    for(i in bag){
        if(length(i)>0){ x+=1}
    }
    return x
}

function newObject(obj){
        a=items[actualrom,0]
        items[actualrom,a+1]=obj
        items[actualrom,0]=a+1
        printf("Es erscheint ein %s in dem Raum!\n",obj)
        return 0
}
function changedescr(){
       
        }

 

Trackbacks

Keine Trackbacks

Kommentare

Ansicht der Kommentare: Linear | Verschachtelt

Noch keine Kommentare

Die Kommentarfunktion wurde vom Besitzer dieses Blogs in diesem Eintrag deaktiviert.

Kommentar schreiben

Umschließende Sterne heben ein Wort hervor (*wort*), per _wort_ kann ein Wort unterstrichen werden.
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.

Um maschinelle und automatische Übertragung von Spamkommentaren zu verhindern, bitte die Zeichenfolge im dargestellten Bild in der Eingabemaske eintragen. Nur wenn die Zeichenfolge richtig eingegeben wurde, kann der Kommentar angenommen werden. Bitte beachten Sie, dass Ihr Browser Cookies unterstützen muss, um dieses Verfahren anzuwenden.
CAPTCHA

Sie können [geshi lang=LANG][/lang] Tags verwenden um Quellcode abhängig von der gewählten Programmiersprache einzubinden
Formular-Optionen