Hilfe zu einem Autoit-Skript (Zahlenraten)

  • Hallo Autoit-Forum :D

    Ich hab mich vor ein paar Tagen in Autoit ein wenig hineingelesen. Und mir ein ein Skript von http://ritzelrocker04.bplaced.net/wordpress/tutorials/zahlenraten/ (Zahlenraten) heruntergeladen.

    Ich wollte es ein wenig überarbeiten, damit ich es lernen kann.

    (Zwei funktionen einbauen "Nochmal-Funktion" statt dem "About" und eine Funktion, dass man bei Beginn des Programms den Zahlenraum selber auswählen kann :rock: )

    Jetzt wollte ich Fragen ob, ihr mir dabei helfen könnt da sobald ich statt einem festen Zahlenraum eine Variable verwende fast immer die Meldung kommt "Die Zahl muss zwischen 0 und "der durch die Variable festgelegten Zahl" sein. Obwohl sie zwischen ihnen ist. ?(



    Wäre Super wenn ihr mir helfen könntet


    Danke im Vorraus :P

  • Füg mal zwischen Zeile 50 und 51 folgendes ein

    [autoit]

    $number = Int($number)

    [/autoit]


    Die Rückgabe von GUICtrlRead() ist ein String und spätestens wenn du ihn gegen 0 prüfst, ist 0 eben nicht mehr gleich null.

    Die Zeilen 43 bis 45 solltest du entfernen. Vor dem Aufruf von Exit setz eine Variable (z.B. $retry) auf 1. Am Skriptanfang kannst du dann mit OnAutoitExitRegister() eine Funktion festlegen, die nach dem Schliessen des Skripts aufgerufen wird. In dieser Funktion prüfst du, ob $retry=1 ist und startest das Skript mit Run(@ScriptFullPath) neu. Nicht vergesen die Variable $retry beim Programmstart und vor jedem "echten" Beenden wieder auf 0 zu setzen.

  • Das Problem mit der Zahl hat i2c ja schon gelöst.
    Bei Zeile 43 bis 45 würde ich aber eine andere Lösung vorschlagen.
    Ich hab mal im Script ein paar Gedanken notiert. Da du was lernen willst ist das ganze zum selbermachen ;)

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Outfile=zahlenraten.exe
    #AutoIt3Wrapper_Run_AU3Check=n
    #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #AutoIt3Wrapper_Run_Tidy=y
    #AutoIt3Wrapper_Tidy_Stop_OnError=n
    #Obfuscator_Parameters=/striponly
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <process.au3> ; für was?
    Opt('MustDeclareVars', 1)
    _main()
    Func _main()
    Local $grenze = InputBox("Grenze", "Bitte max. Wert eingeben:"); wie von i2c schon angesprochen musst du nach Int konvertieren
    Local $sTitle = "ZahlenRaten - Tut", $sDate = "13.09.2013", $sVersion = "0.4.3"
    Local $sMsgUpdate = '%s\n\nDer PC ermittelt eine zuf?llige Zahl, die von Dir\t' _
    & '\nmit so wenig wie m?glichen Versuchen,\nerraten werden soll.' _
    & '\nAls Hinweis bekommst Du eine Meldung,\nob Deine Zahl kleiner, gr??er oder richtig war.' _
    & '\n\nVersion:\t%s\nBuild:\t%s\n\nAutor:\nRitzelrocker04 / RR04' _
    & '\nritzelrocker04.bplaced.net\n\nWeiter zum UpdateCheck?'
    Local $nMsg, $btnClose, $btnGo, $iptNumber, $lblOut, $lblOutMsg, $btnNochmal
    Local $output, $number, $try = 0, $randomNumber = Random(0, $grenze, 1)

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

    GUICreate($sTitle, 300, 185)
    GUICtrlCreateLabel("Rate die Zahl zwischen 0 und " & $grenze, 35, 10, 230, 17, 0x0001); Speicher dir hier die Control-ID in eine Variable
    GUICtrlSetFont(-1, 10, 400, 0, "Comic Sans MS")
    $iptNumber = GUICtrlCreateInput("", 35, 35, 230, 20, 0x200)
    ;$iptNumber = 0
    GUICtrlSetLimit(0, 9); das bewirkt nichts... Eine Control-ID 0 existiert nicht
    $lblOut = GUICtrlCreateLabel("Hinweise.", 35, 65, 230, 17, 0x001)
    GUICtrlSetFont(-1, 10, 400, 0, "Comic Sans MS")
    $lblOutMsg = GUICtrlCreateLabel("Anzahl der Versuche :" & @TAB & $try, 35, 95, 230, 17, 0x001)
    GUICtrlSetFont(-1, 10, 400, 0, "Comic Sans MS")
    $btnNochmal = GUICtrlCreateButton("&nochmal", 35, 140, 75, 22)
    $btnGo = GUICtrlCreateButton("&Start", 115, 140, 75, 22, 0x0001)
    $btnClose = GUICtrlCreateButton("&Beenden", 195, 140, 75, 22)
    GUISetState()
    While True
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3, $btnClose
    ExitLoop
    Case $btnNochmal ; Warum hier das Programm beenden und neu starten? Das ist sehr unschön :P
    ;Alles was du machen musst ist:
    ; eine neue Grenze definieren (wenn gewünscht)
    ; eine neue Zufallszahl generieren
    ; Versuchszähler ($try) auf 0 setzen
    ; Gui Zurücksetzen auf Anfangszustand: Also $iptNumber Input leeren und "Rate die Zahl..." Label neu setzen, $lblOut Label zurücksetzen
    GUIDelete()
    Local $grenze = InputBox("Grenze", "Bitte max. Wert eingeben:")
    ShellExecute("Zahlenraten.exe")
    Exit
    Case $btnGo
    $try += 1
    $number = GUICtrlRead($iptNumber)
    If ($number <> "") And ($number >= 0) And ($number <= $grenze) Then
    Switch $randomNumber
    Case $randomNumber < $number
    $output = "Die gesuchte Zahl ist kleiner."
    Case $randomNumber > $number
    $output = "Die gesuchte Zahl ist groesser."
    Case Else
    $output = "Super ! Du hast die Zahl geraten !"
    EndSwitch
    GUICtrlSetData($lblOut, $output)
    GUICtrlSetData($lblOutMsg, "Anzahl der Versuche :" & @TAB & $try)
    Else
    MsgBox(64, "Error", "Bitte eine Zahl zwischen 0 und " & $grenze & " eingeben !")
    EndIf
    EndSwitch
    WEnd
    EndFunc ;==>_main

    [/autoit]
  • Hallo und herzlich Willkommen!
    Vielen Dank für Dein Interesse, anbei eine Lösung. ;)

    Spoiler anzeigen
    [autoit]


    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Outfile=zahlenraten.exe
    #AutoIt3Wrapper_UseUpx=n
    #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #AutoIt3Wrapper_Run_Tidy=y
    #AutoIt3Wrapper_Run_Obfuscator=y
    #Obfuscator_Parameters=/striponly
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

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

    _main()
    Func _main()
    Local $nMsg, $btnClose, $btnGo, $iptZahl, $lblOut, $lblOutMsg, $btnNew
    Local $zfzhl, $zahl, $versuche = 0

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

    GUICreate('ZahlenRaten v004', 250, 155)
    GUICtrlCreateLabel("Rate die Zahl zwischen 0 und 999", 10, 10, 230, 17, 0x001)
    GUICtrlSetFont(-1, 10, 400, 0, "Comic Sans MS")
    $iptZahl = GUICtrlCreateInput("", 10, 35, 230, 20, 0x2000)
    GUICtrlSetLimit(-1, 3)
    $lblOut = GUICtrlCreateLabel("Hinweise.", 10, 65, 230, 17, 0x001)
    GUICtrlSetFont(-1, 10, 400, 0, "Comic Sans MS")
    $lblOutMsg = GUICtrlCreateLabel("Anzahl der Versuche :" & @TAB & $versuche, 10, 95, 230, 17, 0x001)
    GUICtrlSetFont(-1, 10, 400, 0, "Comic Sans MS")
    $btnNew = GUICtrlCreateButton("&Neues Spiel", 10, 125, 75, 22)
    $btnGo = GUICtrlCreateButton("&Start", 90, 125, 75, 22, 0x0001)
    $btnClose = GUICtrlCreateButton("&Beenden", 170, 125, 75, 22)
    GUISetState()

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

    $zfzhl = Random(0, 999, 1)
    ConsoleWrite("Die zufällige Zahl lautet : " & $zfzhl & @CRLF)

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

    While True
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3, $btnClose
    ExitLoop
    Case $btnNew
    $zfzhl = Random(0, 999, 1)
    ConsoleWrite("Die zufällige Zahl lautet : " & $zfzhl & @CRLF)
    $versuche = 0
    GUICtrlSetData($lblOutMsg, "Anzahl der Versuche :" & @TAB & $versuche)
    GUICtrlSetData($lblOut, "Hinweise.")
    GUICtrlSetData($iptZahl, "")
    Case $btnGo
    $zahl = GUICtrlRead($iptZahl)
    ConsoleWrite("Die vom Nutzer eingegebene Zahl : " & $zahl & @CRLF)
    If ($zahl >= 0) And ($zahl <= 999) Then
    Switch $zfzhl
    Case $zfzhl < $zahl
    $versuche += 1
    GUICtrlSetData($lblOut, "Die gesuchte Zahl ist kleiner.")
    GUICtrlSetData($lblOutMsg, "Anzahl der Versuche :" & @TAB & $versuche)
    Case $zfzhl > $zahl
    $versuche += 1
    GUICtrlSetData($lblOut, "Die gesuchte Zahl ist groesser.")
    GUICtrlSetData($lblOutMsg, "Anzahl der Versuche :" & @TAB & $versuche)
    Case Else
    $versuche += 1
    GUICtrlSetData($lblOut, "Super ! Du hast die Zahl geraten !")
    GUICtrlSetData($lblOutMsg, "Anzahl der Versuche :" & @TAB & $versuche)
    EndSwitch
    Else
    MsgBox(64, "Error", "Bitte eine Zahl zwischen 0 und 999 eingeben !")
    EndIf
    EndSwitch
    WEnd
    EndFunc ;==>_main
    ; Ende

    [/autoit]
  • Erstmal danke an alle die hier geantwortet haben :D

    Aber:

    RR04: Das ist das Skript von deiner Seite das ich umbauen wollte (Keine Lösung von meinem Problem (ich will keine fest definierte zahl 999 wie bei dir))
    Schnitzel: Dein Skript funktioniert bei mir leider auch nicht (Genau der gleiche Fehler wie bei mir)
    @ic2 : Deine Lösung versteh ich kann sie aber nicht richtig umsetzen

  • Und Schnitzels Lösung hätte auch funktioniert. Du hättest nur seine Notizen Umsetzen müssen. Denn er hat lediglich Hinweise gegeben, nichts geändert. Sein Weg der Lösung ist für deinen Fall eigentlich auch wirklich schöner :) Man muss nicht unbedingt ein Skript neu starten, nur um ein paar Variablen zurück zu setzen.

  • Schnitzel: Dein Skript funktioniert bei mir leider auch nicht (Genau der gleiche Fehler wie bei mir)


    Du solltest auch den Text lesen den ich geschrieben habe:

    Zitat

    Ich hab mal im Script ein paar Gedanken notiert. Da du was lernen willst ist das ganze zum selbermachen ;)

    i2c hat eine schnelle Lösung für dein Problem gepostet.
    RR04 hat dein Script überarbeitet und einiges angepasst. Eben auch das mit dem festen Zahlenbereich. Das zu ändern wären aber nur 2 Inputboxen.
    Ich hab nur in dein Script nur ein paar Kommentare eingefügt. Ansonsten hab ich da nichts verändert, weil man von nem fertigen Script nicht soviel lernt wie wenn man es selber macht.
    Wenn du nur die Zeile von i2c eingebaut hast dann gibts da noch einiges zu verbessern...