Variablen Problem. (Not Easy)

  • Hallo,

    Ich habe ein problem mit mein Farm-Spiel.

    Ich möchte das er pro Feld eine Variable erstellt, damit ich später dan auch was anpflanzen kann.

    Momentan lädt das Spiel eine Farm aus einer map.txt datei, in der

    111111111111111

    133333333333331

    133343333333341

    133344433333331

    133333333333331

    111111111111111

    Steht. So bekomme ich eine Map ausgegeben. Er guckt wo er ein Image hinmachen müsste.

    Ich habe vor, das er unter Create Pic in jeden array noch ein Button
    macht, doch dieser muss pro generation eine noch weiter Variable haben
    wie

    z.B. F1,F2,F3 und so weiter. Jezt komme ich damit nicht weiter. Ich
    hatte mir es so gedacht das es pro klick auf den A-Button ein anderes
    bild anzeigt. Und einen Timer angibt, bis die pflanze fertig ist. Könnt iht mir Helfen? Ich weiß nicht mehr weiter, Ich henge mal den
    code an.

    [autoit]

    ;FarmLive By Cake
    ;=============================================================
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include <StaticConstants.au3>
    #include<File.au3>

    [/autoit][autoit][/autoit][autoit]

    ;=====GUI=====================================================================
    $gui = GUICreate("Farmer", 931, 478, 192, 124)
    GUISetState(@SW_SHOW)
    ;=====SpielFeld=====================================================================

    $map=FileRead("map.txt")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $array_map=StringSplit($map,"")
    $line=7
    $x_groesse=0

    [/autoit][autoit][/autoit][autoit]

    for $i=0 To Ubound($array_map)-1
    ;Mauer
    if $array_map[$i]="1" Then
    GuiCtrlCreatePic("mauer.gif", $x_groesse, $line, 64, 64)
    $x_groesse+=64
    ;Gras
    ElseIf $array_map[$i]="3" Then
    $a = GUICtrlCreateButton("A", $x_groesse, $line, 16, 16)
    GuiCtrlCreatePic("gras.gif", $x_groesse, $line, 64, 64)
    $x_groesse+=64
    ;Baum
    ElseIf $array_map[$i]="4" Then
    GuiCtrlCreatePic("baum.gif", $x_groesse, $line, 64, 64)
    $x_groesse+=64
    ;Hochbeet
    ;Gewächshaus
    ;-

    EndIf

    if $array_map[$i]=@CR Then
    $line+=64
    $x_groesse=0
    EndIf
    Next
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $a
    Beep(800)

    [/autoit][autoit][/autoit][autoit]

    EndSwitch
    WEnd

    [/autoit]
  • Ich denke mal du suchst ein 2D Array. Beispiel wäre:
    $aMap_Array[N][2]
    Erstellt ein Array mit N Indexen die jeweils 2 "Unterindexe" haben. Beispiel:
    Feld $aMap_Array[N][0]
    Feld Button ID $aMap_Array[N][1]

  • So was macht man mit einem 2-dimensionalen Array. ;) Und wenn du diesem dann noch eine '3te' Dimension gönnst, kannst du für jedes Feld auf der Map auch gleich noch mehrere Werte ablegen... :thumbup:

    [autoit]

    Dim $Map[10][10] ; <-- 2D-Array $Map[x-koordinate][y-koordinate]
    Dim $Map[10][10][3] ; <-- 3D-Array $Map[x-koordinate][y-koordinate][hier-hast-du-dann-noch-3-slots]

    [/autoit]

    Edit: Okay BadBunny war schneller... :P

    LG
    Christoph :)

  • So was macht man mit einem 2-dimensionalen Array. ;) Und wenn du diesem dann noch eine '3te' Dimension gönnst, kannst du für jedes Feld auf der Map auch gleich noch mehrere Werte ablegen... :thumbup:

    [autoit]

    Dim $Map[10][10] ; <-- 2D-Array $Map[x-koordinate][y-koordinate]
    Dim $Map[10][10][3] ; <-- 3D-Array $Map[x-koordinate][y-koordinate][hier-hast-du-dann-noch-3-slots]

    [/autoit]

    Edit: Okay BadBunny war schneller... :P

    Okay, Also ersetze ich $Map[10][10] durch mein Picture? Oder dürch meinen Button? das ich dan Bei [10] dan halt $x_groesse und bei [10] $line mache?
    Bin verwirt

  • Es kommt drauf an wie du deine Map aufbaust. Du kannst deine Map aus einem 3D Array aufbauen (X, Y, Wert (Buton ID, etc)) Oder einfach nur in Reihen, dann brauchst du ein 2D Array (N Feld, (Dazugehörige Werte...)).

    Du kannst dann jedem Feld (Egal ob du x uny y aufteilst oder nicht (Würde ich machen, ist übersichtlicher)) etwas zuweisen. z.B. Dem Feld auf Position (1|5) eine Button ID:
    $aMap[0][4][0] = GUICtrlCreateButton()...

    Oder einen Namen
    $aMap[0][4][1] = "Gras"

  • Danke an euch beiden, hier wird ein gut geholfen. Mein spiel sol 2 Demensional werden.

    Das Spiel wird dadurch nicht 3-Dimensional.
    Du kannst durch ein 3D Array nur einen weiteren Wert dran hängen.
    Du kannst auch ein 4D oder 5D Array draus machen ^^ (wenn das geht),
    das Spiel an sich bleibt trotzdem in 2D :)

  • Es kommt drauf an wie du deine Map aufbaust. Du kannst deine Map aus einem 3D Array aufbauen (X, Y, Wert (Buton ID, etc)) Oder einfach nur in Reihen, dann brauchst du ein 2D Array (N Feld, (Dazugehörige Werte...)).

    Du kannst dann jedem Feld (Egal ob du x uny y aufteilst oder nicht (Würde ich machen, ist übersichtlicher)) etwas zuweisen. z.B. Dem Feld auf Position (1|5) eine Button ID:
    $aMap[0][4][0] = GUICtrlCreateButton()...

    Oder einen Namen
    $aMap[0][4][1] = "Gras"


    Wie genau erstelle ich eine 2D Array? Soll ich es zu den CreatePic tuhen? Wen ich das mache bekomme ich folgenden error:
    Expected s "=" operator in assignment statment.

  • habe jezt das tutorial mal gemacht... Ich steige aber nicht so gut durch. Arrays waren noch nie meine Stärke... Aber vieleicht verstehe ich es ja bei einen anderen "Tut" besser.

    MfG

    • Offizieller Beitrag

    Was sollte ich den in der Array speichern? Die einzelnen Variablen der Buttons? Weil ich habe ja schone on Textdokoment wo halt die Map drinne steht.


    Was nützt dir die Info in dem Textdokument? Willst du jedesmal neu aus dem Textdokument auslesen, wenn du den Wert einer dort gespeicherten Variablen benötigst? Das ist ineffektiv.
    Du lädst den gesamten Inhalt der Textdatei in das Array und hast dann jederzeit blitzschnell Zugriff auf die einzelnen Werte. Ändern sich Werte, so änderst du diese im Array und schreibst am Programmende den aktuellen Arrayinhalt zurück in die Textdatei. Somit bist du immer UpToDate. ;)

    Wenn du Probleme hast die einzelnen Elemente über deren Index anzusprechen, da $array[$i][$j] nun mal nicht assoziativ ist, kannst du dir für den Anfang eine Brücke bauen.
    Ich zeig das mal am Beispiel einer kleinen Liste:

    ***** GebDat Wohnort Beziehungsstatus
    Peter 11.05.89 A-Dorf Single
    Maria 23.04.76 B-Dorf Geschieden
    Anton 12.12.94 C-Dorf Verheiratet
    Gerda 28.09.87 D-Dorf Single

    In deiner Datei kannst du das z.B. so abspeichern:

    [font='Courier New, Courier, mono']Peter=11.05.89|A-Dorf|Single
    Maria=23.04.76|B-Dorf|Geschieden
    Anton=12.12.94|C-Dorf|Verheiratet
    Gerda=28.09.87|D-Dorf|Single

    [font='Arial, Helvetica, sans-serif']Im Skript definierst du jetzt Index-Variablen für jede Zeile und Spalte (geht natürlich nur bei fester Anzahl von Elementen).

    [autoit]


    ; für die Zeilen:
    Global $Peter = 0, $Maria = 1, $Anton = 2, $Gerda = 3
    ; alternativ kannst du dafür auch mit Enum arbeiten:
    Global Enum $Peter, $Maria, $Anton, $Gerda ; Enum startet, wenn nicht anders festgelegt, mit 0 -- somit brauchst du den Indexwert nicht extra vorbelegen

    [/autoit][autoit][/autoit][autoit]

    ; dasselbe für die Spalten:
    Global Enum $GebDat, $Wohnort, $Beziehungsstatus

    [/autoit]

    Nun lassen sich die Zeilen/Spalten-Kombinationen mit "Begriffen" ansprechen:

    [autoit]


    ConsoleWrite( $array[$Peter][$Beziehungsstatus] & @CRLF ) ; gibt "Single" aus
    ConsoleWrite( $array[$Gerda][$Wohnort] & @CRLF ) ; gibt "D-Dorf" aus

    [/autoit]
  • Habe es jezt geschafft. Danke BugFix, die Map wird jezt in ein Array abgespeichert. Nur ich brauche ja immer noch die Buttons, um z.B. Ein Timer und die Grafik zu ändern? Wie könnte ich ein Button einfügen?

  • Du kannst dir die Handles der 'Feld-Buttons' und auch den TimeStamp in deinem Array mit abspeichern. Wenn du dir dann noch den GuiOnEventMode anschaust, lässt sich das ziemlich einfach lösen indem du alle Buttons auf eine Funktion registrierst. Immer wenn dann auf einen Button geklickt wird, wird diese Funktion dann aufgerufen. In dieser hast du dann ein Makro zur Verfügung das das Handle des geklickten Buttons enthält. Nun musst du nur noch das Array durchgehen und nachschauen zu welchem Feld das Handle gehört, denn du hast dir ja zu beginn alle entsprechenden Handles in das Array schreiben lassen... ;)

    LG
    Christoph :)

  • Im Array steht ja das gleiche wie in der map.txt... Also wie soll ich dan bestimmen "Zu feld 0 gehört der button und zu feld 0 der und der..."
    Weil da steht ja eigentlich nur 0 bei ein feld, und nicht 123456789 oder so.

  • Das ist ja genau das was wir dir schon die ganze Zeit erklären möchten... :D Du gehst jetzt einfach hin und deklarierst das Array mit 3 statt mit 2 'Dimensionen'.

    [autoit]

    ;Also nicht mehr so:
    Dim $Array[11][11]
    ;Sondern so:
    Dim $Array[11][11][3]
    ; Und dann speicherst du den Wert aus der Map eben in:
    $Array[x][y][0] = 'Map'
    ;und zum Beispiel das Handle des Feld-Buttons in:
    $Array[x][y][1] = GUICtrlCreateButton()
    ; und für andere Sachen die zu eben diesem Feld gehören hast du hier natürlich auch noch Platz...

    [/autoit]

    LG
    Christoph :)

  • Hatt einer eine idee, wie ich es machen kann, dass das Pogramm bei einen "!" im Textdokument Keine "Leeren Felder" macht?

    Den ich brauche ein "!" Um daten (ids wie z.B. 0,1,2) Abzutrennen, damit ich nicht nur eine einstellige ID habe... also ich möchte das es z.B. so ist:

    1!1!1!1!1
    1!0!13!0!1
    1!0!0!0!1
    1!1!1!1!1

    1 = Baum
    0 =Grass / Feld
    13 = Weg

    Den ich habe das problem, das das Pogram wen er ein Zeichen nicht zum bild macht, dan macht er einfach eine leere 64x64 Fläche...
    Gibt es vieliecht irgendwie sowas, das ich es einfach ignorieren lasse?