Snake [mit GDI+, hoffentlich verständlich]

  • Hey Leute

    ich hab mal das gute alte Snake nachprogrammiert, ja ich weiß, dass es das schon 100000000000000 mal gibt aber nicht ganz so oft mit GDI+ und wenn doch dann hab ich nicht durchgeblickt, deswegen hab ich hier mal ne Version die man hoffentlich verstehen kann ;)

    Ich weiß nur nicht, warum beim Start oben links so ein schwarzes Kästchen kommt, vielleicht konnt ihr mir ja helfen ;)

    Hier erstmal die Version für die die Snake nachprogrammieren lernen wollen ;)

    Spoiler anzeigen
    [autoit]

    #include <GuiConstants.au3>
    #include <GDIPlus.au3>
    #include <Misc.au3>

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

    OnAutoItExitRegister("_EXIT")

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

    Global $x = 100
    Global $y = 100
    $score = 1

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

    $kx = 300
    $ky = 400
    Global $direction = "down";startrichtung, kann geändert werden
    Global $Laenge[3][2]
    $Laenge[0][0] = 100
    $Laenge[0][1] = 100

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

    $Gui = GUICreate("Snake",500,500,100,100)

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

    _GDIPlus_Startup()
    $brushSchwarz = _GDIPlus_BrushCreateSolid(0xFF000000);die einzelnen Farben werden erstellt
    $brushWeiss = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
    $brushGruen = _GDIPlus_BrushCreateSolid(0xFF60CC3F)

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

    $graphic = _GDIPlus_GraphicsCreateFromHWND($Gui)
    $bitmap = _GDIPlus_BitmapCreateFromGraphics(500, 500, $graphic)
    $buffer = _GDIPlus_ImageGetGraphicsContext($bitmap)

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

    GUISetState()

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

    AdlibRegister("_bewege",200);alle 200 Milisekunden wird die Schlange bewegt

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

    Do
    $msg = GUIGetMsg()

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

    Select
    Case _IsPressed(25);links
    $direction = "left"
    Case _IsPressed(26);oben
    $direction = "up"
    Case _IsPressed(27);rechts
    $direction = "right"
    Case _IsPressed(28);unten
    $direction = "down"
    EndSelect

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

    _GDIPlus_GraphicsFillRect($buffer, 0, 0, 500, 500, $brushWeiss);zeichnet den Hintergrund
    For $i = 0 to Ubound ($Laenge) -1;zeichnet die einzelnen Teile der Schlange
    _GDIPlus_GraphicsFillRect($buffer, $Laenge[$i][0], $Laenge[$i][1], 10, 10, $brushSchwarz)
    Next
    _GDIPlus_GraphicsFillRect($buffer, $kx, $ky, 10, 10, $brushGruen);zeichnet das Futter
    _GDIPlus_GraphicsDrawImageRect($graphic, $bitmap, 0, 0, 500, 500);zeichnet die Grafik

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

    Select
    Case $Laenge[0][0] >= ($kx - 5) And $Laenge[0][0] <= ($kx + 5) And $Laenge[0][1] >= ($ky - 5) And $Laenge[0][1] <= ($ky + 5);Prüft, ob der Kopf auf ein Futter trifft
    $score += 1
    Do
    $kx = Random(1,490,1)
    Until Mod($kx,20) = 0
    Do
    $ky = Random(1,490,1)
    Until Mod($ky,20) = 0
    $width = UBound($Laenge)
    ReDim $Laenge[$width+1][2]
    EndSelect

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

    For $i = 1 To UBound($Laenge) - 1 Step 1;Prüft, ob der Kopf mit irgendeinem anderen Teil zusammenstößt
    If $Laenge[0][0] = $Laenge[$i][0] Then
    If $Laenge[0][1] = $Laenge[$i][1] Then
    MsgBox(0,"Verloren","Sie haben mit einer Punktzahl von "&$score&" verloren!")
    Exit
    EndIf
    EndIf
    Next

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

    Until $msg = $GUI_EVENT_CLOSE

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

    Func _EXIT();Exit Funktion zur Freigabe der Ressourcen
    _GDIPlus_GraphicsDispose($graphic)
    _GDIPlus_GraphicsDispose($buffer)
    _GDIPlus_BitmapDispose($bitmap)
    _GDIPlus_Shutdown()
    EndFunc

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

    Func _bewege()
    For $i = Ubound($Laenge) -1 to 1 Step -1;das Nachrücken der Schlange, das 2. Stück nimmt die Position des kopfes ein, das 3. die des 2. usw...
    $Laenge[$i][0] = $Laenge[$i-1][0]
    $Laenge[$i][1] = $Laenge[$i-1][1]
    Next

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

    If $direction == "left" And $x >= 0 Then $Laenge[0][0] -= 10;der Kopf bekommt eine neue Position
    If $direction == "up" And $y >= 0 Then $Laenge[0][1] -= 10
    If $direction == "right" And $x <= 500 Then $Laenge[0][0] += 10
    If $direction == "down" And $y <= 500 Then $Laenge[0][1] += 10
    EndFunc

    [/autoit]

    Und hier meine ausgebaute Version:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstants.au3>
    #include <GDIPlus.au3>
    #include <Misc.au3>

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

    OnAutoItExitRegister("_EXIT")

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

    Global $x = 100
    Global $y = 100
    $score = 1

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

    $kx = 300
    $ky = 400
    Global $direction = "down" ;startrichtung, kann geändert werden
    Global $Laenge[3][2]
    For $i = 1 To UBound($Laenge) - 1
    $Laenge[$i][0] = -100
    $Laenge[$i][1] = -100
    Next
    $Laenge[0][0] = 100
    $Laenge[0][1] = 100

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

    $Gui = GUICreate("Snake",500,500,100,100)

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

    _GDIPlus_Startup()
    $brushSchwarz = _GDIPlus_BrushCreateSolid(0xFF000000) ;die einzelnen Farben werden erstellt
    $brushWeiss = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
    $brushGruen = _GDIPlus_BrushCreateSolid(0xFF60CC3F)

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

    $graphic = _GDIPlus_GraphicsCreateFromHWND($Gui)
    $bitmap = _GDIPlus_BitmapCreateFromGraphics(500, 500, $graphic)
    $buffer = _GDIPlus_ImageGetGraphicsContext($bitmap)

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

    GUISetState()

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

    AdlibRegister("_bewege",200) ;alle 200 Milisekunden wird die Schlange bewegt

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

    Do
    $msg = GUIGetMsg()

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

    Select
    Case _IsPressed(25) And $direction <> "right" ;links
    $direction = "left"
    Case _IsPressed(26) And $direction <> "down" ;oben
    $direction = "up"
    Case _IsPressed(27) And $direction <> "left" ;rechts
    $direction = "right"
    Case _IsPressed(28) And $direction <> "up" ;unten
    $direction = "down"
    EndSelect

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

    _GDIPlus_GraphicsFillRect($buffer, 0, 0, 500, 500, $brushWeiss) ;zeichnet den Hintergrund
    For $i = 0 to Ubound ($Laenge) -1 ;zeichnet die einzelnen Teile der Schlange
    _GDIPlus_GraphicsFillRect($buffer, $Laenge[$i][0], $Laenge[$i][1], 10, 10, $brushSchwarz)
    Next
    _GDIPlus_GraphicsFillRect($buffer, $kx, $ky, 10, 10, $brushGruen) ;zeichnet das Futter
    _GDIPlus_GraphicsDrawImageRect($graphic, $bitmap, 0, 0, 500, 500) ;zeichnet die Grafik

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

    Select
    Case $Laenge[0][0] >= ($kx - 5) And $Laenge[0][0] <= ($kx + 5) And $Laenge[0][1] >= ($ky - 5) And $Laenge[0][1] <= ($ky + 5) ;Prüft, ob der Kopf auf ein Futter trifft
    $score += 1
    Do
    $kx = Random(1,490,1)
    Until Mod($kx,20) = 0
    Do
    $ky = Random(1,490,1)
    Until Mod($ky,20) = 0
    $width = UBound($Laenge)
    ReDim $Laenge[$width+1][2]
    EndSelect

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

    For $i = 1 To UBound($Laenge) - 1 Step 1 ;Prüft, ob der Kopf mit irgendeinem anderen Teil zusammenstößt
    If $Laenge[0][0] = $Laenge[$i][0] Then
    If $Laenge[0][1] = $Laenge[$i][1] Then
    MsgBox(0,"Verloren","Sie haben mit einer Punktzahl von "&$score&" verloren!")
    Exit
    EndIf
    EndIf
    Next

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

    Select ;Prüft, ob die Schlange den Bildschirm verlässt
    Case $Laenge[0][0] < 0
    $Laenge[0][0] = 480
    Case $Laenge[0][0] > 480
    $Laenge[0][0] = 0
    Case $Laenge[0][1] < 0
    $Laenge[0][1] = 480
    Case $Laenge[0][1] > 480
    $Laenge[0][1] = 0
    EndSelect

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

    Until $msg = $GUI_EVENT_CLOSE

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

    Func _EXIT() ;Exit Funktion zur Freigabe der Ressourcen
    _GDIPlus_GraphicsDispose($graphic)
    _GDIPlus_GraphicsDispose($buffer)
    _GDIPlus_BitmapDispose($bitmap)
    _GDIPlus_Shutdown()
    EndFunc

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

    Func _bewege()
    For $i = Ubound($Laenge) -1 to 1 Step -1 ;das Nachrücken der Schlange, das 2. Stück nimmt die Position des kopfes ein, das 3. die des 2. usw...
    $Laenge[$i][0] = $Laenge[$i-1][0]
    $Laenge[$i][1] = $Laenge[$i-1][1]
    Next

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

    If $direction == "left" And $x >= 0 Then $Laenge[0][0] -= 10 ;der Kopf bekommt eine neue Position
    If $direction == "up" And $y >= 0 Then $Laenge[0][1] -= 10
    If $direction == "right" And $x <= 500 Then $Laenge[0][0] += 10
    If $direction == "down" And $y <= 500 Then $Laenge[0][1] += 10
    EndFunc

    [/autoit]

    DFPWare

  • Nicht schlecht, was ich ändern würde: Lass die Schlange bitte wieder erscheinen wenn sie rausfährt :D Und zu dem "schwarze Kästchen da oben" geb ich dir einen Tip: Wenn man die position am Anfang noch auf "" lässt zeichnet sich alles oben links auf 0, 0 ;) Also befüll die Position schon am Anfang, z.B. durch Kopposition -2*$SchlangeWidth oder so.

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • also wenn jetzt die Schlange den Bildschirm verlässt, dann kommt sie an der anderen Seite wieder raus, aber das 2. hab ich nich verstanden -.-

    EDIT: ich hab noch eingefügt, dass man nicht, wenn man z.B von links kommt nach links lenken kann, weil man sonst tot wäre ;)

  • also wenn jetzt die Schlange den Bildschirm verlässt, dann kommt sie an der anderen Seite wieder raus, aber das 2. hab ich nich verstanden -.-

    Bei mir kommt sie nichtmehr auf der anderen Seite raus. Was ich mit dem 2ten meine ist, das du dem Rechteck nur keine Position zugewiesen hast, es aber trotzdem zeichnest. Die Position ist "" was dann 0 bedeutet du könntest du Position direkt bei dranhängen ans Array auf - 100 - 100 setzen, dann sieht mans nichtmehr. So:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstants.au3>
    #include <GDIPlus.au3>
    #include <Misc.au3>

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

    OnAutoItExitRegister("_EXIT")

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

    Global $x = 100
    Global $y = 100
    $score = 1

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

    $kx = 300
    $ky = 400
    Global $direction = "down" ;startrichtung, kann geändert werden
    Global $Laenge[3][2]
    For $i = 1 To UBound($Laenge) - 1
    $Laenge[$i][0] = -100
    $Laenge[$i][1] = -100
    Next
    $Laenge[0][0] = 100
    $Laenge[0][1] = 100

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

    $Gui = GUICreate("Snake", 500, 500, 100, 100)

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

    _GDIPlus_Startup()
    $brushSchwarz = _GDIPlus_BrushCreateSolid(0xFF000000) ;die einzelnen Farben werden erstellt
    $brushWeiss = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
    $brushGruen = _GDIPlus_BrushCreateSolid(0xFF60CC3F)

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

    $graphic = _GDIPlus_GraphicsCreateFromHWND($Gui)
    $bitmap = _GDIPlus_BitmapCreateFromGraphics(500, 500, $graphic)
    $buffer = _GDIPlus_ImageGetGraphicsContext($bitmap)

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

    GUISetState()

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

    AdlibRegister("_bewege", 200) ;alle 200 Milisekunden wird die Schlange bewegt

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

    Do
    $msg = GUIGetMsg()

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

    Select
    Case _IsPressed(25) ;links
    $direction = "left"
    Case _IsPressed(26) ;oben
    $direction = "up"
    Case _IsPressed(27) ;rechts
    $direction = "right"
    Case _IsPressed(28) ;unten
    $direction = "down"
    EndSelect

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

    _GDIPlus_GraphicsFillRect($buffer, 0, 0, 500, 500, $brushWeiss) ;zeichnet den Hintergrund
    For $i = 0 To UBound($Laenge) - 1 ;zeichnet die einzelnen Teile der Schlange
    _GDIPlus_GraphicsFillRect($buffer, $Laenge[$i][0], $Laenge[$i][1], 10, 10, $brushSchwarz)
    Next
    _GDIPlus_GraphicsFillRect($buffer, $kx, $ky, 10, 10, $brushGruen) ;zeichnet das Futter
    _GDIPlus_GraphicsDrawImageRect($graphic, $bitmap, 0, 0, 500, 500) ;zeichnet die Grafik

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

    Select
    Case $Laenge[0][0] >= ($kx - 5) And $Laenge[0][0] <= ($kx + 5) And $Laenge[0][1] >= ($ky - 5) And $Laenge[0][1] <= ($ky + 5) ;Prüft, ob der Kopf auf ein Futter trifft
    $score += 1
    Do
    $kx = Random(1, 490, 1)
    Until Mod($kx, 20) = 0
    Do
    $ky = Random(1, 490, 1)
    Until Mod($ky, 20) = 0
    $width = UBound($Laenge)
    ReDim $Laenge[$width + 1][2]
    $Laenge[UBound($Laenge) - 1][0] = -100
    $Laenge[UBound($Laenge) - 1][1] = -100
    EndSelect

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

    For $i = 1 To UBound($Laenge) - 1 Step 1 ;Prüft, ob der Kopf mit irgendeinem anderen Teil zusammenstößt
    If $Laenge[0][0] = $Laenge[$i][0] Then
    If $Laenge[0][1] = $Laenge[$i][1] Then
    MsgBox(0, "Verloren", "Sie haben mit einer Punktzahl von " & $score & " verloren!")
    Exit
    EndIf
    EndIf
    Next

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

    Until $msg = $GUI_EVENT_CLOSE

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

    Func _EXIT() ;Exit Funktion zur Freigabe der Ressourcen
    _GDIPlus_GraphicsDispose($graphic)
    _GDIPlus_GraphicsDispose($buffer)
    _GDIPlus_BitmapDispose($bitmap)
    _GDIPlus_Shutdown()
    EndFunc ;==>_EXIT

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

    Func _bewege()
    For $i = UBound($Laenge) - 1 To 1 Step -1 ;das Nachrücken der Schlange, das 2. Stück nimmt die Position des kopfes ein, das 3. die des 2. usw...
    $Laenge[$i][0] = $Laenge[$i - 1][0]
    $Laenge[$i][1] = $Laenge[$i - 1][1]
    Next

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

    If $direction == "left" And $x >= 0 Then $Laenge[0][0] -= 10 ;der Kopf bekommt eine neue Position
    If $direction == "up" And $y >= 0 Then $Laenge[0][1] -= 10
    If $direction == "right" And $x <= 500 Then $Laenge[0][0] += 10
    If $direction == "down" And $y <= 500 Then $Laenge[0][1] += 10
    EndFunc ;==>_bewege

    [/autoit]

    Was ich geändert hab: Z. 15-18 direkte zuweisung der Koordinaten und Z. 70 f., bei neuem schwanzteil auch erstmal auf -100 -100 setzen.

    Noch ein Bug: Man kann in die Entgegengesetzte Fahrtrichtung klicken, das beduetet wenn man anch unten schlängelt und nach oben klickt kollidiert man, du musst dann überprüfen ob die jetztige Richtung <> nach unten ist.

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • Danke jetz hab ichs kapiert ;)

    Zitat

    Noch ein Bug: Man kann in die Entgegengesetzte Fahrtrichtung klicken, das beduetet wenn man anch unten schlängelt und nach oben klickt kollidiert man, du musst dann überprüfen ob die jetztige Richtung <> nach unten ist.

    Das hab ich schon längst behoben ;)
    du musst den Text aus dem unteren Spoiler kopieren, der obere ist einfach gehalten, für die Leute, die mit GDI+ anfangen wollen ;)

    DFPWare