Snake

shp_spielfeld.ZOrder 1

Das Bringt das Spielfeld wieder in den hintergrund.
Da das durch Load shp_fressen(x) erzeugte Objekt hinter dem Spielfeld war, Habe ich das Spielfeld hinter die anderen Objekte befördert damit sind die Fresschen nun sichtbar.
Probier es aus und Kommentier diese Zeile aus. Dann verstehst du die Funktion.

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

Mit Load kannst du Objekte laden... z.B.: Forms oder deine Shapes!
Und Unload ist das gegentel davon...
Benötigt wird der Unload der Shapes da sonst Fehler auftreten wenn unterm Spielen Shapes mit Load geladen werden. Ist einfacher alls über 100 Shapes zu zeichnen und diese unterm Laufen zu verschieben, ein- und auszublenden

Wenn du fragen hast zum Code melde dich...
Erklär dir gerne was da steht...

lg Tody
 
Zuletzt bearbeitet:

Bräuchte bitte Erklärung..

Set Feld = shp_spielfeld
For i = 0 To (Snakelaenge - 1)
Set Snake(i) = shp_snake(i)
Next i


Feld.Height = 30 * 17 '30 Felder zu je 17px
Feld.Width = 40 * 17 '40 Felder zu je 17px
Snake(0).Top = Feld.Top + (15 * 17)
Snake(0).Left = Feld.Left + (20 * 17)

Ist dieser code für das Raster

Bitte um erklärung...

Mfg
 
Visual Basic:
Sub Snakestartposition()
    Dim i As Integer '-> Wird in der FOR Schleife verwendet...
    Dim Feld As Shape '-> Deklariert die Variable as Shape-Objekt
    
    'Bezeichet die snake-shapes können bis zu FRESCHENANZ+5 (5=Start Länge) sein...
    Dim Snake(FreschenAnz + 5) As Shape '-> Deklariert die Variable as Shape-Objekt _
                                            in einem Array (0 bis FresschenAnz+5). _
                                            FresschenAnz+5 = Anzahl Fresschen + die 5 _
                                                             Strat Shapes die _
                                                             Vorhanden sind.
    'Weshalb ich die Shapes in Variablen gebe hat den Grund das, _
     Der Code Etwas übersichtlicher wird. Mann kann diesen Schritt _
     auch weglassen...
    
    Snakelaenge = 5 '-> Länge der Schlange
    
    'Hier werden die Shape Objekte den Variablen zugewiesen...
    Set Feld = shp_spielfeld        '-> Spielfeld der Var. Feld zuweisen
    For i = 0 To (Snakelaenge - 1)  '-> Schleife mit der Anz Teile die die Schlange _
                                        hat. "Snakelänge -1" -> Weil das erste Shape _
                                        den Index 0 hat. 7 Teile = Index 0 bis 6
        Set Snake(i) = shp_snake(i) '-> Der Variable Snake(Index) das Shape _
                                        shp_snake(Index) zuweisen
    Next i
    
    'Du musst dir das Spielfeld als Raster vorstellen... (30 Felder Breit und 40 Hoch)
    'Warum 17px (Pixel)? -> Da ein Teil der Schlange 17x17 pixel hat...
    Feld.Height = 30 * 17  'Höhe des Feldes einstellen also 30 Felder zu je 17px
    Feld.Width = 40 * 17   'Breite des Feldes einstellen also 40 Felder zu je 17px
    
    'Schlange in der Mitte Positionieren...
    Snake(0).Top = Feld.Top + (15 * 17)   'Von Oben - Feld Oberkante + 15 Felder _
                                           zu je 17px
    Snake(0).Left = Feld.Left + (20 * 17) 'Von Links - Feld Linke Kante + 20 Felder _
                                           zu je 17px
    'Schlange Ausrichten....
    'Warum bei 1 Starten? -> Snake(0) haben wir oben schon festgelegt...
    For i = 1 To (Snakelaenge - 1) '-> Schleife mit der Anz Teile die die Schlange _
                                       hat. "Snakelänge -1" -> Weil das erste Shape _
                                       den Index 0 hat. 7 Teile = Index 0 bis 6
        '(i - 1) -> beteutet das forhergehende Teil
        Snake(i).Top = Snake(i - 1).Top         'Teil Oben Ausrichten
        Snake(i).Left = Snake(i - 1).Left - 17  'Teil ein Feld nach Links Verschieben _
                                                 also um 17px
    Next i
    Richtung = 0 'Giebt die Richtung vor in die die Schlange startet (Nach Rechts)
