variable Variablen?

Anfängerfragen zum Programmieren mit PureBasic.
ralfschmitt
Beiträge: 8
Registriert: 22.03.2009 11:48

variable Variablen?

Beitrag 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
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: variable Variablen?

Beitrag 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.
Zuletzt geändert von cxAlex am 11.04.2009 12:35, insgesamt 3-mal geändert.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
ralfschmitt
Beiträge: 8
Registriert: 22.03.2009 11:48

Beitrag 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 :-)
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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()
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
ralfschmitt
Beiträge: 8
Registriert: 22.03.2009 11:48

Beitrag 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
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag 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
Bild
Win11 Pro 64-Bit, PB_6.11b1
Antworten