Spiel - Snake

  • So Leute,

    es ist wieder einmal soweit, dass ich eure Hilfe benötige. Undzwar hatte ich mir zu Übungszwecken überlegt, das berühmte "HandyGame" Snake nachzubauen.
    Leider habe ich noch nen Problem mit der Schlange. Aber bevor wir dazu kommen, erst einmal der Code (Bilder etc. sind angehängt).

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.0.0
    Author: myName

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

    Script Function:
    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    ; Script Start - Add your code below here

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

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Misc.au3>

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

    HotKeySet("{right}","_rechts")
    HotKeySet("{left}","_links")
    HotKeySet("{up}","_oben")
    HotKeySet("{down}","_unten")
    HotKeySet("{esc}","_exit")

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

    Global $pacX = 45, $pacY = 45, $pressed, $finish = False, $rX, $rY

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

    $dll = DllOpen("user32.dll")

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

    $hGui = GUICreate("",@DesktopWidth,@DesktopHeight,"","",$WS_POPUP)
    GUICtrlSetColor(-1,0xFFFFFF)
    GUISetBkColor(0x000000)
    _Orahmen()
    _Urahmen()
    _Lrahmen()
    _Rrahmen()
    $hPac = GUICtrlCreatePic(@ScriptDir & "\pac_right.jpg",$pacX,$pacY,36,36)
    $rX = Random(44,@DesktopWidth -44 -36,1)
    $rY = Random(44,@DesktopHeight -44 -36,1)
    $lol = GUICtrlCreatePic(@ScriptDir & "\punkt.jpg",$rX,$rY,20,20)
    GUISetState()

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

    ;~ AdlibEnable("_futter", 100)

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

    While 1
    Sleep (100)
    _delete()
    WEnd

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

    Func _rechts()
    Local $hR, $a = "lol"
    GUICtrlDelete($hPac)
    $hR = GUICtrlCreatePic(@ScriptDir & "\pac_right.jpg",$pacX,$pacY,36,36)
    While 1
    _delete()
    If $pacX +1 >= @DesktopWidth - 44 -36 Then
    Sleep(10)
    Else
    For $i = 1 To 36
    _delete()
    $finish = False
    If $pacX +1 >= @DesktopWidth - 44 -36 Then
    $finish = True
    ExitLoop
    EndIf
    $pacX += 2
    GUICtrlSetPos($hR,$pacX,$pacY)
    Sleep(10)
    $pressed = @HotKeyPressed
    Next
    $finish = True
    $a &= "lol"
    EndIf
    WEnd
    $finish = False
    EndFunc

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

    Func _links()
    GUICtrlDelete($hPac)
    $hR = GUICtrlCreatePic(@ScriptDir & "\pac_left.jpg",$pacX,$pacY,36,36)
    Do
    _delete()
    If $pacX -1 <= 44 Then
    Sleep(10)
    Else
    For $i = 1 To 36
    _delete()
    $finish = False
    If $pacX -1 <= 44 Then
    $finish = True
    ExitLoop
    EndIf
    $pacX -= 2
    GUICtrlSetPos($hR,$pacX,$pacY)
    Sleep(10)
    $pressed = @HotKeyPressed
    Next
    $finish = True
    EndIf
    Until $pressed <> "{left}" And $finish = True
    $finish = False
    EndFunc

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

    Func _oben()
    GUICtrlDelete($hPac)
    $hR = GUICtrlCreatePic(@ScriptDir & "\pac_up.jpg",$pacX,$pacY,36,36)
    Do
    _delete()
    If $pacY -1 <= 44 Then
    Sleep(10)
    Else
    For $i = 1 To 36
    _delete()
    $finish = False
    If $pacY -1 <= 44 Then
    $finish = True
    ExitLoop
    EndIf
    $pacY -= 2
    GUICtrlSetPos($hR,$pacX,$pacY)
    Sleep(10)
    $pressed = @HotKeyPressed
    Next
    $finish = True
    EndIf
    Until $pressed <> "{up}" And $finish = True
    $finish = False
    EndFunc

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

    Func _unten()
    GUICtrlDelete($hPac)
    $hR = GUICtrlCreatePic(@ScriptDir & "\pac_down.jpg",$pacX,$pacY,36,36)
    Do
    _delete()
    If $pacY +1 >= @DesktopHeight -44 -36 Then
    Sleep(10)
    Else
    For $i = 1 To 36
    _delete()
    $finish = False
    If $pacY +1 >= @DesktopHeight -44 -36 Then
    $finish = True
    ExitLoop
    EndIf
    $pacY += 2
    GUICtrlSetPos($hR,$pacX,$pacY)
    Sleep(10)
    $pressed = @HotKeyPressed
    Next
    $finish = True
    EndIf
    Until $pressed <> "{down}" And $finish = True
    EndFunc

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

    Func _Orahmen()
    Local $x = 9, $y = 9
    For $i = 1 To 35
    GuiCtrlCreatePic(@ScriptDir & "\blau.jpg",$x,$y,36,36)
    $x += 36
    Next
    EndFunc

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

    Func _Urahmen()
    Local $x = 9, $y = @DesktopHeight - 43
    For $i = 1 To 35
    GuiCtrlCreatePic(@ScriptDir & "\blau.jpg",$x,$y,36,36)
    $x += 36
    Next
    EndFunc

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

    Func _Lrahmen()
    Local $x = 9, $y = 9
    For $i = 1 To 28
    GuiCtrlCreatePic(@ScriptDir & "\blau.jpg",$x,$y,36,36)
    $y += 36
    Next
    EndFunc

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

    Func _Rrahmen()
    Local $x = @DesktopWidth - 44, $y = 9
    For $i = 1 To 28
    GuiCtrlCreatePic(@ScriptDir & "\blau.jpg",$x,$y,36,36)
    $y += 36
    Next
    EndFunc

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

    Func _exit()
    Exit
    EndFunc

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

    Func _delete()
    For $i = 0 To 20
    If $pacX + $i = $rX Or $pacX - $i = $rX Then
    For $i = 0 To 20
    If $pacY + $i = $rY Or $pacY -$i = $rY Then
    GUICtrlDelete($lol)
    $rX = Random(44,@DesktopWidth -44 -36,1)
    $rY = Random(44,@DesktopHeight -44 -36,1)
    $lol = GUICtrlCreatePic(@ScriptDir & "\punkt.jpg",$rX,$rY,20,20)
    EndIf
    Next
    EndIf
    Next
    For $i = 0 To 20
    If $pacY + $i = $rY Or $pacY -$i = $rY Then
    For $i = 0 To 20
    If $pacX +$i = $rX Or $pacX -$i = $rX Then
    GUICtrlDelete($lol)
    $rX = Random(44,@DesktopWidth -44 -36,1)
    $rY = Random(44,@DesktopHeight -44 -36,1)
    $lol = GUICtrlCreatePic(@ScriptDir & "\punkt.jpg",$rX,$rY,20,20)
    EndIf
    Next
    EndIf
    Next
    EndFunc

    [/autoit]

    Also, Problem ist, wenn man einen Punkt "Frisst", sollte die Schlange etwas größer werden. An sich kein Problem, jedoch ist das Problem dann, dass sich diese dann auch Snakegerecht hinterherschlängeln und sie bei Berührung mit dem Kopf der Schlange zur Niederlage führen.

    Ich hoffe ihr habt mich verstanden und könnte mir hierbei weiterhelfen. Danke

    Mfg SiLenCa

    Edit: Also der Code ist etwas unsauber usw. z.B. dllOpen ist aus versuchszwecken mit _IsPressed entstande gekommen und habs vergessen rauszunehmen sry ;)

    Edit2: Habe die Funktion _delete() ein wenig angepasst. (Die ist dafür da, zu fressen ^^)

    Spoiler anzeigen
    [autoit]

    Func _delete()
    Local $b = 0
    For $i = 0 To 36
    If $b <= 20 Then
    $b += 1
    Else
    $b = 0
    EndIf
    If $pacX + $i = $rX Or $pacX = $rX + $b Then
    Local $b = 0
    For $i = 0 To 36
    If $b <= 20 Then
    $b += 1
    Else
    $b = 0
    EndIf
    If $pacY + $i = $rY Or $pacY = $rY + $b Then
    Local $b = 0
    GUICtrlDelete($lol)
    $rX = Random(44,@DesktopWidth -44 -36,1)
    $rY = Random(44,@DesktopHeight -44 -36,1)
    $lol = GUICtrlCreatePic(@ScriptDir & "\punkt.jpg",$rX,$rY,20,20)
    EndIf
    Next
    EndIf
    Next
    Local $b = 0
    For $i = 0 To 36
    If $b <= 20 Then
    $b += 1
    Else
    $b = 0
    EndIf
    If $pacY + $i = $rY Or $pacY = $rY + $b Then
    Local $b = 0
    For $i = 0 To 36
    Local $b = 0
    If $b <= 20 Then
    $b += 1
    Else
    $b = 0
    EndIf
    If $pacX +$i = $rX Or $pacX = $rX + $b Then
    Local $b = 0
    GUICtrlDelete($lol)
    $rX = Random(44,@DesktopWidth -44 -36,1)
    $rY = Random(44,@DesktopHeight -44 -36,1)
    $lol = GUICtrlCreatePic(@ScriptDir & "\punkt.jpg",$rX,$rY,20,20)
    EndIf
    Next
    EndIf
    Next
    EndFunc

    [/autoit]
    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.0.0
    Author: myName

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

    Script Function:
    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    ; Script Start - Add your code below here

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

    #include <WindowsConstants.au3>

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

    HotKeySet("{right}","_rechts")
    HotKeySet("{left}","_links")
    HotKeySet("{up}","_oben")
    HotKeySet("{down}","_unten")
    HotKeySet("{esc}","_exit")

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

    Global $pacX = 45, $pacY = 45, $pressed, $finish = False, $rX, $rY

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

    $dll = DllOpen("user32.dll")

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

    $hGui = GUICreate("",@DesktopWidth,@DesktopHeight,"","",$WS_POPUP)
    GUICtrlSetColor(-1,0xFFFFFF)
    ;~ GUISetBkColor(0x000000)
    _Orahmen()
    _Urahmen()
    _Lrahmen()
    _Rrahmen()
    $hPac = GUICtrlCreatePic(@ScriptDir & "\pac_right.jpg",$pacX,$pacY,36,36)
    $rX = Random(44,@DesktopWidth -44 -36,1)
    $rY = Random(44,@DesktopHeight -44 -36,1)
    $lol = GUICtrlCreatePic(@ScriptDir & "\punkt.jpg",$rX,$rY,20,20)
    GUISetState()

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

    ;~ AdlibEnable("_futter", 100)

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

    While 1
    Sleep (100)
    _delete()
    WEnd

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

    Func _rechts()
    Local $hR, $a = "lol"
    GUICtrlDelete($hPac)
    $hR = GUICtrlCreatePic(@ScriptDir & "\pac_right.jpg",$pacX,$pacY,36,36)
    While 1
    _delete()
    If $pacX +1 >= @DesktopWidth - 44 -36 Then
    Sleep(10)
    Else
    For $i = 1 To 36
    _delete()
    $finish = False
    If $pacX +1 >= @DesktopWidth - 44 -36 Then
    $finish = True
    ExitLoop
    EndIf
    $pacX += 2
    GUICtrlSetPos($hR,$pacX,$pacY)
    Sleep(10)
    $pressed = @HotKeyPressed
    Next
    $finish = True
    $a &= "lol"
    EndIf
    WEnd
    $finish = False
    EndFunc

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

    Func _links()
    GUICtrlDelete($hPac)
    $hR = GUICtrlCreatePic(@ScriptDir & "\pac_left.jpg",$pacX,$pacY,36,36)
    Do
    _delete()
    If $pacX -1 <= 44 Then
    Sleep(10)
    Else
    For $i = 1 To 36
    _delete()
    $finish = False
    If $pacX -1 <= 44 Then
    $finish = True
    ExitLoop
    EndIf
    $pacX -= 2
    GUICtrlSetPos($hR,$pacX,$pacY)
    Sleep(10)
    $pressed = @HotKeyPressed
    Next
    $finish = True
    EndIf
    Until $pressed <> "{left}" And $finish = True
    $finish = False
    EndFunc

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

    Func _oben()
    GUICtrlDelete($hPac)
    $hR = GUICtrlCreatePic(@ScriptDir & "\pac_up.jpg",$pacX,$pacY,36,36)
    Do
    _delete()
    If $pacY -1 <= 44 Then
    Sleep(10)
    Else
    For $i = 1 To 36
    _delete()
    $finish = False
    If $pacY -1 <= 44 Then
    $finish = True
    ExitLoop
    EndIf
    $pacY -= 2
    GUICtrlSetPos($hR,$pacX,$pacY)
    Sleep(10)
    $pressed = @HotKeyPressed
    Next
    $finish = True
    EndIf
    Until $pressed <> "{up}" And $finish = True
    $finish = False
    EndFunc

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

    Func _unten()
    GUICtrlDelete($hPac)
    $hR = GUICtrlCreatePic(@ScriptDir & "\pac_down.jpg",$pacX,$pacY,36,36)
    Do
    _delete()
    If $pacY +1 >= @DesktopHeight -44 -36 Then
    Sleep(10)
    Else
    For $i = 1 To 36
    _delete()
    $finish = False
    If $pacY +1 >= @DesktopHeight -44 -36 Then
    $finish = True
    ExitLoop
    EndIf
    $pacY += 2
    GUICtrlSetPos($hR,$pacX,$pacY)
    Sleep(10)
    $pressed = @HotKeyPressed
    Next
    $finish = True
    EndIf
    Until $pressed <> "{down}" And $finish = True
    EndFunc

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

    Func _Orahmen()
    Local $x = 9, $y = 9
    For $i = 1 To 35
    GuiCtrlCreatePic(@ScriptDir & "\blau.jpg",$x,$y,36,36)
    $x += 36
    Next
    EndFunc

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

    Func _Urahmen()
    Local $x = 9, $y = @DesktopHeight - 43
    For $i = 1 To 35
    GuiCtrlCreatePic(@ScriptDir & "\blau.jpg",$x,$y,36,36)
    $x += 36
    Next
    EndFunc

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

    Func _Lrahmen()
    Local $x = 9, $y = 9
    For $i = 1 To 28
    GuiCtrlCreatePic(@ScriptDir & "\blau.jpg",$x,$y,36,36)
    $y += 36
    Next
    EndFunc

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

    Func _Rrahmen()
    Local $x = @DesktopWidth - 44, $y = 9
    For $i = 1 To 28
    GuiCtrlCreatePic(@ScriptDir & "\blau.jpg",$x,$y,36,36)
    $y += 36
    Next
    EndFunc

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

    Func _exit()
    Exit
    EndFunc

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

    Func _delete()
    Local $b = 0
    For $i = 0 To 36
    If $b <= 20 Then
    $b += 1
    Else
    $b = 0
    EndIf
    If $pacX + $i = $rX Or $pacX = $rX + $b Then
    Local $b = 0
    For $i = 0 To 36
    If $b <= 20 Then
    $b += 1
    Else
    $b = 0
    EndIf
    If $pacY + $i = $rY Or $pacY = $rY + $b Then
    Local $b = 0
    GUICtrlDelete($lol)
    $rX = Random(44,@DesktopWidth -44 -36,1)
    $rY = Random(44,@DesktopHeight -44 -36,1)
    $lol = GUICtrlCreatePic(@ScriptDir & "\punkt.jpg",$rX,$rY,20,20)
    EndIf
    Next
    EndIf
    Next
    Local $b = 0
    For $i = 0 To 36
    If $b <= 20 Then
    $b += 1
    Else
    $b = 0
    EndIf
    If $pacY + $i = $rY Or $pacY = $rY + $b Then
    Local $b = 0
    For $i = 0 To 36
    Local $b = 0
    If $b <= 20 Then
    $b += 1
    Else
    $b = 0
    EndIf
    If $pacX +$i = $rX Or $pacX = $rX + $b Then
    Local $b = 0
    GUICtrlDelete($lol)
    $rX = Random(44,@DesktopWidth -44 -36,1)
    $rY = Random(44,@DesktopHeight -44 -36,1)
    $lol = GUICtrlCreatePic(@ScriptDir & "\punkt.jpg",$rX,$rY,20,20)
    EndIf
    Next
    EndIf
    Next
    EndFunc

    [/autoit]

    Falls jemand eine bessere Idee hat, diese Funktion zu schreiben, wäre ich sehr dankbar ^^

    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    3 Mal editiert, zuletzt von SiLenCa (17. Mai 2009 um 23:53)

  • Keiner auch nur nen kleinen Ansatz als Hilfe für mich ? Würde mich echt freuen, denn mir fällt überhaupt nix ein.

    Danke

    MfG SiLenCa

  • ÄÄÄh, das ist Pacman ohne Mauern und Geister!
    Aber witzig!

    MfG. tobi_girst

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »tobi_girst« (Morgen, 25:63)

  • Hmm... eigentlich sollte es zuerst Pacman werden. Jedoch scheiterte der versuch, deshalb hatte ich überlegt Snake zu bauen. Das scheint jedoch auch zu scheitern ^^

    Hatte mir mal hier ausm Forum anderes Snake mal angeschaut, jedoch blicke ich da auch nicht so ganz durch. Vielleicht hat ja trotzdem wer von euch eine Idee wie man das verwirklichen kann, ansonsten breche ich diesen Versuch ab.

  • Also wenn ich mich nicht irre dann gilt folgendes für die "Schlangen-Teile":

    Der Schlangenkopf gibt die Richtung an (oben,unten,....).
    Anschließend bekommt jedes n-te Schlangenteil, die Koordinaten vom (n-1) Schlangenteil.

  • An sich simpel, jedoch woher weiss jedes schlangenteil ob die koordinate x,y, oben, unten, rechts, links ist ? xD