BlitzBasic-Community-Tutorial/ Textadventure

Allgemein

Bearbeiten

Der Mini Textadventure besteht aus mehrenen Räumen. Jeder Raum hat eine Raumnummer und einem Namen.

Der Code

Bearbeiten
Const Nord=0
Const Sued=1
Const West=2 
Const Ost =3
 
Const AdvKennung$="MiniAdvSpiel"

Global RichtungsName$[3]
RichtungsName[0]=" Norden"
RichtungsName[1]=" Süden"
RichtungsName[2]=" Westen"
RichtungsName[3]=" Osten"

Type RaumTyp
 Field Name$
 Field Nr
 Field Richtung[3]
End Type 

Type SpielerTyp
 Field Name$
 Field Ort
 Field Leben
End Type 

Type GegenstandTyp
 Field Name$
 Field Nr
 Field Ort
End Type 
 
Global Raum.RaumTyp
Global Spieler.SpielerTyp
Global Gegenstand.GegenstandTyp
 
Const Gegenstand_Hat_Spieler=0
Const Keine_Tuer=0
 
;          Name$        Nr ,N ,S ,W ,O

CreateRaum "Ziel"      ,-1 , 0, 0, 0, 0
CreateRaum "Küche"     , 4 , 0, 3, 0,-1
CreateRaum "Stube"     , 3 , 4, 0, 0, 2
CreateRaum "BadeZimmer", 2 , 0, 0, 3, 1
CreateRaum "Keller"    , 1 ,-2, 0, 2,-3
CreateRaum "Abgrund"   ,-2 , 0, 0, 0, 0
CreateRaum "Teufel"    ,-3 , 0, 0, 0, 0

CreateGegenstand "Schweizer Taschenmesser",1,Gegenstand_Hat_Spieler
CreateGegenstand "Kochtopf"               ,2,4
CreateGegenstand "Foto"                   ,3,3

SpielerName$=Input("Name: ")

CreateSpieler SpielerName$,2,3

Graphics 640,480,0,2

Spiel

Function Spiel()
 Repeat
  SpielerInfo

  Eingabe$=Input$()

  verb$=Mid$(Eingabe$,1,Instr(Eingabe$+" ", " ")-1)
  objekt$=Mid$(Eingabe$,Instr(Eingabe$+" ", " ")+1)

  Select Lower$(verb$)
   Case "n","8"
    SpielerGeheNach Nord
   Case "s","2"
    SpielerGeheNach Sued
   Case "w","4"
    SpielerGeheNach West
   Case "o","6"
    SpielerGeheNach Ost

   Case "gehe"
    Select Lower$(objekt$)
     Case "nord"       
      SpielerGeheNach Nord
     Case "süd", "sued" 
      SpielerGeheNach Sued
     Case "west"        
      SpielerGeheNach West
     Case "ost"       
      SpielerGeheNach Ost
    End Select 

   Case "save","speichern","speicher"
    SpielSpeichern objekt$
    
   Case "speichereals"
    If Len(objekt$)>0 Then
     SpielSpeichern objekt$
    EndIf 

   Case "load","laden","lade"
    SpielLaden objekt$

   Case "nimm"
    Nimm objekt$

   Case "leg"   
    Leg objekt$

   Case "inventar"
    inventar
   Case "end","ende"
   Case "help","hilfe","?"
    hilfe
  End Select 
 Forever 
End Function 

Function Hilfe()
 Print "Mein Befehlswortschatz umfasst folgende Kommandos:"
 Print "gehe nord|süd|west|ost  oder Abkürzung n|s|w|o"
 Print "nimm|leg <Gegenstand>"
 Print "inventar|hilfe"
 Print "speichereals|lade <dateiname.erw>"
End Function 

