Snake

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von qauqau.

    Hallo alle,

    Ich bin gerade dabei ein Snake-Spiel zu programmieren und ich hab so gut wie alles fertig, mir fehlt nur noch zweiwas:
    Das, wenn die ihren Schwanz berührt Game-Over ist. Und das andere hab ich zur Hälfte fertig, das mit dem Fressen, bloß leider wird die Schlange beim Fressen nicht größer, sondern es kommt immer zum Absturz
    Leider hab ich keinerlei Idee wie ich das anstellen soll.

    Hier mein Quellcode:

    VB.NET-Quellcode

    1. Dim b As New Bitmap(500, 500)
    2. Dim g As Graphics = Graphics.FromImage(b)
    3. If k = Keys.Left Then
    4. Timer2.Start()
    5. Timer3.Stop()
    6. Timer4.Stop()
    7. Timer5.Stop()
    8. End If
    9. If k = Keys.Right Then
    10. Timer3.Start()
    11. Timer2.Stop()
    12. Timer4.Stop()
    13. Timer5.Stop()
    14. End If
    15. If k = Keys.Up Then
    16. Timer4.Start()
    17. Timer2.Stop()
    18. Timer3.Stop()
    19. Timer5.Stop()
    20. End If
    21. If k = Keys.Down Then
    22. Timer5.Start()
    23. Timer2.Stop()
    24. Timer3.Stop()
    25. Timer4.Stop()
    26. End If
    27. For i As Integer = 1 To n - 1
    28. p(i) = p(i + 1)
    29. g.FillRectangle(Brushes.Gray, New Rectangle(p(i), New Size(10, 10)))
    30. Next
    31. g.FillRectangle(Brushes.Black, New Rectangle(p(n), New Size(10, 10)))
    32. g.Dispose()
    33. Me.BackgroundImage = b
    34. Me.ClientSize = b.Size
    35. Me.Refresh()
    36. End Sub
    37. Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
    38. If e.KeyCode = Keys.Left Then
    39. k = Keys.Left
    40. End If
    41. If e.KeyCode = Keys.Right Then
    42. k = Keys.Right
    43. End If
    44. If e.KeyCode = Keys.Up Then
    45. k = Keys.Up
    46. End If
    47. If e.KeyCode = Keys.Down Then
    48. k = Keys.Down
    49. End If
    50. If p(n).Y = PictureBox1.Location.Y And p(n).X = PictureBox1.Location.X Then
    51. l1 = rnd.Next(3, 50)
    52. l2 = rnd.Next(2, 50)
    53. z.X = l1 * 10
    54. z.Y = l2 * 10
    55. PictureBox1.Location = z
    56. n += 1
    57. End If
    58. If p(n).Y = PictureBox2.Location.Y And p(n).X = PictureBox2.Location.X Then
    59. l1 = rnd.Next(3, 50)
    60. l2 = rnd.Next(2, 50)
    61. z.X = l1 * 10
    62. z.Y = l2 * 10
    63. PictureBox2.Location = z
    64. n += 2
    65. End If


    Kann mir da jemand helfen?

    MFG qauqau
    Hui, das sieht ja schonmal reichlich unperformant aus. Eine 500x500 Bitmap und 4 oder 5 Timer... Naja so kann ich mit dem Code wenig anfangen, da ich keinen Plan habe was die Timer machen. Und das oben ist (wie ich vermute) im KeyDown-Event, oder?
    Ich habe ja schon krasse Spiele in VB mit Pictureboxen gesehen und auch gute Programme mit GDI...
    ...und du benutzt GDI in einer Picturebox?

    Mach's dir doch einfacher und netscheide dich für eins der beiden -am besten für GDI (meiner meinung nach). Und ja, das mit den Timern ist in deinem Beispiel etwas verwirrend, da du 1) viele davonhast und du 2) nicht angibst, was diese tun sollen.

    Damit du die Kollision von deiner Snake berechnen kannst, nutze am besten die SuFu oder Google, da man in vielen (auch neuen) Threads immer dieselbe Frage lesen kann: "Wie berechne ich mit GDI Kollisionen?"

    MfG,
    X-Zat / Momo
    Schau mal in den SourceCode-Austausch.

    Picoflop hat da mal ein Beispiel für Snake reingepostet. Ich denke das kann man noch gut erweitern/ausbauen.
    Ich glaube du hast hier einen eher "ungünstigen" Ansatz gewählt.

    Gruss Mono
    Das ist meine Signatur und sie wird wunderbar sein!

    picoflop schrieb:

    qauqau schrieb:

    Also das Beispiel von Picoflop ist nicht gerade sehr ansprechend

    Alter ...
    Es geht um die PROGRAMMLOGIK! Ob du Kästchen zeichnest oder wilde 3D Modelle mit Texturen versiehst, spielt keine Rolle. Aber wer mehr als einen Timer braucht, hat schon irgendwie was falsch gemacht ...


    Alter ...

    Kann gut sein, dass es DIR um die "Programmlogik" geht, jedoch ist diese hier gar nicht gefragt. Eine "Logik" scheint er schon selbst erstellt zu haben, abgesehen davon macht es einen deutlichen Unterschied, ob er nun "Kästchen zeichnet oder wilde 3D Modelle mit Texturen versieht" - Da ich davon ausgehen kann, dass du davon Ahnung haben solltest, da du dies hier ansprichst, gehe ich da nicht weiter drauf ein.
    Außerdem solltest DU als User auch wissen, dass mehrere Timer nicht immer ein Indiz für schlechten Code sein müssen.

    Desweiteren kannst du ihm das auch außerhalb des Threads mitteilen - Hilfreich war deine Antwort sicherlich nicht, womit sich die Frage nach dem Sinn hinter deiner Antwort stellt.

    @ qauqau:

    Am besten baust du das ganze etwas um - Die Idee mit dem globalen Key (der bei KeyDown überschrieben wird) ist gut, würde ich auch weiterhin verwenden. Jedoch solltest du Events wie Berechnung der Bewegung von Objekten sowie das Hinzufügen von Objekten in einem einzigen Timer (ideal ist Interval = 40 für flüssige 25 Bilder pro Sekunde) verschieben.

    MfG,
    X-Zat / Momo

    X-Zat schrieb:


    Kann gut sein, dass es DIR um die "Programmlogik" geht, jedoch ist diese hier gar nicht gefragt.

    Doch
    Das, wenn die ihren Schwanz berührt Game-Over ist. Und das andere hab ich zur Hälfte fertig, das mit dem Fressen, bloß leider wird die Schlange beim Fressen nicht größer, sondern es kommt immer zum Absturz

    Das ist Programmlogik und nicht "wie zeichne ich mit GDI", oder?
    Und schon wieder ein sehr hilfreicher Beitrag.

    Du möchtest dich nun also um Worte streiten? Dann fangen wir beim Begriff "Programmlogik" an - Nein, warte! Ich denke, dass es keine Sau interessiert. Denn das einzige, was hier von Interesse ist, ist eine hilfreiche Antwort.
    Wenn er mit deinem Beispiel nicht zurecht kommt, dann hilf ihm doch, es zu verstehen - Im Gegenzug dazu aber zu behaupten, er mache irgendetwas falsch und dann noch keine hilfestellung zu geben, ist destruktiv.

    Da du hier ja scheinbar der Fachmann oder der Ansprechpartner bist, kannst du ihm ja eine detailliert kommentierte Version deines Beispiels geben. Oder lass es sein und wir können wirklich um Worte streiten.

    MfG,
    X-Zat / Momo
    Erstmal danke für die ganzen Antworten. Ja, ich habe meine eigene Programmlogik und darüber braucht ihr euch nicht streiten. Mir geht es bloß darum obe mir jemand helfen könnte wie ich die GDI- Kollison berechnen kann, denn bei Google habe ich da nicht sehr viel gefunden.

    Es wäre sehr nett wenn mir da jemand helfen könnte.

    MFG qauqau

    X-Zat schrieb:

    [VB 2010] Kolosion

    Ja genau ...

    Wenn man sich obiges Codefragment des TE anschaut, sieht man, dass er ein wohl "Feld" aus 50x50 Feldern hat (größe 10x10). Damit erübrigt sich eine "Kollisionsberechnung", denn wir brauchen ja nur zu prüfen, ob ein Feld leer ist, oder "etwas" enthält. Im Prinzip also genau das gleiche wie in "Snake - Ein Versuch" ... ;)
    Wenn man bei solch bescheidenen Zielen wie ein 50x50 Feld mit 10x10 Einteilungen nicht bleiben möchte, sondern es direkt etwas großzügiger planen sollte, kann GDI in Kombination mit Kollisionsberechnung nicht schaden.
    Und das Prinzip hilfreicher Antworten ist dir noch nicht klar geworden oder? Zumindest ich sehe nichts davon. Aber das liegt bekanntlich im eigenen Ermessen.

    MfG,
    X-Zat / Momo

    Zumindest ich sehe nichts davon

    Leseschwäche?

    Problem finden, beschreiben und lösen. Und im Zweifel nicht mit Kanonen auf Spatzen schießen, sondern eine dem Problem angemessene Lösung finden. Und eine "angemessene" Lösung ist nunmal nicht eine "Kollisionsberechnung", sondern das simple feststellen von "Feld ist leer oder nicht".

    "Großzügiger" planen ist in diesem Kontext unsinnig, da der TE kaum über die ersten Grundkenntnisse hinaus ist. Da sollte man erstmal versuchen, kleine, aber "gute" Lösungen zu finden. Lieber 20 kleine Programme die jeweils "ein" neues Problem bringen, als EIN Programm, dass 20 neue Lösungen erfordert.

    qauqau schrieb:

    Erstmal danke für die ganzen Antworten. Ja, ich habe meine eigene Programmlogik und darüber braucht ihr euch nicht streiten. Mir geht es bloß darum obe mir jemand helfen könnte wie ich die GDI- Kollison berechnen kann, denn bei Google habe ich da nicht sehr viel gefunden.

    Es wäre sehr nett wenn mir da jemand helfen könnte.

    MFG qauqau


    @ picoflop:

    Mein letztes Kommentar zu diesem Thread, da sich der Sinn des ganzen nicht nur verflüchtigt sondern mittlerweile unter'm Bett versteckt:

    nicht mit Kanonen auf Spatzen schießen
    - Meinst du? Deine Meinung! Ich gehe meine Programme so an, dass ich prinzipiell alles dynamisch, leicht und performant umsetzen kann. Wenn ich dann 20 Subs/Funktionen/Variablen mehr brauche, obwohl es im nötigen Falle auch mit 1 Sub/Funktion/Variable ginge, nutze ich die 20 um a) auf der sicheren und b) sehr dynamischen Seite zu sein. Btw.: Du hörst dich an wie mein Informatik Lehrer, der meckert über dasselbe...

    "Großzügiger" planen ist in diesem Kontext unsinnig
    - Sehr schön. Dann bleibt ihr mal schön bei euren Minimalanforderungen und werdet damit glücklich. Aber wer es mag, dem soll es bekanntlich nicht schaden.

    da der TE kaum über die ersten Grundkenntnisse hinaus ist
    - a) kann man ihm trotzdem mit zum Beispiel Tutorials helfen und b) muss man dies nicht zwingend akzeptieren. Aber da sind wir wieder bei euren Minimalanforderungen.

    als EIN Programm, dass 20 neue Lösungen erfordert
    - Sorry, aber irgendwo sollte ein Lerneffekt auftreten. Wie oft lest man denn hier im Forum "Brauche Code für..."/"Habt ihr Code für..."/"Wie geht...?"? Ganz ehrlich - Ich bin der Meinung, dass man sich bei anspruchsvollen Aufgaben ruhig 20 Probleme vornehmen kann - Und zumindest ich will bei neuen Themen (wie auch schon bei GDI) einen Lerneffekt erleben und weder C&P-Code noch irgendwelche transparente und/oder sinnlose Tutorials durchgehen. Ich provoziere lieber 20 Probleme, um aus ihnen lernen zu können. Aber auch das ist wieder eine Sache der Minimalanforderungen.

    Und weil mir das ganze Kindertheater hier weder Spaß macht noch irgendeinen Sinn erfüllt, ziehe ich mich für meinen Teil aus diesem zur Diskussion mutierten Thread zurück. Irgendwo gilt es schließlich ein Niveau zu wahren und dieses ist hier eindeutig unterschritten worden.

    Dem TE viel Erfolg und euch allen einen schönen Tag,
    X-Zat / Momo

    X-Zat schrieb:

    Sorry, aber irgendwo sollte ein Lerneffekt auftreten

    Weswegen man dann GDI etc erstmal gar nicht beachtet, sondern sich ausschließlich um LOGIK kümmert. Außerdem streicht man dann noch alle Timer bis auf einen. Usw usw. Und wenn man DANN einen performanten, simplen, fehlerfreien und verständlichen Code hat, DANN kümmert man sich um die Ausgabe!