Snake in VB.. brauche dringend hilfe!

12/14/2011 17:38 D3giX#1
Hallo erstmal ... :)
also ich hab in VB ein Snake Spiel programmiert.

Diese Fehlermeldung kommt wenn ich m aufaddieren möchte wenn man ein rotes kästchen gegessen hat... wenn ich allerding unter Class Dim m as Integer = 10 setze dann laufn mir direkt 10 felder hinterher...
Quote:
FEHLER:
Eine nicht behandelte Ausnahme des Typs "System.IndexOutOfRangeException" ist in Snake.exe aufgetreten.

Zusätzliche Infos: der Index war ausßerhalb des Arraybereichs
Ausserdem brauche ich Hilfe bei einem CollisionsCode (mit der Schlange selbst). Wer mir helfen will und das testen möchte bitte dran denken bei Spiel.vb die DoubleBufferd Eigenschaft auf True setzen sonst funkts nicht...

Code:
Public Class Spiel
    Dim r As New System.Random
    Dim m As Integer = 1
    Dim p(m) As Point
    Dim eat As Integer = 1
    Dim punkt(eat) As Point
    Dim k As Keys
    Dim pause As Boolean = False
    Dim xachse As Integer
    Dim yachse As Integer
    Dim xa As Integer
    Dim ya As Integer
    Dim Punkte As Integer
    Dim musikan As Boolean = False

    Public Sub merweitern()
        m = m + 1
        Me.Refresh()

    End Sub

    Public Sub Randoumfunktion()

        xachse = r.Next(0, 255)
        yachse = r.Next(0, 255)
        If xachse Mod 15 = 1 And yachse Mod 15 = 1 Then
            xa = xachse - 1
            ya = yachse - 1
            punkt(eat).X = xa
            punkt(eat).Y = ya

        Else
            Randoumfunktion()
        End If


    End Sub

    Public Sub wandcheck()

        If p(m).X >= 256 Then
            p(m).X = 0
        ElseIf p(m).X <= -1 Then
            p(m).X = 255
        End If

        If p(m).Y >= 256 Then
            p(m).Y = 0
        ElseIf p(m).Y < -1 Then
            p(m).Y = 255

        End If


    End Sub

    Public Sub keycheck()
        If k = Keys.Left Then
            p(m).X -= 15
        End If
        If k = Keys.Right Then
            p(m).X += 15
        End If
        If k = Keys.Up Then
            p(m).Y -= 15
        End If
        If k = Keys.Down Then
            p(m).Y += 15
        End If
        If k = Keys.Escape Then
            Startscreen.Show()
            Me.Close()
        End If
        If k = Keys.P Then
            GameOver.Show()
            Me.Close()
        End If
    End Sub

    Public Sub fressencheck()
        If p(m).X & p(m).Y = punkt(eat).X & punkt(eat).Y Then
            Randoumfunktion()
            Punkte = Punkte + 5
            Me.Text = "Punkte: " & Punkte
        End If
    End Sub

    Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
        Dim b As New Bitmap(270, 270)
        Dim g As Graphics = Graphics.FromImage(b)

        fressencheck()
        keycheck()
        wandcheck()

        For i As Integer = 0 To m - 1
            p(i) = p(i + 1)
            g.FillRectangle(Brushes.Green, New Rectangle(p(i), New Size(15, 15)))
        Next

        g.FillRectangle(Brushes.Red, New Rectangle(punkt(eat), New Size(15, 15)))
        g.FillRectangle(Brushes.Green, New Rectangle(p(m), New Size(15, 15)))
        g.Dispose()
        Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedSingle
        Me.BackgroundImage = b
        Me.ClientSize = b.Size
        Me.Refresh()
    End Sub

    Private Sub Spiel_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
        If e.KeyCode = Keys.Left Then
            k = Keys.Left
        End If
        If e.KeyCode = Keys.Right Then
            k = Keys.Right
        End If
        If e.KeyCode = Keys.Up Then
            k = Keys.Up
        End If
        If e.KeyCode = Keys.Down Then
            k = Keys.Down
        End If
        If e.KeyCode = Keys.Escape Then
            k = Keys.Escape
        End If
        If e.KeyCode = Keys.P Then
            k = Keys.P
        End If
    End Sub

    Private Sub Spiel_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        p(m).X = 0
        p(m).Y = 0
        Randoumfunktion()

    End Sub