Function SpielLaden(objekt$)
 If Len(objekt$)>0 Then
  If Instr(objekt$,".")>0 Then
   FileNr=ReadFile(objekt$)
  Else 
   FileNr=ReadFile(objekt$+".dat")
  EndIf 
 EndIf    

 If FileNr=0 Then 
  FileNr=ReadFile("Save.dat")
 EndIf 
      
 If FileNr<>0 Then     
  If Not Eof(FileNr) Then
   Kennung$=ReadLine(FileNr)
  EndIf 

  If Kennung$=AdvKennung$ Then
   If Not Eof(FileNr) Then
    SpeicherArt$=Upper$(ReadLine(FileNr))
   EndIf
 
   If SpeicherArt$="BIN" Or SpeicherArt$="ASC" Then

    For Raum =Each RaumTyp
     Delete Raum
    Next

    For Gegenstand=Each GegenstandTyp
     Delete Gegenstand
    Next

    For Spieler=Each SpielerTyp
     Delete Spieler
    Next  

    RaumName$=ReadLine(FileNr) 

    While Len(RaumName$)>0  
     Raum =New RaumTyp
     Raum\Name$      = RaumName$ 

     Select SpeicherArt$
      Case "BIN"
       Raum\Nr         = ReadInt(FileNr)
       Raum\Richtung[0]= ReadInt(FileNr)
       Raum\Richtung[1]= ReadInt(FileNr)
       Raum\Richtung[2]= ReadInt(FileNr)
       Raum\Richtung[3]= ReadInt(FileNr) 
      Case "ASC"
       Raum\Nr         = ReadLine(FileNr)
       Raum\Richtung[0]= ReadLine(FileNr)
       Raum\Richtung[1]= ReadLine(FileNr)
       Raum\Richtung[2]= ReadLine(FileNr)
       Raum\Richtung[3]= ReadLine(FileNr) 
     End Select

     RaumName$       = ReadLine(FileNr) 
    Wend    

    GegenstandName$=ReadLine(FileNr) 
    While Len(GegenstandName$)>0
     Gegenstand=New GegenstandTyp

     Gegenstand\Name$= GegenstandName$

     Select SpeicherArt$
      Case "BIN"
       Gegenstand\Nr   = ReadInt(FileNr)
       Gegenstand\Ort  = ReadInt(FileNr)
      Case "ASC"
       Gegenstand\Nr   = ReadLine(FileNr)
       Gegenstand\Ort  = ReadLine(FileNr)
     End Select 

     GegenstandName$ = ReadLine(FileNr) 
    Wend       

    SpielerName$=ReadLine(FileNr) 
    While Len(SpielerName$)>0
     Spieler= New SpielerTyp

     Spieler\Name$=SpielerName$
     
     Select SpeicherArt$
      Case "BIN"
       Spieler\Ort  = ReadInt(FileNr)
       Spieler\Leben= ReadInt(FileNr)
      Case "ASC"
       Spieler\Ort  = ReadLine(FileNr)
       Spieler\Leben= ReadLine(FileNr)
     End Select 

     SpielerName$ = ReadLine(FileNr) 
    Wend 
    Spieler=First SpielerTyp
   EndIf
   Cls
   Locate 0,0 
   Print "Spielstand geladen!" 
   Print ""
  EndIf
  CloseFile FileNr 
 EndIf 
End Function 

Function SpielSpeichern(objekt$)
 If Len(objekt$)>0 Then
  If Instr(objekt$,".")>0 Then
   FileNr=WriteFile(objekt$)
  Else 
   FileNr=WriteFile(objekt$+".dat")
  EndIf 
 EndIf 

 If FileNr=0 Then 
  FileNr=WriteFile("Save.dat")
 EndIf    

 If FileNr<>0 Then 
  WriteLine FileNr,AdvKennung$
  WriteLine FileNr,"BIN"

  For Raum =Each RaumTyp
   WriteLine FileNr, Raum\Name$
   WriteInt  FileNr, Raum\Nr
   WriteInt  FileNr, Raum\Richtung[0]
   WriteInt  FileNr, Raum\Richtung[1]
   WriteInt  FileNr, Raum\Richtung[2]
   WriteInt  FileNr, Raum\Richtung[3]
  Next
  WriteLine   FileNr,"" 

  For Gegenstand=Each GegenstandTyp
   WriteLine  FileNr, Gegenstand\Name$
   WriteInt   FileNr, Gegenstand\Nr
   WriteInt   FileNr, Gegenstand\Ort
  Next
  WriteLine   FileNr,"" 

  For Spieler=Each SpielerTyp
   If Spieler\Name$="" Then 
    WriteLine  FileNr, "Spieler"
   Else 
    WriteLine  FileNr, Spieler\Name$
   EndIf 

   WriteInt FileNr, Spieler\Ort
   WriteInt FileNr, Spieler\Leben
  Next
  WriteLine   FileNr,""   

  Spieler=First SpielerTyp  
  CloseFile FileNr 

  Print "Spielstand gespeichert!"
  Print ""
 EndIf 
