• Der PC ermittelt eine zufällige Zahl zwischen 0 und 999, die von Dir mit so wenigen wie möglichen
    Versuchen, erraten werden soll. Als Hinweis bekommst Du eine Meldung, ob Deine Zahl kleiner, größer
    oder richtig geraten war.

    Hinweis:
    ZahlenRaten kommt ohne Includes aus und ist dennoch voll funktionfähig. Als Erweiterung könnte ich
    mir einen Button zum starten eines neuen Spiels, ein weiteres Level oder eine Datei in der die Punkte
    (Highscore) notiert werden gut vorstellen.

    Spoiler anzeigen
    [autoit]


    #region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Outfile=zahlenraten.exe
    #AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #AutoIt3Wrapper_UseUpx=n
    #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 $sTitle = "ZahlenRaten - Tut", $sDate = "15.09.2012", $sVersion = "0.4"
    Local $sMsgUpdate = $sTitle & '\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, $iptZahl, $lblOut, $lblOutMsg, $btnAbout
    Local $zfzhl, $zahl, $try = 0

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

    GUICreate($sTitle, 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("Hier eine Ganzzahl eingeben", 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 & $try, 10, 95, 230, 17, 0x001)
    GUICtrlSetFont(-1, 10, 400, 0, "Comic Sans MS")
    $btnAbout = GUICtrlCreateButton("&About", 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 $btnAbout
    If MsgBox(64 + 4, $sTitle & ' UpdateCheck', StringFormat($sMsgUpdate, $sVersion, $sDate)) = 6 Then ShellExecute("http://ritzelrocker04.bplaced.net/")
    Case $btnGo
    $try += 1
    $zahl = GUICtrlRead($iptZahl)
    ;~ ConsoleWrite("Die vom Nutzer eingegebene Zahl : " & $zahl & @CRLF)
    If ($zahl >= 0) And ($zahl <= 999) Then
    Switch $zfzhl
    Case $zfzhl < $zahl
    GUICtrlSetData($lblOut, "Die gesuchte Zahl ist kleiner.")
    GUICtrlSetData($lblOutMsg, "Anzahl der Versuche :" & @TAB & $try)
    Case $zfzhl > $zahl
    GUICtrlSetData($lblOut, "Die gesuchte Zahl ist groesser.")
    GUICtrlSetData($lblOutMsg, "Anzahl der Versuche :" & @TAB & $try)
    Case Else
    GUICtrlSetData($lblOut, "Super ! Du hast die Zahl geraten !")
    GUICtrlSetData($lblOutMsg, "Anzahl der Versuche :" & @TAB & $try)
    EndSwitch
    Else
    MsgBox(64, "Error", "Bitte eine Zahl zwischen 0 und 999 eingeben !")
    EndIf
    EndSwitch
    WEnd
    EndFunc ;==>_main
    ; Ende

    [/autoit]
  • "Damals" als ich mit Autoit begonnen hatte, hab ich das auch mal umgesetzt. :thumbup: Allerdings wurde mir das Raten irgendwann zu langweilig und ich hab das Script so umgeschrieben, dass der Computer gegen sich selbst spielt und versucht die Zahl mit möglichst wenigen Versuchen zu erraten... ^^
    Ansonsten: Schönen Script... ;)

    LG
    Christoph :)

  • Das geht aber kürzer.

    - 64 + 4 sind 68
    - Du musst keine Variablen deklarieren, wenn du es nicht musst
    - Du solltest die Variablen richtig benennen ($iZahl usw.)
    - Du solltest keine deutschen & englischen Bezeichnungen mischen ($zfzhl und $try wtf?)
    - Find the sence in Comic Sans!!! :D

    Spoiler anzeigen
    [autoit]

    Local $sMsgUpdate = '\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?', $iZufallsZahl=Random(0,1000,1)
    Local $iZufallsZahl, $iVersuche=0,$msg="Die gesuchte Zahl ist ",$msg2="Anzahl der Versuche: ",$wms="Super! Du hast die Zahl geraten!",$ot

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

    GUICreate("ZahlenRaten - Tut", 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("Hier eine Ganzzahl eingeben", 10, 35, 230, 20, 0x2000)
    $lblOut = GUICtrlCreateLabel("Hinweise.", 10, 65, 230, 17, 0x001)
    GUICtrlSetFont(-1, 10, 400, 0, "Comic Sans MS")
    $lblOutMsg = GUICtrlCreateLabel("Anzahl der Versuche: "&$iVersuche, 10, 95, 230, 17, 0x001)
    GUICtrlSetFont(-1, 10, 400, 0, "Comic Sans MS")
    $btnAbout = GUICtrlCreateButton("&About", 10, 125, 75, 22)
    $btnGo = GUICtrlCreateButton("&Start", 90, 125, 75, 22, 0x0001)
    $btnClose = GUICtrlCreateButton("&Beenden", 170, 125, 75, 22)
    GUISetState()

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

    While True
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3, $btnClose
    ExitLoop
    Case $btnAbout
    If MsgBox(68,'UpdateCheck',StringFormat($sMsgUpdate, "0.4", "15.09.2012"))=6 Then ShellExecute("http://ritzelrocker04.bplaced.net/")
    Case $btnGo
    $iVersuche += 1
    Local $c=($iZufallsZahl<GUICtrlRead($iptZahl)), $d=($iZufallsZahl==GUICtrlRead($iptZahl))
    If $d Then
    $out = $wms
    ElseIf $c Then
    $out = $msg & "kleiner."
    Else
    $out = $msg & "größer."
    EndIf
    GUICtrlSetData($lblOut, $out)
    GUICtrlSetData($lblOutMsg, $iVersuche)
    EndSwitch
    WEnd

    [/autoit]
  • Also ich persönlich würde jetzt die Funktion "_main" nur dann erstellen wenn sie auch mehrmals gebraucht wird im Skript oder übersichtshalber...wenn der ganze code aber nur aus einer simplen Abfolge von Befehlen besteht, scheint mir das ganze etwas unnötig.
    Das war auch mein erstes Programm das ich seinerzeit geschrieben habe 8) ich habs aber noch nie in unter 30 Versuchen geschaft, irgendwie mag mich dieses Skript einfach nicht ^^

    Bild1: Ich beim debuggen

  • Das mit dem _main() ist nun mal "C-AutoIt". :D
    In einigen Sprachen ist das ja nötig, allerdings in AutoIt nicht.
    Und deshalb ist das auch so sinnig wie das hier:

    [autoit]


    If ($a = $b) Then

    [/autoit]

    Das ist einfach das Vermischen von verschiedenen Sprachen. :)
    Sollte wenn möglich vermieden werden, ist aber leider auch hin und wieder in den Hilfe-Beispielen so, also mit "_main()".

    lg chess

    • Offizieller Beitrag

    - 64 + 4 sind 68
    - Du musst keine Variablen deklarieren, wenn du es nicht musst


    minx:
    Sorry, aber da sollte man anders herangehen.
    - 64 + 4 = 68 ---> dann weiß niemand mehr, wie sich der Style zusammensetzt, insofern durchaus sinnvoll
    - Das Deklarieren von Variablen ist immer guter Stil. So bequem es auch ist, dass AutoIt es nicht explizit fordert, so leicht verleitet es auch zur Schlamperei. Der beste Weg ist eigentlich mit Opt('MustDeclareVars', 1) zu arbeiten.

  • Die Strategie ist doch recht einfach. Immer das Intervall halbieren.

    0-1000, erster Tipp: 500 Zahl ist größer
    500-1000, zweiter Tipp 750 usw...

    Wüsste nicht wie man schneller zum Ziel kommt ^^

  • Da tischt sich mir die Frage auf was schneller ist.
    Das Intervall halbieren, oder zufällig eine Zahl im Intervall wählen.

    In Durchschnitt ist es natürlich sinnvoll das Intervall möglichst schnell klein zu kriegen.
    Wenn ich es immer halbiere habe ich 100% Chance auf eine Halbierung.
    Angenommen ich nehme die Zahl im ersten Drittel habe ich 33% chance auf Drittelung und 66% Chance auf Zweidrittelung.
    Wenn ich jetzt zufällig 5Mal richtig gut Tippe kann ich schon am Ziel sein, wenn man mit der 50% Methode noch bei einem riesen Intervall rumhängt.

    Das müsste man mal mathematisch auseinandernehmen.

    Edit:

    &quot;Übungsstunde für den Ternären Operator&quot; (3.3.9.5)
    [autoit]

    #AutoIt3Wrapper_Run_AU3Check = N ; -
    Global l=GUICtrlCreateLabel,f= _ ; -
    GUICtrlSetFont,b= GUISetState, _ ; -
    a=GUICreate('ZahlenRaten',250, _ ; -
    155),i=GUICtrlCreateInput,z=l( _ ; -
    'Rate die Zahl zwischen 1 un'& _ ; -
    'd 999',10,10,230,17,1),c='C'& _ ; -
    'omic Sans MS',z=f(-1,10,400,0 _ ; -
    ,c)+i('Hier eine Ganzzahl ei'& _ ; -
    'ngeben',10,35,230,20,8192)+l( _ ; -
    'Hinweise.',10,65,230,17,1)+f( _ ; -
    -1,10,400,0,c)+l('Anzahl der'& _ ; -
    ' Versuche: 0',10,95,230,17,1) _ ; -
    +f(-1, 10,400,0,c),r=Random(1, _ ; -
    999, 1),d=GUICtrlCreateButton, _ ; -
    z=d('&About',10,125,75,22)+ d( _ ; -
    '&Start',90,125,75,22,1)+d(''& _ ; -
    '&Beenden',170,125,75,22)+b(), _ ; -
    v=0,y=0,x=GUICtrlRead,i=Int,s= _ ; -
    GUICtrlSetData,m=GUIGetMsg,g=0 _ ; -
    ,h=Assign, j=MsgBox, q=GUICreate ; -
    While Not Not (Not(g=-3 Or g=9)) ; -
    z=0*h('g',m())+(g=7)?j(64,'Z'& _ ; -
    'ahlenRaten','Es muss mit mö'& _ ; -
    'glichst wenigen Versuchen e'& _ ; -
    'ine Zufallszahl erraten wer'& _ ; -
    'den. Wie du das anstellst i'& _ ; -
    'st Dir überlassen.'):(g=8)?h( _ ; -
    'y',(1<=x(4)And x(4) <=999)?h( _ ; -
    'v',v+1)+s(6,'Anzahl der Ver'& _ ; -
    'suche: '&v)+(x(4)=r)?s(5,'S'& _ ; -
    'uper ! Du hast die Zahl ger'& _ ; -
    'aten !'):(x(4)<r)?s(5,'Die '& _ ; -
    'gesuchte Zahl ist größer.'):s _ ; -
    (5,'Die gesuchte Zahl ist kl'& _ ; -
    'einer.'):0):0 ; -------------------
    WEnd ; -----------------------------

    [/autoit]
  • Es hängt doch alles von der Wahrscheinlichkeit ab. Es kann ja gut sein das ich beim ersten Versuch die richtige Zahl treffe. Wenn ich das Intervall benutze minimiere ich die Anzhal der Möglichkeiten somit steigt meine Wahrscheinlichkeit die Zahl zu treffen. Deswegen ist es wohl die beste Möglichekeit.

    :thumbup:

  • Nicht du :D.

    Mars hat ein Skript gepostet, welches nur mit der neuen Beta funktioniert. Sprich einen anderen Syntax hat. Den tenären Operator muss man bei der letzten Stable mit _IIF aufrufen ;)

  • Soweit ich weiß funktioniert _Iif nur sehr bedingt, da beide Ausdrücke ausgeführt werden anstelle von einem. (da die Ausdrücke als Parameter angesehen werden und der Wert damit zum Zeitpunkt der Entscheidung für beide Möglichkeiten schon fest stehen muss. Kann mich auch irren...)
    Ob sich das jetzt auf das Skript auswirkt weiß ich nicht.
    Hab vergessen dranzuschreiben, dass es nur mit der 3.3.9.5 Beta getestet wurde.
    Die erste Zeile verrät es eigentlich schon. Normal arbeite ich sehr sauber. Da würde ich niemals den Au3Check abschalten ;)

  • War ja nur ein Vorschlag, wie man diese Schreibweise jetzt schon (wenn natürlich mit Einschränkungen) benutzen kann. Allerdings würde ich auch gern mal ein Update für die Au3Check sehen, aber das ist wohl eher Fleißarbeit als "innovation" :D

  • In meiner Umgebung sagt man "du hast die zahl erraten" und nicht "geraten"

    Edit BugFix:
    Das ist ja mal sinnfrei. Stell dir vor jetzt postet hier jeder, wie es in seiner Region heißt ( z.B. "da hasse Rech", "Bingo", etc. pp). Mehr an OT geht ja wohl kaum. :evil:

    Einmal editiert, zuletzt von BugFix (20. Oktober 2012 um 10:07)