Snake

Balkan_Devil

Mitglied
Hallo miteinander
Ich bin gerade dabei Snake zu programmieren und da bräuchte ich bitte eure Hilfe:

Fortschritt:
Spielfeld
Beim berühren der Wand => Game Over
Die Schlange zu bewegen.

Mein Problem liegt beim "Fressen"
Ich will per Zufallsgenerator das "Fresschen" auf dem Spielfeld erscheinen lassen.
Spielfeldgröße: Left: 360
Top: 1440
Height: 6975
Width: 9615

Ich glaub das es irgendwie mit "random" gehen müsse.
Z.B. shp_fressen = Int(Rnd.....)
Wenn ich mich nicht täusche..

Ich bitte um Hilfe....

Mfg
 
Hallo,

Richtig, fast so geht's:

Dim shp_fressen As Integer
shpFressen = Int(10 * Rnd + 1)
Das ermittelt eine Zufallszahl (Integer) zwischen 1 und 10.
Du müsstest wahrscheinlich zwischen 0 und 9615 für die Breite angeben um es irgendwo dazwischen zu platziren und entsprechend die Höhe.

codeman
 
Code:
Private Sub Form_Load()
    fresschenVerteilung
End Sub

Private Sub fresschenVerteilung()
'Genau 100 fresschen verteilen:
Dim n As Integer

    Randomize
    For n = 1 To 100
        Load fresschenShape(n)
        fresschenShape(n).Left = Int(Rnd * 9615)
        fresschenShape(n).Top = Int(Rnd * 6975)
        fresschenShape(n).Visible = True
    Next n
End Sub

Ein Shape namens "fresschenShape" mit dem Index 0 liegt bereits auf der Form.

Achja, und hiermit könntest Du die fresschen in ein Raster "sortieren" falls nötig
Code:
Private Sub aufraeumen()
'Rastergrösse = 200 x 200
Dim dummy As Long

'Raster zeichnen 9000 x 6000, Feld = 300 x 300
    For n = 0 To 6000 Step 300
        Me.Line (0, n)-(9000, n)
    Next n
    For n = 0 To 9000 Step 300
        Me.Line (n, 0)-(n, 6000)
    Next n
    
'fresschen aufräumen
    For n = 1 To 100
        dummy = fresschenShape(n).Left Mod (300)

        If dummy <> 0 Then
            fresschenShape(n).Left = fresschenShape(n).Left - dummy
        End If
        
        dummy = fresschenShape(n).Top Mod (300)
        If dummy <> 0 Then
            fresschenShape(n).Top = fresschenShape(n).Top - dummy
        End If
    Next n

End Sub

Überlagerte fresschen wurden nicht berücksichtigt.
 
Zuletzt bearbeitet:
Danke für die schnelle antwort...war sehr hilfreich

Aber ein paar Problemchen hätt ich da noch..

Ich finde das mit dem Raster ist sehr gut, nur versteh ich es i-wie nicht...und funktionieren tuts bei mir auch nicht..
Wie ich glaube, ist der Raster dazu da, damit das "fresschen" immer auf einem raster angezeigt wird....und nicht i-wie und i-wo dargestellt wird..

So nun zur zweiten frage...

Wie überprüfe ich die Kollision meiner "Schlange" und dem "Fresschen" ?

Ich habs mal so probiert... aber es haut i-wie nicht ganz hin...

Z.B.
Sub Fressen()
Dim i As Integer
Randomize
shp_fressen(0).Left = Int(Rnd * 9600)
shp_fressen(0).Top = Int(Rnd * 6000)

If shp_snake(0).Left = shp_fressen(0).Left Or shp_snake(0).Top = shp_fressen(0).Top Then
shp_fressen(0).Visible = False
End If
End Sub


MFg
 
Hm also ich vermute mal dass Deine Form auf "Twipes" gestellt ist, Du aber die snake sicher nicht mit 1 Twipe pro Schritt bewegst. Wenn dem so ist und Du die snake in grösseren Schritten bewegst dann wäre es purer Zufall, wenn snake.left = fressen.left ist.