End Sub

Ich hoffe das ich dir nun einiges Beantwortet habe...
Falls noch Fragen auftauchen scheib mir...

lg Tody
 
Zuletzt bearbeitet:

Vielen Dank das du dir die Mühe machst mir das so gut wie möglich zu erklären...
Ist sehr gut erklärt..

Also wennst noch Lust hättest, dass du mir noch die zwei anderen Unterprogramme erklärst...

Private Sub fresschenVerteilung()
Sub Kollisionsprüfung()

Und was das mit "aufräumen" bedeutet....

lg
 
So Nummer 1:

Visual Basic:
Private Sub fresschenVerteilung()
    'FreschenAnz ist Global definiert als Constante mit dem Wert 50 _
     (Kannst auch höher setzen)
    'Das selbe ist mit N - ist auch global definiert wäre aber nicht nötig
    'Weis nicht warum das so vorgeschlagen wurde...
    'Ich ändere es mal um...
    Dim x As Long
    
    For x = 0 To FreschenAnz - 1 'Ergiebt o to 49 -> 50 Fresschen = Index 0 bis 49
        If Not x = 0 Then Load shp_fressen(x) 'Alle ausser 0 bearbeiten... _
                                               Da es es ja 0 schon giebt auf der Form... _
                                               Load shp_fresschen (x) Lädt ein neues Shape Objekt...
        'Obige Anweisung ist ein einzeiler mann kann es auch so anschreiben...
'        If Not x = 0 Then 'Ist x nicht 0 dann mach ...
'            Load shp_fresschen(x)
'        End If
        'Oder so...
'        If x > 0 Then 'Ist x größer als 0 dann mach ...
'            Load shp_fresschen(x)
'        End If
                                                    
        'x = Index der Bearbeitet wird...
        shp_fressen(x).Top = shp_spielfeld.Top + ((Int(Rnd * 30)) * 17)   'Position von oben setzen.
                '...Top = shp_spielfeld.Top + ((Int(Rnd + 30)) * 17)
                'shp_spielfeld.Top -> Müsste klar sein
                '+ ((Int(Rnd + 30)) * 17)
                'Mit Int(Rnd +30) erhältst du einen wert zwischen 0 und 30 -> Das Feld von oben herunter.
                'Mit (Int(Rnd + 30)) * 17 da wird das erg. in Klammer gesetzt und mit 17px Multipliziert -> 17px kantenlänge eines Feldes.
                'Das Ganze in Klammer setzen! Damit bei der Addition zu .top keine Rechen Fehler entstehen können.
                
        shp_fressen(x).Left = shp_spielfeld.Left + ((Int(Rnd * 40)) * 17) 'Position von Links setzen...
        shp_fressen(x).Visible = True 'Fresschen anzeigen...
    Next x
    shp_spielfeld.ZOrder 1 'Spielfeld in den Hintergrund rücken das die erzeugten _
                            Fresschen hinter dem Spielfeld sind.
End Sub
 
Next Spet...
Visual Basic:
Sub Kollisionsprüfung()
    Dim i As Long
    'Prüft ob die Schlange "ÜBER" den Rand fährt -> Anstößt
    If shp_snake(0).Left < shp_spielfeld.Left Or _
       shp_snake(0).Top < shp_spielfeld.Top Or _
       shp_snake(0).Left >= shp_spielfeld.Left + shp_spielfeld.Width Or _
       shp_snake(0).Top >= shp_spielfeld.Top + shp_spielfeld.Height Then
        'Ist das der Fall Timer Disabeln
        Timer1.Enabled = False
        MsgBox ("Game Over")
        'Ruft den Button "Neustart auf"
        cmd_start_Click
