Code:
WBStartup
;
; Das Staturen-Raetsel aus dem Spiel "Zelda - Twilight Princess"
;
; Programmiert von: Martin Oppermann
; Datum: 26.10.2011
; 5.11.2011 Version 2: Die End-Positionen werden nur noch
; am Ende eines Codes ueberprueft
; und nicht mehr nach jedem Sprung
; von Link.
;
; Dieses Programm loesst das Staturen-Raetsel aus dem Spiel "Zelda -
; Twilight Princess", indem es alle moeglichen Sprung-Kombinationen testet.
; Diese Sprung-Kombinationen werden durch eine Art von Binaercode
; vorgegeben, dessen Stellen nicht - wie ueblich - nur aus den Zahlen
; 0 und 1, sondern aus den Zahlen 1 bis 4 bestehen.
;
; Sprung-Code (Richtungen): 1
; 2+3
; 4
;
; Zum anderen wird dieser Code nicht wie ein Binaercode von rechts nach
; links, sondern von links nach rechts abgearbeitet. Die Zahlen im Code
; geben dann - Stelle fuer Stelle - die Richtungen vor, in die Link
; springen soll. Die beiden Staturen folgen dann - auf ihre eigene Art und
; Weise - den Spruengen von Link.
;
; Figur 1: Link
; Figur 2: obere Statur (springt spiegelverkehrt zu Link)
; Figur 3: untere Statur (springt wie Link)
;
; Wenn ein Code nicht abgearbeitet werden kann, oder er das Raetsel nicht
; loesen konnte, dann wird der naechste Code erzeugt. Wenn alle moeglichen
; Kombinationen aus den Zahlen 1 bis 4 getestet wurden, dann wird der Code
; um eine Stelle erweitert und alle Zahlen beginnen wieder mit 1.
;
; ---- Die Startzeit merken ------------------------------------------
Gosub urzeit
start$=urzeit$
; ---- Variablen als Ganz-Zahlen festlegen ---------------------------
DEFTYPE.l codes
DEFTYPE.l prozent,prozente,prozentzahlen
DEFTYPE.l spruenge
DEFTYPE.l stelle
DEFTYPE.l wert
DEFTYPE.l x
DEFTYPE.l y
; ---- Feld-Variablen festlegen --------------------------------------
Dim feld$(9,10)
Dim figur.l(3,2)
Dim figurboden$(3)
; ---- Das Spielfeld einlesen ----------------------------------------
For y=1 To 10
Read zeile$
For x=1 To 9
feld$(x,y)=Mid$(zeile$,x,1)
Next x,y
Data$"........."
Data$"........."
Data$"..OO.OO.."
Data$"..OXOXO.."
Data$"..OOOOO.."
Data$"...OOO..."
Data$"...OOO..."
Data$"....O...."
Data$"........."
Data$"........."
; ---- Den Code um eine Stelle (Sprung/Zug) erweitern ----------------
codeerweitern:
spruenge+1
Dim code.l(spruenge)
prozente=1
For x=1 To spruenge
code(x)=1
prozente*4
Next x
code(1)=0
wert=prozente
Gosub wert
NPrint"Aktuell wird ein Code mit ",spruenge," Stellen verwendet. (Codes: "+wert$+")"
Print"0%"
prozente=Int(prozente/10)
prozent=prozente
prozentzahlen=0
; ---- Den naechsten Code erzeugen -----------------------------------
naechstercode:
x=0
naechstercodestelle:
x+1
If x>spruenge Then NPrint", 100%":NPrint"":Goto codeerweitern
code(x)+1
If code(x)=5 Then code(x)=1:Goto naechstercodestelle
codes+1
prozent-1
If prozent=0 Then prozent=prozente:If prozentzahlen<90 Then prozentzahlen+10:Print", ",prozentzahlen,"%"
; ---- Die letzten Standorte loeschen --------------------------------
For x=1 To 3
feld$(figur(x,1),figur(x,2))=figurboden$(x)
Next x
; ---- Startpositionen setzen ----------------------------------------
figur(1,2)=6
figur(2,2)=4
figur(3,2)=8
For x=1 To 3
figur(x,1)=5
feld$(5,figur(x,2))=Str$(x)
figurboden$(x)="O"
Next x
; ---- Den Code abarbeiten -------------------------------------------
stelle=0
codeabarbeiten:
stelle+1
If stelle>spruenge Then Goto fertig
If code(stelle)=2 Then Goto links
If code(stelle)=3 Then Goto rechts
If code(stelle)=4 Then Goto runter
; ---- Link springt nach oben ----------------------------------------
; ---- Kann Link springen? ----
a$=feld$(figur(1,1),figur(1,2)-1)
If a$="O" OR a$="X" Then Goto obenlinkspringt
Goto naechstercode
; ---- Links Standort loeschen ----
obenlinkspringt:
feld$(figur(1,1),figur(1,2))=figurboden$(1)
; ---- Links neuen Standort setzen ----
figur(1,2)-1
figurboden$(1)=feld$(figur(1,1),figur(1,2))
feld$(figur(1,1),figur(1,2))="1"
; ---- Obere Statur springt (spiegelverkehrt zu Link) ----
a$=feld$(figur(2,1),figur(2,2)+1)
b$=feld$(figur(2,1),figur(2,2)+2)
; ---- Wuerde Link platt gemacht? ----
If a$="1" Then Goto naechstercode
; ---- Kann die obere Statur nicht springen? ----
If a$="." Then Goto obenunterestaturspringt
If a$="3" OR b$="3" Then Goto codeabarbeiten
; ---- Standort der obere Statur loeschen ----
feld$(figur(2,1),figur(2,2))=figurboden$(2)
; ---- Neuen Standort der obere Statur setzen ----
figur(2,2)+1
figurboden$(2)=feld$(figur(2,1),figur(2,2))
feld$(figur(2,1),figur(2,2))="2"
; ---- Untere Statur springt (wie Link) ----
obenunterestaturspringt:
; ---- Kann die untere Statur nicht springen? ----
If feld$(figur(3,1),figur(3,2)-1)="." Then Goto codeabarbeiten
; ---- Standort der unteren Statur loeschen ----
feld$(figur(3,1),figur(3,2))=figurboden$(3)
; ---- Neuen Standort der unteren Statur setzen ----
figur(3,2)-1
figurboden$(3)=feld$(figur(3,1),figur(3,2))
feld$(figur(3,1),figur(3,2))="3"
Goto codeabarbeiten
; ---- Link springt nach links ---------------------------------------
links:
; ---- Kann Link springen? ----
a$=feld$(figur(1,1)-1,figur(1,2))
If a$="O" OR a$="X" Then Goto linkslinkspringt
Goto naechstercode
; ---- Links Standort loeschen ----
linkslinkspringt:
feld$(figur(1,1),figur(1,2))=figurboden$(1)
; ---- Links neuen Standort setzen ----
figur(1,1)-1
figurboden$(1)=feld$(figur(1,1),figur(1,2))
feld$(figur(1,1),figur(1,2))="1"
; ---- Obere Statur springt (spiegelverkehrt zu Link) ----
a$=feld$(figur(2,1)+1,figur(2,2))
b$=feld$(figur(2,1)+2,figur(2,2))
; ---- Wuerde Link platt gemacht? ----
If a$="1" Then Goto naechstercode
; ---- Kann die obere Statur nicht springen? ----
If a$="." Then Goto linksunterestaturspringt
If a$="3" OR b$="3" Then Goto codeabarbeiten
; ---- Standort der obere Statur loeschen ----
feld$(figur(2,1),figur(2,2))=figurboden$(2)
; ---- Neuen Standort der obere Statur setzen ----
figur(2,1)+1
figurboden$(2)=feld$(figur(2,1),figur(2,2))
feld$(figur(2,1),figur(2,2))="2"
; ---- Untere Statur springt (wie Link) ----
linksunterestaturspringt:
; ---- Kann die untere Statur nicht springen? ----
If feld$(figur(3,1)-1,figur(3,2))="." Then Goto codeabarbeiten
; ---- Standort der unteren Statur loeschen ----
feld$(figur(3,1),figur(3,2))=figurboden$(3)
; ---- Neuen Standort der unteren Statur setzen ----
figur(3,1)-1
figurboden$(3)=feld$(figur(3,1),figur(3,2))
feld$(figur(3,1),figur(3,2))="3"
Goto codeabarbeiten
; ---- Link springt nach rechts --------------------------------------
rechts:
; ---- Kann Link springen? ----
a$=feld$(figur(1,1)+1,figur(1,2))
If a$="O" OR a$="X" Then Goto rechtslinkspringt
Goto naechstercode
; ---- Links Standort loeschen ----
rechtslinkspringt:
feld$(figur(1,1),figur(1,2))=figurboden$(1)
; ---- Links neuen Standort setzen ----
figur(1,1)+1
figurboden$(1)=feld$(figur(1,1),figur(1,2))
feld$(figur(1,1),figur(1,2))="1"
; ---- Obere Statur springt (spiegelverkehrt zu Link) ----
a$=feld$(figur(2,1)-1,figur(2,2))
b$=feld$(figur(2,1)-2,figur(2,2))
; ---- Wuerde Link platt gemacht? ----
If a$="1" Then Goto naechstercode
; ---- Kann die obere Statur nicht springen? ----
If a$="." Then Goto rechtsunterestaturspringt
If a$="3" OR b$="3" Then Goto codeabarbeiten
; ---- Standort der obere Statur loeschen ----
feld$(figur(2,1),figur(2,2))=figurboden$(2)
; ---- Neuen Standort der obere Statur setzen ----
figur(2,1)-1
figurboden$(2)=feld$(figur(2,1),figur(2,2))
feld$(figur(2,1),figur(2,2))="2"
; ---- Untere Statur springt (wie Link) ----
rechtsunterestaturspringt:
; ---- Kann die untere Statur nicht springen? ----
If feld$(figur(3,1)+1,figur(3,2))="." Then Goto codeabarbeiten
; ---- Standort der unteren Statur loeschen ----
feld$(figur(3,1),figur(3,2))=figurboden$(3)
; ---- Neuen Standort der unteren Statur setzen ----
figur(3,1)+1
figurboden$(3)=feld$(figur(3,1),figur(3,2))
feld$(figur(3,1),figur(3,2))="3"
Goto codeabarbeiten
; ---- Link springt nach unten ---------------------------------------
runter:
; ---- Kann Link springen? ----
a$=feld$(figur(1,1),figur(1,2)+1)
If a$="O" OR a$="X" Then Goto runterlinkspringt
Goto naechstercode
; ---- Links Standort loeschen ----
runterlinkspringt:
feld$(figur(1,1),figur(1,2))=figurboden$(1)
; ---- Links neuen Standort setzen ----
figur(1,2)+1
figurboden$(1)=feld$(figur(1,1),figur(1,2))
feld$(figur(1,1),figur(1,2))="1"
; ---- Obere Statur springt (spiegelverkehrt zu Link) ----
a$=feld$(figur(2,1),figur(2,2)-1)
b$=feld$(figur(2,1),figur(2,2)-2)
; ---- Wuerde Link platt gemacht? ----
If a$="1" Then Goto naechstercode
; ---- Kann die obere Statur nicht springen? ----
If a$="." Then Goto runterunterestaturspringt
If a$="3" OR b$="3" Then Goto codeabarbeiten
; ---- Standort der obere Statur loeschen ----
feld$(figur(2,1),figur(2,2))=figurboden$(2)
; ---- Neuen Standort der obere Statur setzen ----
figur(2,2)-1
figurboden$(2)=feld$(figur(2,1),figur(2,2))
feld$(figur(2,1),figur(2,2))="2"
; ---- Untere Statur springt (wie Link) ----
runterunterestaturspringt:
; ---- Kann die untere Statur nicht springen? ----
If feld$(figur(3,1),figur(3,2)+1)="." Then Goto codeabarbeiten
; ---- Standort der unteren Statur loeschen ----
feld$(figur(3,1),figur(3,2))=figurboden$(3)
; ---- Neuen Standort der unteren Statur setzen ----
figur(3,2)+1
figurboden$(3)=feld$(figur(3,1),figur(3,2))
feld$(figur(3,1),figur(3,2))="3"
Goto codeabarbeiten
; ---- Hat der Code funktioniert? ------------------------------------
fertig:
If figurboden$(2)="X" AND figurboden$(3)="X" Then Goto ergebnis
Goto naechstercode
ergebnis:
Gosub urzeit
NPrint""
NPrint""
wert=codes
Gosub wert
NPrint"Der "+wert$+"-te Code hat funktioniert!"
NPrint""
For x=1 To spruenge
Print code(x)
Next x
NPrint""
NPrint""
For x=1 To spruenge
If code(x)=1 Then Print"rauf"
If code(x)=2 Then Print"links"
If code(x)=3 Then Print"rechts"
If code(x)=4 Then Print"runter"
If x<spruenge Then Print", "
Next x
NPrint""
NPrint"Start: "+start$
NPrint" Ende: "+urzeit$
NPrint""
End
; ---- Unterprogramme ------------------------------------------------
; ---- Zifferngruppierung mit Punkten --------------------------------
wert:
wert$=""
wertb$=Str$(wert)
wertb:
If Len(wertb$)<4 Then wert$=wertb$+wert$:Return
wert$="."+Right$(wertb$,3)+wert$
wertb$=UnLeft$(wertb$,3)
Goto wertb
; ---- Urzeit --------------------------------------------------------
urzeit:
urzeit$=""
urzeitb:
DateFormat 0
zeit$=Date$(SystemDate)
zeit$=Str$(Hours)+":"+Right$("0"+Str$(Mins),2)+":"+Right$("0"+Str$(Secs),2)
If urzeit$="" Then urzeit$=zeit$
If urzeit$=zeit$ Then Goto urzeitb
Return