Hilfe bei Item&Inventar System

  • Hallo habe mir aus langeweile ein Text Adventure geskriptet in dem man durch drücken von 3 Buttons immer einen Schritt weiter gelang. Auf jeden Schritt folgen dann wieder andere möglichkeiten weiter zu gehen. Wollte nun einbauen dass man irgendwo ( was natürlich festgelegt ist) ein item finden kann was man an einer bestimmten stelle einsetzen muss um weiter zu kommen. Code des Skriptes habe ich eingefügt. Danke schon mal im voraus für die Hilfe.


    [autoit]

    $name = "Text Adventure "
    $version = "0.3 Beta"
    $game = " The Game"
    $creator = " created and scripted by Pascal Bendler"
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    #Region ### START Koda GUI section ### Form=C:\Users\Pascal\Desktop\Neuer Ordner (3)\Forms\textadvanture.kxf
    $Form1 = GUICreate("" & $name & $version & $game & $creator, 625, 443, 192, 124)
    $Label1 = GUICtrlCreateLabel("Hallo und Herzlich Willkommen zum Text Adventure 1.1. Zum Spielen müssen nur die 3 Buttons gedrückt werden. In jedem Text bzw. in jedem Spielfortschritt wird erklärt was jeder Button bewirkt. Drücken sie den Start-Button um zu beginnen.", 104, 56, 460, 257)
    $Button1 = GUICtrlCreateButton("1", 112, 328, 75, 25, 0)
    $Button2 = GUICtrlCreateButton("2", 296, 328, 75, 25, 0)
    $Button3 = GUICtrlCreateButton("3", 480, 328, 75, 25, 0)
    $Button4 = GUICtrlCreateButton("Start/Stopp", 296, 384, 75, 25, 0)
    $Button5Info = GUICtrlCreateButton("Info", 590, 408, 25, 25, 0)
    GUISetState(@SW_SHOW)
    GUISetIcon("C:\Windows\System32\PerfCenterCpl.ico")
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button4
    Func1 ()

    Case $Button5Info
    Info ()
    EndSwitch
    WEnd

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

    Func Info()

    MsgBox(0,"Info zum Spiel","Zu der Entstehung des Text Adventures: Aus reiner Langeweile habe ich mich eines Mittags an meinen Pc gesezt und vor mich hin geskripted. Dann kam mir die Idee ein Spiel zu Schreiben, doch eine Sprache wie C o.ä. beherrsche ich nicht. Dann habe ich mich entschieden ein kleines Text Adventure zu schreiben. Und nun sizt du hier und liest wie ich mich entschieden habe dieses kleine Programm zu entwickeln. Die Entwicklung: Die Entwicklung hat relativ lange gedauert, da ich einen langen Zeitraum nicht an dem Adventure gearbeitei habe (ca. ein halbes Jahr). Geschrieben ist es in AutoIt, mit all den Kenntnissen die ich habe und mir über Google zusammen gesucht/gearbeitet habe.")

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

    EndFunc

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

    Func Func1()

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

    $Label1 = GUICtrlCreateLabel("Du bist auf einer einsamen Insel und weist nicht wo du bist. Du versuchst einen Ausweg zu finden. Drücke 1 um die Insel zu erkunden, drücke 2 um auf Hilfe zu warten oder drücke 3 um von der Insel zu schwimmen, mit hilfen eines Floßes was du dir aus Bäumen der Insel baust.", 104, 56, 460, 257)

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

    while 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    Button1 ()

    Case $Button2
    Button2 ()

    Case $Button3
    Button3 ()

    Case $Button4
    Button4 ()

    Case $Button5Info
    Info ()
    EndSwitch
    WEnd
    EndFunc

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

    Func Button4 ()

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

    $Label1 = GUICtrlCreateLabel("Hallo und Herzlich Willkommen zum Text Adventure 1.1. Zum Spielen müssen nur die 3 Buttons gedrückt werden. In jedem Text bzw. in jedem Spielfortschritt wird erklärt was jeder Button bewirkt. Drücken sie den Start-Button um zu beginnen.", 104, 56, 460, 257)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button4
    Func1 ()

    Case $Button5Info
    Info ()
    EndSwitch
    WEnd

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


    EndFunc

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

    Func Button1 ()

    $Label1 = GUICtrlCreateLabel("Du gehst durch das Dickicht der Insel findest aber nichts was dir weiter Helfen könnte. Drücke 1, 2 oder 3 um zum Start-Punkt zurück zu kehren.", 104, 56, 460, 257)

    while 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    Func1 ()

    Case $Button2
    Func1 ()

    Case $Button3
    Func1 ()

    Case $Button4
    Button4 ()

    Case $Button5Info
    Info ()
    EndSwitch
    WEnd
    EndFunc

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

    Func Button2 ()

    $Label1 = GUICtrlCreateLabel("Du sezt dich an den Strand und wartest auf Hilfe. Auf einmal hörst du ein Hupen von einem Schiff. Doch plözlich wachst du auf und bemerkst dass es nur ein Traum war. Du wartest so lange auf Hilfe bist du eines langsamen Hungertodes gestorben bist. Drücke 1, 2 oder 3 um von vorne zu beginnen.", 104, 56, 460, 257)

    while 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    Func1 ()

    Case $Button2
    Func1 ()

    Case $Button3
    Func1 ()

    Case $Button4
    Button4 ()

    Case $Button5Info
    Info ()
    EndSwitch
    WEnd

    EndFunc

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

    Func Button3 ()

    $Label1 = GUICtrlCreateLabel("Du baust dir ein Floß. Stundenlang arbeitest du daran in der Hoffnung dass du es von dieser Insel schaffst. Nach ca. 7 Stunden harter Arbeit ist es vollbracht. Du lässt das Floß ins Wasser und lässt dich treiben. Ein paar Tage später hängst du Verhungernd auf deinem Floß -ohne Kraft- und hoffst auf Hilfe, als du dann plözlich Festland sichtest. Du paddelst voller Freude und Elan los bis du am Festland angekommen bist. Doch was nun ? Drücke 1 um die Küste entlang zu laufen, drücke 2 um auf die Berge zu klettern die du im Norden siehst oder drücke 3 um dich dort nieder zu lassen.", 104, 56, 460, 257)

    while 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    Button1Kueste ()

    Case $Button2
    Button2Berge ()

    Case $Button3
    Button3Niederlassen ()

    Case $Button4
    Button4 ()

    Case $Button5Info
    Info ()
    EndSwitch
    WEnd
    EndFunc

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

    Func Button1Kueste ()

    $Label1 = GUICtrlCreateLabel("Du gehst die Küste entlang doch mehr als Sand ist hier nicht zu finden. Drücke 1 um zu deinem Floß zurück zu gehen, drücke 2 um jetz zu den Bergen im Norden zu gehen oder Drücke 3 um dich zu ertränken weil du keine lust mehr auf Leben hast.",104, 56, 460, 257)

    while 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    Button1zuruekfloss ()

    Case $Button2
    Button2Berge ()

    Case $Button3
    Button3Ende ()

    Case $Button4
    Button4 ()

    Case $Button5Info
    Info ()
    EndSwitch
    WEnd
    EndFunc

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

    Func Button1zuruekfloss ()

    $Label1 = GUICtrlCreateLabel("Du gehst wieder zu deinem Gestrandeten Floß zurück und denkst nach was du nun tun könntest. Drücke 1 um in die Berge zu gehen die im Norden liegen, drücke 2 um dich hier nieder zu lassen und dir eine kleine Existenz auf zu bauen oder drücke 3 um nach Osten ins Flachland zu gehen.",104, 56, 460, 257)

    while 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    Button2Berge ()

    Case $Button2
    Button3Niederlassen ()

    Case $Button3
    Button3Flachland ()

    Case $Button4
    Button4 ()

    Case $Button5Info
    Info ()
    EndSwitch
    WEnd
    EndFunc

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

    Func Button2Berge ()

    $Label1 = GUICtrlCreateLabel("Du bist zu den Bergen gegangen und kletterst hinauf als du plötzlich einen Aßgeier siehst... Was sollst du nun tun ? Drücke 1 um wieder zurück zum Floß zu gehen, drücke 2 um den Aßgeier zu ignorieren und weiter zu klettern oder drücke 3 um Dort zu warten bis der Aßgeier verschwindet.",104, 56, 460, 257)

    while 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    Button1zuruekfloss ()

    Case $Button2
    Button2weiterklettern ()

    Case $Button3
    Button3warten ()

    Case $Button4
    Button4 ()

    Case $Button5Info
    Info ()
    EndSwitch
    WEnd
    EndFunc

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

    Func Button3Ende ()

    $Label1 = GUICtrlCreateLabel("Du hast keine lust mehr zu leben also tötest du dich indem du dich im Wasser ertränkst. Zusätzlich wirst du von ein paar Haien gefressen. Drücke 1, 2 oder 3 um von Vorne zu beginnen.",104, 56, 460, 257)

    while 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    Func1 ()

    Case $Button2
    Func1 ()

    Case $Button3
    Func1 ()

    Case $Button4
    Button4 ()

    Case $Button5Info
    Info ()
    EndSwitch
    WEnd
    EndFunc

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

    Func Button3Niederlassen ()

    $Label1 = GUICtrlCreateLabel("Du lässt dich an dieser wunderschönen - aber einsamen - Küste nieder und baust dir eine kleine Existenz auf. Du baust dir ein Kleines Haus und züchtest dir ein paar Schweine die du eingefangen hast. Du stirbst friedlich und alleine in deiner Hütte. Drücke 1, 2 oder 3 um nochmal von vorne zu beginnen.",104, 56, 460, 257)

    while 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    Func1 ()

    Case $Button2
    Func1 ()

    Case $Button3
    Func1 ()

    Case $Button4
    Button4 ()

    Case $Button5Info
    Info ()
    EndSwitch
    WEnd

    EndFunc

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

    Func Button3Flachland ()

    $Label1 = GUICtrlCreateLabel("Du gehst ins Flachland - mir knurrendem Magen - und suchst dir etwas zu Essen. Nachdem du dir einen wilden Hasen gefangen, gegrillt und gegessen hast begibst du dich weiter auf die Reise. Drücke 1 um in die Berge zu gehen, drücke 2 um die merkwürdige Höhle im Flachland zu erkunden oder drücke 3 um durch die Wüste zu gehen.",104, 56, 460, 257)

    while 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    Button2Berge ()

    Case $Button2
    Button2Hoehle ()

    Case $Button3
    Button3Wueste ()

    Case $Button4
    Button4 ()

    Case $Button5Info
    Info ()
    EndSwitch
    WEnd

    EndFunc

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

    Func Button2Hoehle ()

    $Label1 = GUICtrlCreateLabel("Du gehst in eine Höhle ... es ist sehr Dunkel ... was sollst du tun ?",104, 56, 460, 257)

    while 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    Button1Hoehleraus ()

    Case $Button2
    Button2Hoehleweiter ()

    Case $Button3
    Button3Hoehle ()

    Case $Button4
    Button4 ()

    Case $Button5Info
    Info ()
    EndSwitch
    WEnd


    EndFunc

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

    Func Button3Wueste ()

    $Label1 = GUICtrlCreateLabel("Du gehst in die Wüste ... eine sehr riskante Entscheidung ohne Wasser dorthin zu gehen ... Drücke 1 um wieder um zu kehren, drücke 2 um Doch weiter in die Wüste zu gehen oder drücke 3 um die Wüste zu umgehen.",104, 56, 460, 257)

    while 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    Button3Flachland ()

    Case $Button2
    Button2weiterWueste ()

    Case $Button3
    Button3wuesteumgehen ()

    Case $Button4
    Button4 ()

    Case $Button5Info
    Info ()
    EndSwitch
    WEnd


    EndFunc

    [/autoit]
  • Hallo,

    ich würde dir erstmal raten dich vielleicht doch noch mal mit dem einen oder anderen AutoIt-Tutorial auseinanderzusetzen, oder mit Peethebees Buch (siehe im Portal unter "Wichtige Links").

    Dein Skript ist leider, wenn da was größeres draus werden soll, soweit ziemlich unbrauchbar (und in dieser Form auch nicht lauffähig!).
    Du hangelst dich immer mit dem selben Funktionsaufbau, nämlich eine Endlosschleife, die nie unterbrochen wird, von Funktion zu Funktion, in denen du wiederum in eine Endlosschleife einsteigst. So erreichst du langfristig genau das, was auch hier (nur zeitlich etwas schneller) geschieht:

    [autoit]


    fkt()

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

    Func fkt()
    While 1
    fkt()
    Sleep(10)
    WEnd
    EndFunc ;==>fkt

    [/autoit]

    --> Eine Übersteigung des maximalen Rekurionslevels (das bedeutet grob gesagt, du steckst zu viele Dinge ineinander).


    Lies dir lieber noch ein paar Erklärungen zu AutoIt, dem Gui-Management etc. durch. EIne Gui mit Koda machen ist die eine Sache, aber die erzeugten Elemente richtig anzusteueren, die andere, wesentlich schwierigere Sache. Wenn du noch etwas in Erklärungen stöberst und dich dann auch mit Variablen und Arrays auskennst wirst du dir deine obige Frage wohl selbst beantworten können.

    Gruß stay

    PS: Das ist echt nicht böse gemeint!

  • Morgen, also wie stayawayknight schon geschrieben hat ist dein Script nicht lauffähig, und vom Ausbau her leider nicht zu gebrauchen..
    Um dir den Einstieg in Autoit etwas zu vereinfachen würde ich an deiner Stelle mir erst mal inige Tutorials Durchlesen.. habe mal auf die Schnelle was geschrieben, so oder so in der Art würde ich das Script aufbauen, ggf mit einer INI in der die Fragen und Antwortmöglichkeiten hinterlegt sind.
    In meinem Vorschlag habe ich das ganze mit deinem Array gelöst..

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>

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

    Global $creator = " created and scripted by Pascal Bendler", $game = " The Game" , $version = "0.3 Beta", $name = "Text Adventure "
    Global $LevelID = 1 ; mit erstem Level beginnend
    Global $aFragenArray[10][4], $GameStarted = False
    $aFragenArray[0][0] = "Hallo und Herzlich Willkommen zum Text Adventure 1.1. Zum Spielen müssen nur die 3 Buttons gedrückt werden. In jedem Text bzw. in jedem Spielfortschritt wird erklärt was jeder Button bewirkt. Drücken sie den Start-Button um zu beginnen."

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

    $aFragenArray[1][0] = "Du bist auf einer einsamen Insel und weist nicht wo du bist. Du versuchst einen Ausweg zu finden. Drücke 1 um die Insel zu erkunden, drücke 2 um auf Hilfe zu warten oder drücke 3 um von der Insel zu schwimmen, mit hilfen eines Floßes was du dir aus Bäumen der Insel baust."
    $aFragenArray[1][1] = "2" ; wenn bei Frage 1 Button 1 Gedrückt wird ändere den Text auf $aFragenArray[2][0] wobei unter dimension [0] immer die Frage steht
    $aFragenArray[1][2] = "Antwortmöglichkeit 2"
    $aFragenArray[1][3] = "Antwortmöglichkeit 3"
    $aFragenArray[2][0] = "Du gehst durch das Dickicht der Insel findest aber nichts was dir weiter Helfen könnte. Drücke 1, 2 oder 3 um zum Start-Punkt zurück zu kehren."
    $aFragenArray[2][1] = "1"
    $aFragenArray[2][2] = "1"
    $aFragenArray[2][3] = "1"

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

    _ArrayDisplay($aFragenArray)
    #Region ### START Koda GUI section ### Form=C:\Users\Pascal\Desktop\Neuer Ordner (3)\Forms\textadvanture.kxf
    $Form1 = GUICreate("" & $name & $version & $game & $creator, 625, 443)
    $Label1 = GUICtrlCreateLabel($aFragenArray[0][0], 104, 56, 460, 257)
    $Button1 = GUICtrlCreateButton("1", 112, 328, 75, 25)
    GUICtrlSetState(-1,$GUI_DISABLE)
    $Button2 = GUICtrlCreateButton("2", 296, 328, 75, 25)
    GUICtrlSetState(-1,$GUI_DISABLE)
    $Button3 = GUICtrlCreateButton("3", 480, 328, 75, 25)
    GUICtrlSetState(-1,$GUI_DISABLE)
    $Button4 = GUICtrlCreateButton("Start", 296, 384, 75, 25, 0)

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

    $Button5Info = GUICtrlCreateButton("Info", 590, 408, 25, 25, 0)
    GUISetState(@SW_SHOW)
    GUISetIcon("C:\Windows\System32\PerfCenterCpl.ico")
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    _ChosenWay('1')
    Case $Button2
    _ChosenWay('2')
    Case $Button3
    _ChosenWay('3')
    Case $Button4
    If $GameStarted = False Then
    _StartAdventure($LevelID)
    GUICtrlSetState($Button4,$GUI_DISABLE)
    Else
    _GameStop()
    EndIf
    Case $Button5Info
    btnInfo ()
    EndSwitch
    WEnd

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

    Func btnInfo()
    MsgBox(0,"Info zum Spiel","Zu der Entstehung des Text Adventures:"&@CRLF&"Aus reiner Langeweile habe ich mich eines Mittags an meinen Pc gesezt und vor mich hin geskripted. Dann kam mir die Idee ein Spiel zu Schreiben, doch eine Sprache wie C o.ä. beherrsche ich nicht. Dann habe ich mich entschieden ein kleines Text Adventure zu schreiben. Und nun sizt du hier und liest wie ich mich entschieden habe dieses kleine Programm zu entwickeln. Die Entwicklung: Die Entwicklung hat relativ lange gedauert, da ich einen langen Zeitraum nicht an dem Adventure gearbeitei habe (ca. ein halbes Jahr). Geschrieben ist es in AutoIt, mit all den Kenntnissen die ich habe und mir über Google zusammen gesucht/gearbeitet habe.")
    EndFunc

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

    Func _ChosenWay($Index)
    MsgBox(64,"Du gehst Weg",$Index)
    GUICtrlSetData($Label1,$aFragenArray[$aFragenArray[$LevelID][$Index]][0])
    ; Je nachdem was ausgewählt wurde musst du dann dass Label anpassen und die $LevelID Setzen
    EndFunc

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

    Func _StartAdventure($LevelID)
    GUICtrlSetData($Label1,$aFragenArray[$LevelID][0]) ; Setzt dass Label auf den Text des Derzeitigen Levels
    GUICtrlSetState($Button1,$GUI_ENABLE)
    GUICtrlSetState($Button2,$GUI_ENABLE)
    GUICtrlSetState($Button3,$GUI_ENABLE)
    $GameStarted = True
    EndFunc

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

    Func _GameStop()
    $GameStarted = False
    GUICtrlSetState($Button1,$GUI_DISABLE)
    GUICtrlSetState($Button2,$GUI_DISABLE)
    GUICtrlSetState($Button3,$GUI_DISABLE)
    GUICtrlSetState($Button4,$GUI_ENABLE)
    GUICtrlSetData($Label1,$aFragenArray[0][0])
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Danke für die Hilfe ... Und stayawayknight ich habe mir zig Tutorials im Internet und auf AutoIT.com durchgelesen und mir alles angeschaut was ich zu Variablen und der Gui Oberfläche brauche, ich wollte ja eigentlich nur wissen wie ich ein Item & Inventar System einbauen kann. Ich bedanke mich für die verbesserungs vorschläge aber damit ist die frage des Item & Inventar systems noch nich geklärt ... Aber trotzdem Danke

  • Und stayawayknight ich habe mir zig Tutorials im Internet und auf AutoIT.com durchgelesen und mir alles angeschaut was ich zu Variablen und der Gui Oberfläche brauche


    Ich will dich ja nicht persönlich angreifen, aber wenn dies der Fall wäre, dann hättest du oben vermutlich (besseren) Quellcode posten können...
    Sofern du die Grundprinzipien nicht wirklich begriffen/umgesetzt hast, brauchst du an deinem Game gar nicht mehr weitermachen - aus dem obigen Grund hat dein jetziger Quellcode keine Zukunft, da du langfristig immer das max. Rekursionlevel übersteigen wirst.

    Außerdem lässt es sich gar nicht ausführen, ohne sämtliche Warnungen und Fehler ignorieren zu lassen.
    Wenn du schon soweit bist, dann würde ich mich jetzt dringend in den Quellcode von Protex einlesen, mit diesem lässt sich gut arbeiten.

    Klicke mal bei deinem Skript unüberlegt einfach ein paar Buttons - fast immer stürzt das Programm nach ein paar Klicks ab.
    Solange du diese grundlegenden Fehler im Code nicht ausgemerzt hast, brauchst du mit einem Inventar etc. eigentlich gar nicht anfangen.

    Dieses könntest du übrigens so umsetzen:

    -Jede Itemsorte bekommt eine bestimmte Zahl/String, an dem die Sorte eindeutig identifiziert werden kann
    -Deklariere am Anfang ein Array mit einer bestmmten Größe (je nach dem, wie groß das Inventar werden soll)
    -Fülle die einzelnen Elemente mit den jeweiligen entsprechenden Integern/Strings (s. oben) (je nach dem, was im Inventar vorhanden ist)
    -Rest des Arrays mit 0 füllen.
    -Bei dem Fund enes Items suchst du nach dem nächsten freien (=0) Element und füllst dieses.
    -Beim Einsetzen suchst du im Array nach dem Index, der das entsprechende Item (bzw. Element) enthält und setzst den Inhalt wieder auf 0.

    Hier ein kleines Beispiel, ist zwar nicht perfekt und ich hätte vermutlich auch auf irgendwelche bereits vorhandenen Arrayfunktionen zurückgreifen können, deren Namen mir entfallen sind...

    Beispiel
    [autoit]


    ;Jede Zahl im Array steht für eine Itemsorte
    Dim $iInventar[10]

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

    For $i = 0 To UBound($iInventar) - 1
    $iInventar[$i] = 0
    Next

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

    ;Oben: Inventar erstellen

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

    _DisplayInventar() ;Ausgabe des Inventars

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

    ;Jetzt beispielsweise Fund eines Items, das dann die für den Entwickler verständlichen Zahl "5" trägt.

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

    $iInventar[_GetNextFreeIndex()] = 5
    _DisplayInventar();Ausgabe des Inventars

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

    ;Fund weitere Items, hier mit den Zahlen 2, 8, 3 und 6 versehen
    $iInventar[_GetNextFreeIndex()] = 2
    $iInventar[_GetNextFreeIndex()] = 8
    $iInventar[_GetNextFreeIndex()] = 3
    $iInventar[_GetNextFreeIndex()] = 6
    _DisplayInventar();Ausgabe des Inventars

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

    ;Ein Item mit der Zahl 3 wird verbraucht und muss aus dem Inventar gelöscht werden
    $iInventar[_GetFirstItemIndex(3)] = 0 ;Wird wieder auf Null gesetzt
    _DisplayInventar();Ausgabe des Inventars

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

    Func _GetFirstItemIndex($iItemNumber);Gibt den ersten Index des Arrays aus, dessen Element das Item enthält
    For $i = 0 To UBound($iInventar) - 1
    If $iInventar[$i] = $iItemNumber Then
    Return $i
    EndIf
    Next
    EndFunc ;==>_GetFirstItemIndex

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

    Func _GetNextFreeIndex() ;Ermittelt die nächste freie Stelle im Inventar
    For $i = 0 To UBound($iInventar) - 1
    If $iInventar[$i] = 0 Then
    Return $i
    EndIf
    Next
    EndFunc ;==>_GetNextFreeIndex

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

    Func _DisplayInventar()
    ConsoleWrite(@CRLF)
    For $i = 0 To UBound($iInventar) - 1
    ConsoleWrite("Inventaritem Nr. " & $i & ": " & $iInventar[$i] & @CRLF)
    Next
    EndFunc ;==>_DisplayInventar

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Den fehler kann ich dir nennen wieso das Programm nach ein paar klicks abstürzt ... weil dort die funktion noch nicht existiert die eigentlich das label verändern soll ... sprich du hast die drei wahlmöglichkeiten und wählst die erste ... dann bekommst du eine neues gui label und dann wieder drei wahl möglichkeiten ... da aber an manchen stellen die funktion fehlt die das label weiter verändert stürzt das pogramm ab schau mal in meinem skript nach das pogramm stürzt nur an den stellen ab wo ich noch nicht weiter gemacht habe ... und danke für die hilfe beim Item & Inventar system

  • Hey teamnoobPDB,

    ich glaube du hast immer noch nicht verstanden was stayawayknight dir sagen will... :D
    Er bemängelt die Art, wie dein Script aufgebaut ist und nicht, dass manche Funktionen noch fehlen.
    Da ich gerade eh nichts zutun hatte, habe ich mal schnell meine Version von deinem Adventure geschreiben:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    $Gui = GUICreate("Adventure", 625, 443)
    $Label = GUICtrlCreateLabel("Hallo und Herzlich Willkommen zum Text Adventure 1.1. Zum Spielen müssen nur die 3 Buttons gedrückt werden. In jedem Text bzw. in jedem Spielfortschritt wird erklärt was jeder Button bewirkt. Drücken sie den Start-Button um zu beginnen.", 104, 56, 460, 257)
    $Button1 = GUICtrlCreateButton("1", 112, 328, 75, 25, 0)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $Button2 = GUICtrlCreateButton("2", 296, 328, 75, 25, 0)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $Button3 = GUICtrlCreateButton("3", 480, 328, 75, 25, 0)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $ButtonStart = GUICtrlCreateButton("Start", 296, 384, 75, 25, 0)
    $ButtonInfo = GUICtrlCreateButton("Info", 590, 408, 25, 25, 0)
    GUISetState(@SW_SHOW)
    Global $ResFile = @ScriptDir & '\game.res', $Level = IniRead($ResFile, 'INFO', 'CurrentLevelID', 1), $EditMode = True

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    _Choose(1)
    Case $Button2
    _Choose(2)
    Case $Button3
    _Choose(3)
    Case $ButtonStart
    _Load()
    Case $ButtonInfo
    _Info()
    EndSwitch
    WEnd

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

    Func _Choose($Number)
    $NextLevelID = IniRead($ResFile, $Level, 'Answer' & $Number, 0)
    If $NextLevelID <> '0' Then
    $Level = $NextLevelID
    $Text = IniRead($ResFile, $NextLevelID, 'TEXT', 'Dieses Level existiert momentan noch nicht!')
    GUICtrlSetData($Label, $Text)
    IniWrite($ResFile, 'INFO', 'CurrentLevelID', $NextLevelID)
    ElseIf $EditMode = True Then
    If MsgBox(64 + 4, 'Adventure-Editor', 'Für diese Auswahl wurde noch keine Weiterleitung eingerichtet!' & @CRLF & 'Möchten sie ein neues Level erstellen?') = 6 Then
    $NewText = InputBox('Adventure-Editor', 'Bitte gib den Text für das neue Level ein:', '', '', 300, 125)
    If Not @error And $NewText <> '' Then
    $NewLevelID = Number(IniRead($ResFile, 'INFO', 'COUNT', 0)) + 1
    IniWrite($ResFile, 'INFO', 'COUNT', $NewLevelID)
    IniWrite($ResFile, $NewLevelID, 'TEXT', $NewText)
    IniWrite($ResFile, $Level, 'Answer' & $Number, $NewLevelID)
    EndIf
    EndIf
    EndIf
    EndFunc ;==>_Choose

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

    Func _Load()
    GUICtrlSetState($Button1, $GUI_ENABLE)
    GUICtrlSetState($Button2, $GUI_ENABLE)
    GUICtrlSetState($Button3, $GUI_ENABLE)
    GUICtrlSetState($ButtonStart, $GUI_DISABLE)
    GUICtrlSetData($Label, IniRead($ResFile, $Level, 'TEXT', 'Error'))
    EndFunc ;==>_Load

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

    Func _Info()
    MsgBox(0, '', 'Hier gibts dann noch Infos...')
    EndFunc ;==>_Info

    [/autoit]


    Und hier noch die 'Game.res' die das Script benötigt:

    Spoiler anzeigen
    Code
    [INFO]
    CurrentLevelID=1
    COUNT=1
    [1]
    TEXT=Du bist auf einer einsamen Insel und weist nicht wo du bist. Du versuchst einen Ausweg zu finden. Drücke 1 um die Insel zu erkunden, drücke 2 um auf Hilfe zu warten oder drücke 3 um von der Insel zu schwimmen, mit hilfen eines Floßes was du dir aus Bäumen der Insel baust.


    In meiner Version, habe ich einen kleinen Game-Editor mit eingebaut... 8)

    Christoph54 ;)

    LG
    Christoph :)

  • Zitat

    Danke dir, war auch gerade dabei das umzuschreiben/neuzuschreiben - hast mir Schreibarbeit erspart :)

    teamnoobPDB:
    Du musst wohl verstehen, dass diese Art der Codeführung sehr schlecht ist. Egal welche Funktionen du noch einbaust, das Programm wird langfristig das max. Rekursionslevel erreichen und mit

    Zitat

    ==> Recursion level has been exceeded - AutoIt will quit to prevent stack overflow.:

    abstürzen (auch wenn das erst bei 4710 Funktionsaufrufen oder so geschieht).
    Baue dein Skript um, ehe es zu spät ist! Beschäftige dich z.B. auch mal mit dem On-Event Mode (ist hierwohl angebrachter als der Message-Loop-Modus), mit Arrays und Variablen!

    Gruß stay

    2 Mal editiert, zuletzt von stayawayknight (5. Februar 2012 um 00:17)