Stell mal alles auf Pixel und berücksichtige die Schrittweite der snake.

Bei meinem obigen Beispiel muss "Dim n As Integer" ausserhalb aller Subs deklariert werden, dann sollte das Beispiel funktionieren. Und beachte die Bezeichner die ich verwendet habe, vielleicht decken die sich nicht mit Deinen Objekten. Ausserdem muss, wie schon gesagt, 1 Shape mit dem Namen "fresschenShape" und index 0 auf der Form liegen sonst verursacht die Load-Anweisung einen Fehler.
Der Code funktioniert, jedenfalls bei mir :)

Ps.: Das Raster habe ich nur zur Verdeutlichung zeichnen lassen. Im Spiel kann das natüllich wegbleiben.
 
Zuletzt bearbeitet:
Hab das jetzt alles gemacht, aber ich glaub ich bin zu dumm für das...

Ich häng mal mein projekt bei....

Dann könnt ihr mal schauen, was ich da falsch gemacht habe.

mfg
 

Anhänge

  • Snake_V3.zip
    2,3 KB · Aufrufe: 38
Hi, habe mir gerade deinen Source angesehen.

1. Du solltest das Spielfeld als Raster sehen.
Wenn ein teil der schlange 17x17px ist und das Feld 38x27 Felder hat ergitb das 646x459px.
Positionierung des ersten Shapes der schlange ca in der Mitte:
Feld: 19x14 -> Left=19*17; Top=14*17
Somit kannst du ganz am Rand entlang fahren. anstoßen würde sie Oben oder Rechts bei einem Negativen Wert. Rechts wenn der Wert > 646 und Unten > 459 ist.

2. Genau so ferfährst du mit den Fresschen: Ist es Oben Links hat es den Wert Left=0 Top=0.
Diesen hat auch dein Shape wenn es oben links im eck ist!
*Aber richtung wechseln sonst ist das Spiel vorbei...* gg

Ich Schau dann mal weiter im Source.
Falls ich dazukomm stelle ich ihn wieder online...

lg Tody
 
Ich war mal so frei. Habe mir Dein Code mal angesehen und ein paar Änderungen vorgenommen. Alle Änderungen habe ich mit '###### Änderung eingklammert.

Stand:
- Snake bewegt sich innerhalb des Rasters
- Fressenverteilung funktioniert
- Snake frisst Fressen ^^

Den Rest bekommst Du sicher auch noch hin.

Anhang anzeigen Snake_V3.zip
 
Hallo nochmal.

Progi funktioniert nun.
Folgendes kann es nun.
  • Bis an den Rand fahren
  • 50 Fresschen verteilen
  • 40x30 Felder zu einer Kantenlänge von 17px
  • Trifft Snake auf einen Happen, wird Sie um 1 länger und etwas schneller...
  • Div. Bugs behoben...

unter "Sub Snakestartposition()" habe ich den Code verfeinert. Dieses solltest du in den anderen Subs und co noch tun damit es Sauberer aussieht.
Weiters solltest du noch folgendes machen...
  • Prüfung ob Snake an sich slbst anstößt (Damit ist das Spiel schwiriger da Snake dann nicht durch sich selbst fahren kann...)
  • GUI Aufwerten und Dynamisches Positionieren der Elemente
  • Code optimierung
  • usw...

Viel Spass noch damit....
lg Tody

Anhang anzeigen Snake_V3_neu.zip
 
Erstmal vielen Dank für die zahlreichen Antworten

Aber es bringt mir nicht wirklich viel, wenn ich das Programm fertig geschrieben bekomme, weil ich die Hälfte von den Codes nicht verstehe.

1.)Ich würde gerne wissen was das heißen soll:

shp_spielfeld.ZOrder 1

2.) Und könnte mir vl einer erklären wie das mit dem "Load" und "Unload" funktioniert und wofür das gut ist...

Mfg
 

Neue Beiträge

Zurück