Hier der Code für ein sehr simples snake mit hilfe des GDI
alles was auf der Form benötigt wird is ne Picturebox mit dem Namen pbField
€ Die zwei timer nicht vergessen.
alles was auf der Form benötigt wird is ne Picturebox mit dem Namen pbField
€ Die zwei timer nicht vergessen.
VB.NET-Quellcode
- Public Class frmSnake
- 'Aufzählungstyp für die Richtungen in die die Schlange laufen kann
- Private Enum eDirection
- Left
- Right
- Up
- Down
- End Enum
- '20x20 Spielfeld
- Private Const FieldWidth As Integer = 20 'Breite des Feldes
- Private Const FieldHeight As Integer = 20 'Höhe des Feldes
- 'Größe eines Blocks (10x10)
- Private Const RectWidth As Integer = 10
- Private Const RectHeight As Integer = 10
- Private Field(FieldWidth, FieldHeight) As Integer 'Karte als Array
- Private CurrentDirection As eDirection = eDirection.Left 'Richtung der Schlange
- Private CurrentSnakeLength As Integer = 3 'Länge der Schlange
- Private CurrentSnakePos As New Point(10, 10) 'Position des Schlangenkopfes
- Private Updating As Boolean = False
- 'leeres Spielfeld erstellen
- Private Sub ResetField()
- For x As Integer = 0 To FieldWidth
- For y As Integer = 0 To FieldHeight
- Field(x, y) = 0
- Next y
- Next x
- End Sub
- 'Neues Essen an einer zufälligen Position auftauchen lassen
- Private Sub SetRndFood()
- 'Eine Liste mit möglichen Spawn-punkten für essen erstellen
- Dim PossibleFoodPositions As New List(Of Point)
- For x As Integer = 0 To FieldWidth - 1
- For y As Integer = 0 To FieldHeight - 1
- If Field(x, y) = 0 Then
- PossibleFoodPositions.Add(New Point(x, y))
- End If
- Next y
- Next x
- 'Eine zufällige position aus der Liste der punkte für den spawn wählen
- If PossibleFoodPositions.Count > 0 Then
- Dim r As New Random
- Dim Pos As Integer = r.Next(0, PossibleFoodPositions.Count - 1)
- Field(PossibleFoodPositions(Pos).X, PossibleFoodPositions(Pos).Y) = -1
- End If
- End Sub
- Private Sub frmSnake_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- pbField.Left = 0
- pbField.Top = 0
- pbField.Width = 1 + FieldWidth * RectWidth
- pbField.Height = 1 + FieldHeight * RectHeight
- Me.Width = pbField.Width + 8
- Me.Height = pbField.Height + 34
- SetRndFood()
- Randomize()
- End Sub
- 'Bild erneuern
- Private Sub tmrRenderScene_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrRenderScene.Tick
- pbField.Refresh()
- End Sub
- Private Sub pbField_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles pbField.Paint
- For x As Integer = 0 To FieldWidth
- For y As Integer = 0 To FieldHeight
- If Field(x, y) = -1 Then
- 'Essen wird blau dargestellt
- e.Graphics.FillRectangle(Brushes.Blue, New Rectangle(x * RectWidth, y * RectHeight, RectWidth, RectHeight))
- End If
- If Field(x, y) > 0 Then
- 'Schlange wird rot dargestellt
- e.Graphics.FillRectangle(Brushes.Red, New Rectangle(x * RectWidth, y * RectHeight, RectWidth, RectHeight))
- End If
- 'e.Graphics.DrawRectangle(Pens.Black, New Rectangle(x * RectWidth, y * RectHeight, RectWidth, RectHeight))
- Next y
- Next x
- End Sub
- Private Sub tmrUpdateSnake_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrUpdateSnake.Tick
- If Updating Then Return
- Updating = True
- 'Schlange in eine Bestimmte richtung laufen lassen
- '1. Richtung prüfen
- '2. Prüfen ob sich schlange im feld befindet
- Select Case CurrentDirection
- Case eDirection.Left
- If CurrentSnakePos.X - 1 >= 0 Then
- CurrentSnakePos.X -= 1
- End If
- Case eDirection.Right
- If CurrentSnakePos.X + 1 < FieldWidth Then
- CurrentSnakePos.X += 1
- End If
- Case eDirection.Up
- If CurrentSnakePos.Y - 1 >= 0 Then
- CurrentSnakePos.Y -= 1
- End If
- Case eDirection.Down
- If CurrentSnakePos.Y + 1 < FieldHeight Then
- CurrentSnakePos.Y += 1
- End If
- End Select
- 'Prüfen ob die schlange über futter gelaufen ist
- If Field(CurrentSnakePos.X, CurrentSnakePos.Y) = -1 Then
- CurrentSnakeLength += 1
- SetRndFood()
- 'Punkte ?
- ElseIf Field(CurrentSnakePos.X, CurrentSnakePos.Y) > 0 Then
- 'tot schlange ist mit sich selbs kollidiert
- End If
- 'Schlangenlänge korrigieren
- Field(CurrentSnakePos.X, CurrentSnakePos.Y) = CurrentSnakeLength + 1
- For x As Integer = 0 To FieldWidth
- For y As Integer = 0 To FieldHeight
- If Field(x, y) > 0 Then
- Field(x, y) -= 1
- End If
- Next y
- Next x
- Updating = False
- End Sub
- Private Sub frmSnake_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
- Select Case e.KeyCode
- Case Keys.Up
- CurrentDirection = eDirection.Up
- Case Keys.Down
- CurrentDirection = eDirection.Down
- Case Keys.Left
- CurrentDirection = eDirection.Left
- Case Keys.Right
- CurrentDirection = eDirection.Right
- End Select
- End Sub
- End Class
Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „bsHobbit“ ()