End Class
12/14/2011 20:55 MoepMeep#2
Wenn du Hilfe zu Quellcode willst, dann gewöhn dir an Variablen gescheit zu benennen, das gleiche gilt für Funktionen. Die Richtlinien gibt es nicht grundlos.

Du rufst die Funktion merweitern nie auf, wie soll es dann dort crashen? Visual Studio hat einen debugger, benutz ihn.
12/14/2011 22:26 vwap#3
Deklarier m mal als Public.
12/14/2011 22:32 MoepMeep#4
Quote:
Originally Posted by Headpuster View Post
Deklarier m mal als Public.
Schau dir mal bitte den Unterschied zwischen public,private und protected an. Übrigens ist das ganze eine IndexOutOfRangeException und hat nichts mit den Zugriffsrechten zu tun.
12/14/2011 22:34 vwap#5
Wirklich? :rolleyes:

Wenn er schon OOP programmiert, kann er doch wenigstens die Variablen dementsprechend deklarieren.
Warum sollte ich mir den mir bereits bekannte Unterschied zwischen Public, Private, Protocted, Shadowed und Shared nochmal ansehen?
12/14/2011 22:42 MoepMeep#6
Quote:
Originally Posted by Headpuster View Post
Wirklich? :rolleyes:

Wenn er schon OOP programmiert, kann er doch wenigstens die Variablen dementsprechend deklarieren.
Warum sollte ich mir den mir bereits bekannte Unterschied zwischen Public, Private, Protocted, Shadowed und Shared nochmal ansehen?
Weil es absolut keinen Sinn macht, m auf public zu setzen.
12/14/2011 22:53 vwap#7
Dim stammt von VB 6 und somit veraltet, die Variablentypen wie Public, Private etc. wurden in .Net eingeführt und stehen für objektorientierte Programmierung.

Somit macht es durchaus Sinn, aktuellen Code, und keinen aus 1996 zu verwenden. :facepalm:
12/14/2011 23:08 MoepMeep#8
Zugriffsmodifizierer*

Und public macht immernoch keinen sinn, das ding gehört auf private.
12/14/2011 23:30 vwap#9
Kommt drauf an, ob die Klasse auch noch außerhalb genutzt wird ;)
Außer natürlich, er möchte nur die erhöhem() Sub verwenden.
12/15/2011 12:56 SwarN#10
Quote:
Originally Posted by Headpuster View Post
Kommt drauf an, ob die Klasse auch noch außerhalb genutzt wird ;)
Dafür gibt es Get/Set und ich stimme MoepMoep zu die gehört sich auf privat!
12/15/2011 14:01 iRofl#11
Quote:
Originally Posted by SwarN View Post
Dafür gibt es Get/Set und ich stimme MoepMoep zu die gehört sich auf privat!
Nein, soweit ich weiß, ist das volkommen egal.
12/15/2011 14:26 MoepMeep#12
Quote:
Originally Posted by iRofl View Post
Nein, soweit ich weiß, ist das volkommen egal.
Bei schlechtem stil schon, jo ;o
12/15/2011 14:30 iRofl#13
Quote:
Originally Posted by MoepMeep View Post
Bei schlechtem stil schon, jo ;o
Wieso? Ich finde das Praktisch ;D
12/15/2011 14:48 MoepMeep#14
Quote:
Originally Posted by iRofl View Post
Wieso? Ich finde das Praktisch ;D
Jo, weil du keine Ahnung hast was du da eigentlich machst.
12/15/2011 15:07 vwap#15
Quote:
Originally Posted by iRofl View Post
Wieso? Ich finde das Praktisch ;D
Inwiefern ist das zuteilen falscher Zugriffsoperatoren praktisch?