End Function 

Function SpielerInfo()
 For Raum=Each RaumTyp
  If Raum\Nr=Spieler\Ort Then
   Print "Sie befinden sich im/in der "+Raum\Name$ 
   Print "Mögliche Gehrichtungen:"

   For Richtung=0 To 3
    If Raum\Richtung[Richtung]<>Keine_Tuer Then
     Print RichtungsName[Richtung]
    End If 
   Next 

   Print
   Print "Gegenstände in diesem Raum:";

   For  Gegenstand=Each GegenstandTyp
    If Spieler\Ort=Gegenstand\Ort Then 
     Print " "+ Gegenstand\Name$
     GegenstandZahl = GegenstandZahl+1
    End If 
   Next 

   If GegenstandZahl = 0 Then
    Print " keine"
   End If 

  End If 
 Next 
End Function 

Function Nimm(objekt$)
 For Gegenstand=Each GegenstandTyp
  If Lower$(Gegenstand\Name$)=Lower$(objekt$) Then
   If Gegenstand\Ort=Spieler\Ort Then
    Gegenstand\Ort=Gegenstand_Hat_Spieler
    Print Gegenstand\Name$+ " aufgelesen"
   End If 
  End If 
 Next
End Function 

Function Leg(objekt$)
 For Gegenstand=Each GegenstandTyp
  If Lower$(Gegenstand\Name$)=Lower$(objekt$) Then
   If Gegenstand\Ort=Gegenstand_Hat_Spieler Then
    Gegenstand\Ort=Spieler\Ort
    Print Gegenstand\Name$+ " abgelegt"
   End If 
  End If 
 Next 
End Function 

Function inventar() 
 For Gegenstand=Each GegenstandTyp
  If Gegenstand_Hat_Spieler=Gegenstand\Ort Then 
   Print " "+ Gegenstand\Name$
   GegenstandZahl = GegenstandZahl+1
  End If 
  If GegenstandZahl = 0 Then
   Print " keine"
  End If 
 Next 
End Function 

Function SpielerGeheNach(Richtung)
 For Raum=Each RaumTyp
  If Raum\Nr=Spieler\Ort Then
   If Raum\Richtung[Richtung]<>Keine_Tuer Then 
    Spieler\Ort=Raum\Richtung[Richtung]
   End If 
  End If   
 Next 
End Function 

Function DeleteGegenstand(Name$)
 For Gegenstand=Each GegenstandTyp
  If Gegenstand\Name$=Name$ Then
   Delete Gegenstand
   Exit 
  EndIf  
 Next 
End Function 

Function CreateGegenstand(Name$,Nr,Ort)
 Gegenstand=New GegenstandTyp

 Gegenstand\Name$=Name$
 Gegenstand\Nr   =Nr
 Gegenstand\Ort  =Ort
End Function 
 
Function CreateSpieler(Name$,Ort,Leben)
 Spieler=New SpielerTyp

 Spieler\Name$=Name$
 Spieler\Ort  =Ort
 Spieler\Leben=Leben
End Function 
 
Function CreateRaum(Name$,Nr,Richtung_Nord,Richtung_Sued,Richtung_West,Richtung_Ost)
 Raum=New RaumTyp
 Raum\Name$          =Name$
 Raum\Nr             =Nr 
 Raum\Richtung[Nord] =Richtung_Nord
 Raum\Richtung[Sued] =Richtung_Sued
 Raum\Richtung[West] =Richtung_West
 Raum\Richtung[Ost ] =Richtung_Ost
End Function