kleine Snake Version

  • Hallo,

    um mal wieder rein zu kommen in das AutoIT Scripting habe ich eine kleine Snake Version gebastelt.
    Keinerlei Inhalte sind irgendwo kopiert worden und ich habe das selbst geschrieben.
    Im Kopf hatte ich dabei ein schlichtes Snake Spiel ala 5110 Handy Zeiten. Zuerst nahm ich kleine Bildchen aber mit den farbigen Labels geht es erstmal soweit das man keine Dateien mitgeben muss.

    -Die Schlange wird nach jedem Fressen ein Stückchen schneller.
    -Es geht auch um Zeit das heißt mehr Konkurrenzkampf und Spaß wer schneller mehr einsammelt.
    (Pfeiltasten gedrückt halten dann beschleunigt sich die Schlange auf maximales Tempo)
    -Beschleunigt man die Schlange entstehen Durchgänge durch die Schlange selbst. Zuerst dachte ich das es blöd ist doch ich finde es mittlerweile spannender.
    -das maximale Tempo wird umso mehr man sammelt später erreicht.
    -Es gibt Effektivitätspunkte (Formel aus Zeit und gesammelten Futter)
    -Es gibt Gesamtpunkte
    ACHTUNG: Die beiden Punktearten sinken mit der Zeit wenn man nichts einsammelt.
    -sonst normaler Rand und das Spiel ist auch zu Ende wenn man in ein Schlangenteil reinläuft.

    Verbesserungsvorschläge:
    -Mit der Steuerung bin ich noch nicht 100% zufrieden.(jemand Vorschläge?)
    -den letzten Teil der Schlange an die Stelle des zweiten Teils moven um so das moven aller Schlangenteile zu vermeiden. (Hoffe so das flackern wegzubekommen)
    -Die Teile mit einem Rand ausrüsten und den Rand in korrekter Richtung ausrichten. (Dann erkennt man den Verlauf der Schlange besser)
    -Habe noch andere Varianten im Kopf wie: Schlangenteile hängen sich nicht an die Schlange sondern bleiben an den Stellen an dem man das Futter gesammelt hat.
    Oder Mit einem kleiner werdenden Rand nach X gesammelten. Auch normale Variante nur mit Hindernissen.

    Ist ein FunProjekt daher stelle ich euch den Code zur Verfügung und jeder kann dann daraus sein Snakespiel fertigstellen. Es gibt zwar schon ähnliches doch habe ich die anderen Dinge nicht genau betrachtet daher kann ich nicht sagen was es da alles gibt.

    Beispielbild:
    [Blockierte Grafik: http://prntscr.com/5syomm]http://prntscr.com/5syomm


    [autoit]

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

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

    Opt("GUIOnEventMode", 1)

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

    $Form_Snaky = GUICreate("Snaky 1.0", 643, 526, 248, 171)
    GUISetOnEvent($GUI_EVENT_CLOSE, "__Function_Exit")
    $Main_Menu_Item = GUICtrlCreateMenu("Main")
    $Main_Menu_New_Game = GUICtrlCreateMenuItem("New Game", $Main_Menu_Item)
    GUICtrlSetOnEvent($Main_Menu_New_Game, "__Function_New_Game")
    $Main_Menu_Pause = GUICtrlCreateMenuItem("Pause", $Main_Menu_Item)
    GUICtrlSetOnEvent($Main_Menu_Pause, "__Function_Pause_Game")
    GUISetBkColor(0x000000)
    $Back_Pic = GUICtrlCreateLabel("",20, 20, 600, 440)
    GUICtrlSetBkColor($Back_Pic,0xFFFFFF)
    GUICtrlSetState($Back_Pic, $GUI_DISABLE)
    $Pic_Food = GUICtrlCreateLabel("",200, 200, 20, 20)
    GUICtrlSetBkColor($Pic_Food,0xFF0000)

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

    $Price_Points = GUICtrlCreateLabel("Punkte:",20, 470, 70, 20)
    $Price_Time = GUICtrlCreateLabel("Zeit:",100, 470, 130, 20)
    $Price_Effecty = GUICtrlCreateLabel("Effekty:", 230, 470, 150, 20)
    $Price_All = GUICtrlCreateLabel("Total:",370, 470,150, 20)
    $Price_Speed_LvL = GUICtrlCreateLabel("LvL:",530, 470,60, 20)
    Local $Price_Label = [$Price_Points,$Price_Time,$Price_Effecty,$Price_All,$Price_Speed_LvL]
    For $i = 0 To UBound($Price_Label) -1
    GUICtrlSetColor($Price_Label[$i],0xFFFFFF)
    Next

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

    Local $Pic_Snake[160]
    For $i = 1 To 160 -1
    $Pic_Snake[$i] = GUICtrlCreateLabel(" <>",300, 220, 20, 20)
    GUICtrlSetBkColor($Pic_Snake[$i],0x228B22)
    If $i > 1 Then
    GUICtrlSetState($Pic_Snake[$i],$GUI_HIDE)
    EndIf
    Next

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

    GUISetState(@SW_SHOW)

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

    Local $hDLL = DllOpen("user32.dll"), $Last_Pressed = 0,$Food_Counter = 0,$Match_Time = 0,$Your_Time = 0,$Pause_Game = 0, $Level_Speed = TimerInit()
    Local $Snake_Pos[161][2]
    __Function_Move_Food()

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

    While 1
    Sleep(20)
    For $i = 1 To 160 -1
    $xS = ControlGetPos($Form_Snaky,"",$Pic_Snake[$i])
    $Snake_Pos[$i][0] = $xS[0]
    $Snake_Pos[$i][1] = $xS[1]
    If $Snake_Pos[1][0] = $Snake_Pos[$i+1][0] And $Snake_Pos[1][1] = $Snake_Pos[$i+1][1] And $i < $Food_Counter Then
    __Function_Lost_Game()
    EndIf
    Next
    If $Last_Pressed = 0 Or $Pause_Game = 1 Then
    $Match_Time = TimerInit()
    Sleep(50)
    Else
    If TimerDiff($Level_Speed) > 100-$Food_Counter*0.500 Then
    __Function_Live_Stats()
    __Function_Move_Snake()
    $Level_Speed = TimerInit()
    If $Snake_Pos[1][0] < 20 Or $Snake_Pos[1][0] > 600 Or $Snake_Pos[1][1] < 20 Or $Snake_Pos[1][1] > 440 Then
    __Function_Lost_Game()
    EndIf
    EndIf

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

    EndIf
    If $Pause_Game = 0 Then
    __Button_Pressing()
    EndIf
    __Check_Food_Catch()
    WEnd

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

    Func __Function_Live_stats()
    GUICtrlSetData($Price_Label[0],"Points: " & $Food_Counter)
    GUICtrlSetData($Price_Label[1],"Time: " & StringLeft(__Calculate_Live_Time(),10))
    GUICtrlSetData($Price_Label[2],"Effekty: " & StringLeft((($Food_Counter/$Your_Time)*$Food_Counter),10))
    GUICtrlSetData($Price_Label[3],"Total: " & StringLeft((($Food_Counter*$Food_Counter)/($Your_Time-$Food_Counter))*$Food_Counter,10))
    GUICtrlSetData($Price_Label[4],"LvL: " & $Food_Counter*0.500/10)
    EndFunc

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

    Func __Calculate_Live_Time()
    $Your_Time = TimerDiff($Match_Time)/1000
    If StringInStr($Your_Time,".") Then
    $Temp = StringSplit($Your_Time,".")
    $Your_Time = $Temp[1]
    EndIf
    If $Your_Time < 60 Then
    Return $Your_Time & " Sek. "
    ElseIf $Your_Time >= 60 And $Your_Time <= 3600 Then
    Return $Your_Time/60 & " Min. "
    ElseIf $Your_Time >= 3600 Then
    Return $Your_Time/60/60 & " Std. "
    EndIf
    EndFunc

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

    Func __Function_Lost_Game()
    MsgBox(0,"Its not your Day!","Du hast: " & $Food_Counter & " Punkte in " & __Calculate_Live_Time() & "erspielt." & @CR & "Effektivität: " & ($Food_Counter/$Your_Time)*$Food_Counter & @CR & "Gesamtpunktzahl: " & (($Food_Counter*$Food_Counter)/($Your_Time-$Food_Counter))*$Food_Counter)
    __Function_New_Game()
    EndFunc

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

    Func __Check_Food_Catch()
    $Food_Pos = ControlGetPos($Form_Snaky,"",$Pic_Food)
    If $Snake_Pos[1][0] = $Food_Pos[0] And $Snake_Pos[1][1] = $Food_Pos[1] Then
    If $Food_Counter < 160 Then
    $Food_Counter += 1
    ControlShow($Form_Snaky,"",$Pic_Snake[$Food_Counter+1])
    __Function_Move_Food()
    ElseIf $Food_Counter >= 158 Then
    MsgBox(0,"Lucky Winner","Today is your Day!")
    EndIf
    EndIf
    EndFunc

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

    Func __Button_Pressing()
    Sleep(20)
    If $Food_Counter > 0 Then
    If _IsPressed("25",$hDLL) And $Last_Pressed <> 3 Then
    __Function_Move(1)
    ElseIf _IsPressed("26",$hDLL) And $Last_Pressed <> 4 Then
    __Function_Move(2)
    ElseIf _IsPressed("27",$hDLL) And $Last_Pressed <> 1 Then
    __Function_Move(3)
    ElseIf _IsPressed("28",$hDLL) And $Last_Pressed <> 2 Then
    __Function_Move(4)
    EndIf
    Else
    If _IsPressed("25",$hDLL) Then
    __Function_Move(1)
    ElseIf _IsPressed("26",$hDLL) Then
    __Function_Move(2)
    ElseIf _IsPressed("27",$hDLL) Then
    __Function_Move(3)
    ElseIf _IsPressed("28",$hDLL) Then
    __Function_Move(4)
    EndIf
    EndIf
    EndFunc

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

    Func __Function_Move($a)
    If $a = 1 Then
    If $Snake_Pos[1][0] > 20 Then
    ControlMove($Form_Snaky,"",$Pic_Snake[1],$Snake_Pos[1][0]-20,$Snake_Pos[1][1],20,20)
    EndIf
    ElseIf $a = 2 Then
    If $Snake_Pos[1][1] > 20 Then
    ControlMove($Form_Snaky,"",$Pic_Snake[1],$Snake_Pos[1][0],$Snake_Pos[1][1]-20,20,20)
    EndIf
    ElseIf $a = 3 Then
    If $Snake_Pos[1][0] < 600 Then
    ControlMove($Form_Snaky,"",$Pic_Snake[1],$Snake_Pos[1][0]+20,$Snake_Pos[1][1],20,20)
    EndIf
    ElseIf $a = 4 Then
    If $Snake_Pos[1][1] < 440 Then
    ControlMove($Form_Snaky,"",$Pic_Snake[1],$Snake_Pos[1][0],$Snake_Pos[1][1]+20,20,20)
    EndIf
    EndIf
    $Last_Pressed = $a
    EndFunc

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

    Func __Function_New_Game()
    $Last_Pressed = 0
    For $i = 2 To 160 -1
    ControlHide($Form_Snaky,"",$Pic_Snake[$i])
    Next
    $Food_Counter = 0
    __Function_Move_Food()
    ControlMove($Form_Snaky,"",$Pic_Snake[1],300,220,20,20)
    EndFunc

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

    Func __Function_Pause_Game()
    If $Pause_Game = 1 Then
    $Pause_Game = 0
    ElseIf $Pause_Game = 0 Then
    $Pause_Game = 1
    EndIf
    EndFunc

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

    Func __Function_Move_Snake()
    If $Last_Pressed = 1 Then
    ControlMove($Form_Snaky,"",$Pic_Snake[1],$Snake_Pos[1][0]-20,$Snake_Pos[1][1],20,20)
    ElseIf $Last_Pressed = 2 Then
    ControlMove($Form_Snaky,"",$Pic_Snake[1],$Snake_Pos[1][0],$Snake_Pos[1][1]-20,20,20)
    ElseIf $Last_Pressed = 3 Then
    ControlMove($Form_Snaky,"",$Pic_Snake[1],$Snake_Pos[1][0]+20,$Snake_Pos[1][1],20,20)
    ElseIf $Last_Pressed = 4 Then
    ControlMove($Form_Snaky,"",$Pic_Snake[1],$Snake_Pos[1][0],$Snake_Pos[1][1]+20,20,20)
    EndIf
    For $i = 2 To 160 -1
    ControlMove($Form_Snaky,"",$Pic_Snake[$i],$Snake_Pos[$i-1][0],$Snake_Pos[$i-1][1],20,20)
    If $i > $Food_Counter And $Food_Counter > 0 Then
    ExitLoop
    EndIf
    Next
    EndFunc

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

    Func __Function_Move_Food()
    Local $xF,$yF,$Temp=0
    GUICtrlSetState($Pic_Food,$GUI_HIDE)
    Do
    $Temp=0
    Do
    $xF = Random(20,600,1)
    Until Mod($xF,20) = 0
    Do
    $yF = Random(20,440,1)
    Until Mod($yF,20) = 0
    For $i = 1 To 160 -1
    If $Snake_Pos[$i][0] = $xF And $Snake_Pos[$i][1] = $yF Then
    $Temp = 1
    EndIf
    Next
    Until $Temp = 0
    ControlMove($Form_Snaky,"",$Pic_Food,$xF,$yF,20,20)
    GUICtrlSetBkColor($Pic_Food,0xFF0000)
    GUICtrlSetState($Pic_Food,$GUI_SHOW)
    EndFunc

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

    Func __Function_Exit()
    Exit
    EndFunc

    [/autoit]

    Kritik bitte nur mit Verbesserungsvorschlag, sonstiges Feedback gerne.

  • Ich sag mal so, interessante Umsetzung. :D

    Generell eignen sich Labels (oder andere Controls) nicht unbedingt für grafische Ausgaben. Nimm dafür doch lieber eine Bibliothek wie GDI/GDI+, Direct2D oder meinetwegen einfach das Graphic Control in AutoIt. Ansonsten hier mal meine Verbesserungsvorschläge.

    > Generell finde ich diese Steuerung (mit dem Turbo) nicht wirklich sehr gut. Wenn man kurz die Richtung ändern will, so wird schon der Turbo aktiviert. Sehr unvorteilhaft... Aktiviere den Turbo lieber nach einer bestimmten Zeit (wenn die Pfeiltaste noch gedrückt ist).

    > Wenn ich mich in deinem Code nicht verlesen habe, dann bewegst du doch alle Teile der Schlange. Wie wäre es, wenn du einfach das letzte Schlangenteil nach Vorne als neuen Kopf setzt? Dann brauchst du die restlichen Teile nicht bewegen und das Spiel wäre flüssiger. Nur mal so als kleine Anmerkung.

    > Die Lücken in den Schlangenteilen stören irgendwie. Klar ist das interessant, aber diese Lücken sind unregelmäßig. Wenn, dann implantiere dieses Feature doch einfach als eigener Modi. Mich persönlich stört das, ist aber nur meine Meinung.

    LG. Make :)