'Hier könnte auch noch ein Exit Sub stehen und die Sub zu verlassen...
'Ich tus mal rein da das rest der Sub irrelevant ist...
        Exit Sub
    End If
    
    'fresschen abprüfen...
    'Diese Schleife fragt jedes Fresschen ab ob die Schlange darauf ist.
    For i = 0 To FreschenAnz - 1 'In unserem fall für 50 Happen -> i = 0 to 49
        'Wenn die Schlange (Shape 0) auf einem Happen ist Routine ausführen...
        If shp_snake(0).Left = shp_fressen(i).Left And shp_snake(0).Top = shp_fressen(i).Top Then
            'eines gefunden
            'Wenn der Happen noch nicht gegessen ist Routine ausführen...
            'shp_fressen(i).Visible = True  Fressen Sichtbar = Noch da...
            '                         False Fressen UNSICHTBAR = Schon aufgegessen...
            If shp_fressen(i).Visible = True Then
                'Aber nur verwenden wenns noch da ist! gg
                shp_fressen(i).Visible = False              'Happen verstecken
                Load shp_snake(Snakelaenge)                 'Schlange um 1 erweitern _
                                                             Wenn Snakelänge = 10 dann sind Shape 0 bis 9 geladen _
                                                             somit ist Snakelänge = der Neue Index von 10...
                shp_snake(Snakelaenge).Visible = True       'Das erstellte Shape anzeigen...
                shp_snake(Snakelaenge).FillColor = &HFF00&  'und die Farbe "Grün" zuweisen...
                Snakelaenge = Snakelaenge + 1               'Die Variable für die Länge um eines erhöhen...
                shp_spielfeld.ZOrder 1                      'Spielfeld wieder in hintergrund Setzen. _
                                                             damit der neue Teil wieder im Vordergrund ist.
                'Snake schneller machen....
                'Werte und Stufen anpassen nicht unter 0 kommen lassen
                'Hier wird der Timmer um 15ms schneller gemacht unter der voraussetzung,
                'das der Timer noch höher als 20 ist. Damit dieser keinen Negativen wert
                'erhalten kann falls mehr Fresschen da sind.
                If Timer1.Interval > 20 Then Timer1.Interval = Timer1.Interval - 15
            End If
        End If
    Next i
    
End Sub
 
Last but not least!

Visual Basic:
Private Sub cmd_start_Click() 'Code von Neustart-Button
    Dim i As Long
    'Damit der Code bei einem neustart keine Fehler aufwirft, weil zb. ein Shape
    'geladen werden soll das aber schon im verhergehenden Spiel geladen wurde
    'müssen alle dazugeladenen Elemente vorher Entladen werden. UNLOAD Objekt...
    'Aufraumen
    'Hier werden alle Fresschen bis auf den Happen mit Index 0 Entladen
    'i = 1 to 49
    For i = 1 To FreschenAnz - 1
        Unload shp_fressen(i)
    Next i
    'Hier wird die Schlange auf ihre ursprüngliche Länge festgelegt.
    'Alle Teile die drangehengt wurden entladen...
    'i = 5 to Länge -1 -> Index 0 bis 4 = ursprüngliche Länge _
                          Ist die Schlange zb 15 Teile lang (Index 0 bis 14) _
                          müssen nun die teile mit Index 5 bis 14 entladen werden.
    For i = 5 To Snakelaenge - 1
        Unload shp_snake(i)
    Next i
        
    Snakestartposition      'Schlange auf die Startposition setzen.
    fresschenVerteilung     'Happen neu verteilen...
    Timer1.Interval = 500   'Timer zurücksetzen auf 500ms = 0,5 Sekunden
    Timer1.Enabled = True   'Timer starten und die Schlange kriecht wieder...
End Sub

Hoffe du verstehst nun alles halbwegs...
Wenns noch Fragen gibt nur zu...

Darf ich Fragen seit wann du mit VB zu tun hast?
Und warum du ein Snake machen willst?

Was du im Programm noch machen soltest/kannst ist das du überprüfst ob Snake an
sich selbst anstöst. So wie es beim Nokia Spiel war. Dann wär es etwas schwerer zu
spielen.

lg Tody
 

Wir haben uns in der Schule, im Oktober zwischen Visual Basic 6.0 und C entscheiden können. Da hab ich mich für VB entschiede.. ;-)

Hat unserer Lehrer vorgeschlagen...Und da hab ich mich gleich mal mit dem befasst..
Wie du siehst, bin ich ja noch nicht weit gekommen..was solls..

EIne Frage noch:

Kann man das mit dem "Load" und "Unload" anders machen....
Gibts da eine einfachere Methode..

Vielen Dank nochmal für die detailierte Erklärung des Codes

Mfg
 

Neue Beiträge

Zurück