AWKenture
Vor längerem habe ich ein wenig AWK Know-How aufgebaut und es in ein kleines Text-Adventure fliessen lassen.
Viel Spaß dabei....
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
Die Kommentarfunktion wurde vom Besitzer dieses Blogs in diesem Eintrag deaktiviert.
Kommentare
Ansicht der Kommentare: Linear | Verschachtelt