Frage an die Profis, einfaches Würfelspiel

  • Hallo leute,

    ich hatte heute mal wieder ein wenig Zeit und konnte mich AutoIT widmen.

    Mir kam im Kopf einfach mal ein kleines "Würfelspiel" zu schreiben indem der Spieler gegen den Computer würfelt.
    Ich habe Erstmal die Theorie fertiggestellt wie das ganze vom Code aussehen soll und habe auch gleich eine frage dazu.

    Es gibt ja tausend wege die zum Weg führen um ein Ergebnis zu erhalten, ein weg ist folgender:

    [autoit]

    Global $playerHuman
    Global $playerKI
    Global $Message
    ;--------------------------------------
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    _cube()
    EndSwitch
    WEnd
    ;##################Funktion Würfeln#########################
    Func _cube()
    $playerHuman = Round(Random(1,6))
    msgbox(0,"Ergebnis","Du hast die Zahl "&$playerHuman&" gewürfelt")
    $playerKI = Round(Random(1,6))
    If $playerHuman > $playerKI Then
    $Message = "Du hast gewonnen!"
    ElseIf $playerHuman < $playerKI Then
    $Message = "Der Computer hat gewonnen!"
    ElseIf $playerHuman = $playerKI Then
    $Message = "Unentschieden!"
    EndIf
    MsgBox(0,"Ergebnis","Der Computer hat die Zahl "&$playerKI&" gewürfelt. "&$Message)
    EndFunc

    [/autoit]

    Klappt soweit, aber ist der Code so Sinnvoll? Wie kann man ihn noch optimieren?

    Danke, ich freue mich über jede Antwort :)

  • Hallo!
    Wenn du jeden Ausdruck mit IF prüfst, brauchst du das ELSEIF nicht.

    [autoit]


    If $playerHuman > $playerKI Then $Message = "Du hast gewonnen!"
    If $playerHuman < $playerKI Then $Message = "Der Computer hat gewonnen!"
    If $playerHuman = $playerKI Then $Message = "Unentschieden!"

    [/autoit]
  • Wenn du jeden Ausdruck mit IF prüfst, brauchst du das ELSEIF nicht.

    Einzeilige If-Anweisungen machen alles extrem langsam.
    Ich würd das ganze so schreiben (liegt wohl an meinem Drang zur komplexität :S)

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    $aResult = _cube(2)
    Switch $aResult[0]
    Case 1
    $sMessage = "Du hast gewonnen!"
    Case 0
    $sMessage = "Unentschieden!"
    Case -1
    $sMessage = "Der Computer hat gewonnen!"
    EndSwitch
    msgbox(0,"Ergebnis","Du hast die Zahl "&$aResult[1]&" gewürfelt")
    MsgBox(0,"Ergebnis","Der Computer hat die Zahl "&$aResult[2]&" gewürfelt. "&$sMessage)

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

    Func _cube($iDice=1,$iSide=6)
    Local $sMessage, $iWin
    Local $iHuman = Random(1*$iDice,$iSide*$iDice,1)
    Local $iKI = Random(1*$iDice,$iSide*$iDice,1)
    Select
    Case $iHuman > $iKI
    $iWin = 1
    Case $iHuman < $iKI
    $iWin = -1
    Case Else
    $iWin = 0
    EndSelect
    Dim $aRet[3] = [$iWin,$iHuman,$iKI]
    Return $aRet
    EndFunc

    [/autoit]
  • Zitat

    Einzeilige If-Anweisungen machen alles extrem langsam.

    Bevor ich eine Switch und eine Select-Anweisung implementiere, ein Array dazu und reichlich Gehirnschmalz (hehe, denn das ist Voraussetzung), bleib ich bei meinen 3 Zeilen code 8o

  • Hi,

    aber im Prinzip ist mein Code annehmbar? (ein wenig komplexer ist mir lieber wenn ich ehrlich bin)

    SEuBo, dein Code ist sehr interessant... nur wann wird die deine Funktion aufgerufen und wann kommt es zum "Switch"?

    Danke euch :thumbup:

  • die komplette "Select"-Anweisung innerhalb der Funktion, also

    [autoit]

    Select
    Case $iHuman > $iKI
    $iWin = 1
    Case $iHuman < $iKI
    $iWin = -1
    Case Else
    $iWin = 0
    EndSelect

    [/autoit]

    kann man auch mit einer Zeile

    [autoit]

    $iwin=1-2*($iHuman < $iKI)-($iHuman = $iKI)

    [/autoit]

    ersetzen...


  • Wow, das ist sehr interessant! ich wusste garnicht, dass man das so schreiben kann. Schön dass ich jeden Tag was neues lernen kann ^^


    SEuBo, dein Code ist sehr interessant... nur wann wird die deine Funktion aufgerufen und wann kommt es zum "Switch"?

    Hier, noch ein bisschen verändert, und auskommentiert ;)

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    $aResult = _dice(2,5) ; Hier wird gewürfelt (2 Würfel je 5 Seiten). Das Ergebnis wird in ein Array geschrieben

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

    If $aResult[0] = 1 Then $sMessage = "Du hast gewonnen!" ; $aResult[0] sagt ob du gewonnen,
    If $aResult[0] = 0 Then $sMessage = "Unentschieden!"
    If $aResult[0] = -1 Then $sMessage = "Der Computer hat gewonnen!" ; oder verloren hast.

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

    MsgBox(0, "Ergebnis", "Du hast die Zahl " & $aResult[1] & " gewürfelt") ; $aResult[1] enthält dein Ergebnis
    MsgBox(0, "Ergebnis", "Der Computer hat die Zahl " & $aResult[2] & " gewürfelt. " & $sMessage) ; $aResult[2] enthählt das deines "Gegners"

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

    Func _dice($iDice = 1, $iSide = 6)
    If $iSide < 2 OR $iDice < 1 Then Return SetError(1,0,0)
    Local $sMessage, $iWin, $iHuman = Random(1 * $iDice, $iSide * $iDice, 1), $iKI = _
    Random(1 * $iDice, $iSide * $iDice, 1), $iWin = 1 - 2 * ($iHuman < $iKI) - ($iHuman = $iKI)
    Dim $aRet[3] = [$iWin, $iHuman, $iKI]
    Return $aRet
    EndFunc ;==>_cube

    [/autoit]
  • ich hab darüber auch erst nachdenken müssen :)

    [autoit]

    $iwin=1-2*($iHuman < $iKI)-($iHuman = $iKI)

    [/autoit]


    dann wird daraus bei der Annahme von:
    $iHuman = 0 und $iKI = 1

    [autoit]

    -1 = 1 - 2 * (True) - (False)
    -1 = 1 - 2 * (1) - (0)

    [/autoit]

    wobei True = 1 und False = 0
    Aber wenn man verstanden hat,
    dass AutoIt automatisch mit dem rechnet was es gerade brauchen kann True/1 False/0 dann
    kommt man auf solche Sachen.

    Wie gesagt mir war diese Denke auch neu.
    Vielleicht hilft es ja dem Einen oder Anderen zum besseren Verständnis.

    Danke an Andy für diese lehrreiche Erfahrung ;)

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)