Seite 1 von 1

variable Variablen?

Verfasst: 11.04.2009 12:25
von ralfschmitt
Moin,

ich programmiere zur Übung ein "Hangman"-Spiel auf der Konsole. Nun möchte ich in Abhängigkeit von der Fehlerquote das entsprechende Hangman-Stadium einblenden. Dafür habe ich ne numerische Variable, die heißt Hangman.

Da ich auf der Konsole arbeite, besteht mancher Hangman-Zustand ja aus mehreren Zeilen Zeichen, deshalb kann ich keine Struktur oder Array verwenden. Statt dessen würde ich Prozeduren bzw. Gosubs verwenden. Da müßte ich dann aber den Namen zusammenflicken. Wie geht das?

Beispiel:

Code: Alles auswählen

If Hangman > 0
  For i= 1 To i <= Hangman Step 1
  
    Gosub_i

  Next
EndIf
Gruß
Ralf

Re: variable Variablen?

Verfasst: 11.04.2009 12:32
von cxAlex
> Da ich auf der Konsole arbeite, besteht mancher Hangman-Zustand ja aus mehreren Zeilen Zeichen, deshalb kann ich keine Struktur oder Array verwenden.

Ich versteh die Logik dahinter nicht.

Mach einfach für jeden Zustand eine Procedure und die rufst du je nach Zustand auf. Und wenn das ganze unbedingt über nen Counter machen musst:

Code: Alles auswählen

Prototype _HangmanState()

Structure HangmanState
  Show._HangmanState
EndStructure

Procedure State1()
  ; Hangman Zeichnen
  Debug "Hangman1"
EndProcedure

Procedure State2()
  ; Hangman Zeichnen
  Debug "Hangman2"
EndProcedure

Procedure State3()
  ; Hangman Zeichnen
  Debug "Hangman3"
EndProcedure


Dim State.HangmanState(3)

State(1)\Show = @State1()
State(2)\Show = @State2()
State(3)\Show = @State3()

For i = 1 To 3
  State(i)\Show()
Next
Und in die Proceduren kommen eben deine Print(),... mit was du eben den Hangman zeichnest.


PS:
Deine For - Loop pass auch nicht ganz (Hast du früher C programmiert ?)

> For i= 1 To i <= Hangman Step 1
müsste
> For i= 1 To Hangman Step 1
heißen, oder
> For i= 1 To Hangman
, Step 1 ist Standard.

Verfasst: 11.04.2009 12:34
von Kaeru Gaman
garnicht.

gewöhn dir am besten GoSub ganz schnell wieder ab.
für so etwas würde sich ggf eine Select/Case konstruktion empfehlen.

aber:
> besteht mancher Hangman-Zustand ja aus mehreren Zeilen Zeichen, deshalb kann ich keine Struktur oder Array verwenden.

wieso? wo ist das problem?
definier dir ein Array von Strings zweidimensional.
die eine Dimension ist die Zeile, die andere das Stadium.


[edit]
@cxAlex
oy, bitte! doch nicht mit Procedure-Adressen in Strukturen ankommen!
das ist ja ein fürchterlicher Overkill für so ein echtes Anfänger-Problem.

Verfasst: 11.04.2009 12:40
von ralfschmitt
mhm, wahrscheinlich habe ich Strukturen einfach noch nicht richtig verstanden :-)

Danke für die Tipps. Ich setz mich gleich mal dran und probiere das aus.

Und richtig, mein Loop hat gewisse Schreibfehler. Die stammen aber eher von PHP :-)

Verfasst: 11.04.2009 12:43
von cxAlex
Ich wollte es nur so machen wie er es beschrieben hat, aber du hast recht, das dürfte wohl Overkill sein (mal abgesehen davon ob das ein Anfänger versteht). Hier mal dasselbe mit Select - Case:

Code: Alles auswählen

Procedure State1()
  ; Hangman Zeichnen
  Debug "Hangman1"
EndProcedure

Procedure State2()
  ; Hangman Zeichnen
  Debug "Hangman2"
EndProcedure

Procedure State3()
  ; Hangman Zeichnen
  Debug "Hangman3"
EndProcedure

For State = 1 To 3
  Select State
    Case 1
      State1()
    Case 2
      State2()
    Case 3
      State3()
  EndSelect
Next

Verfasst: 11.04.2009 13:27
von Kaeru Gaman
hier noch ne demo, wie ich das mit nem 2dimensionalen Stringarray meinte...

Code: Alles auswählen

Dim Hang.s(5,3)

Hang(0,0) = "dies    1"
Hang(0,1) = "ist     1"
Hang(0,2) = "erster  1"
Hang(0,3) = "status  1"

Hang(1,0) = "dies    2"
Hang(1,1) = "ist     2"
Hang(1,2) = "zweiter 2"
Hang(1,3) = "status  2"

Hang(2,0) = "dies    3"
Hang(2,1) = "ist     3"
Hang(2,2) = "dritter 3"
Hang(2,3) = "status  3"

Hang(3,0) = "dies    4"
Hang(3,1) = "ist     4"
Hang(3,2) = "vierter 4"
Hang(3,3) = "status  4"

Hang(4,0) = "dies    5"
Hang(4,1) = "ist     5"
Hang(4,2) = "fünfter 5"
Hang(4,3) = "status  5"

Hang(5,0) = "dies    6"
Hang(5,1) = "ist     6"
Hang(5,2) = "sechster6"
Hang(5,3) = "status  6"

OpenConsole()

For Status = 0 To 5
  PrintN("Anzeige Status " + Str(Status+1))
  For Zeile = 0 To 3
    PrintN(Hang(Status,Zeile))
  Next
  PrintN("")
Next
Input()

Verfasst: 14.04.2009 15:49
von ralfschmitt
Erst noch mal Danke! an alle. Hab das jetzt mit case ... select gelöst.

in PHP kann ich halt den Inhalt einer Variablen zum Namen einer neuen Variablen machen, dachte das ginge in Purebasic vlt. auch


Gruß
Ralf

Verfasst: 14.04.2009 18:14
von Falko
Vielleicht könnte man es ja auch mit Preferences machen:

Code: Alles auswählen

CreatePreferences("Test.MyV")
For i= 1 To 10
MyString$="a"+Str(i)
WritePreferenceString(MyString$,Str(i))
Next i
ClosePreferences()

OpenPreferences("Test.MyV")
 ExaminePreferenceKeys()
While  NextPreferenceKey()>0
  Debug PreferenceKeyName()+" entspricht "+ReadPreferenceString(PreferenceKeyName(),"0") ;= PreferenceKeyValue()
Wend


Delay(10000)
Zwar sind das keine Variablen, aber zufällig Namen und deren
Werte würde man so ermitteln können.

Ich denke aber, das du damit auch nicht viel anfangen kannst.

Gruß Falko