Zum Inhalt springen

VB 2010 | Sokoban-Klon | Schulprojekt 10.Klasse | IndexOutOfRangeException-Fehler


Empfohlene Beiträge

Geschrieben

Guten Tag :)

*Nicht zum Thema gehörend

Ich bin zwar weder als Fachinformatiker tätig, noch werde ich demnächst meine Ausbildung in diese Fachrichtung beginnen.

Ich bin gerade 17 Jahre alt und besuche derzeit die 10.Klasse eines Gymnasiums in Nordrhein-Westfahlen. Nach meinem Abi (vorraussichtlich 2013) strebe ich jedoch einen Beruf im IT-Bereich an.

* Nicht zum Thema gehörend

Nun aber zu meinem/n Problem/en:

Zunächst einmal der Code um welchen sich alles dreht

Form1.vb:

Public Class Form1



    Private Field As Game

    Dim position As String

    Dim wegfrei As Boolean

    Dim schritte As Integer = 0

    Dim level As Integer = 1

    Dim bausteine As New PictureBox


    Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Call stufen()

    End Sub


    Public Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown


        'Links

        Select Case Field.Feld(Me.Controls(Me.Controls.IndexOfKey("roboter")).Location.X - 1, Me.Controls(Me.Controls.IndexOfKey("roboter")).Location.Y)


            Case 0


                wegfrei = True


            Case 1


                wegfrei = False


            Case 2


                wegfrei = True


            Case 3


                position = "links"


        End Select



        '' Start


        Try

            ' hier machst du was

            ' sollte dabei ein Fehler auftreten

            ' springt der Debugger automatisch zum Catch Block

            ' ohne eine Fehlermeldung dem User zu zeigen

        Catch ex As Exception

            ' hier kannst du im Falle eines Fehlers den Fehler bzw. die Exception (Ausnahmne) verarbeiten

            MsgBox(ex.Source & " : " & ex.InnerException.ToString & " : " & ex.Message)

        End Try


        '' Ende



        'Rechts

        Select Case Field.Feld(Me.Controls(Me.Controls.IndexOfKey("roboter")).Location.X + 1, Me.Controls(Me.Controls.IndexOfKey("roboter")).Location.Y)

            Case 0


                wegfrei = True


            Case 1


                wegfrei = False


            Case 2


                wegfrei = True


            Case 3


                position = "rechts"


            Case 4


        End Select


        'Drunter

        Select Case Field.Feld(Me.Controls(Me.Controls.IndexOfKey("roboter")).Location.X, Me.Controls(Me.Controls.IndexOfKey("roboter")).Location.Y + 1)

            Case 0


                wegfrei = True


            Case 1


                wegfrei = False


            Case 2


                wegfrei = True


            Case 3


                position = "drunter"


        End Select


        'Drüber

        Select Case Field.Feld(Me.Controls(Me.Controls.IndexOfKey("roboter")).Location.X, Me.Controls(Me.Controls.IndexOfKey("roboter")).Location.Y - 1)

            Case 0


                wegfrei = True


            Case 1


                wegfrei = False


            Case 2


                wegfrei = True


            Case 3


                position = "drüber"


        End Select


        Select Case e.KeyValue

            Case 37, 65


                Select Case wegfrei


                    Case True


                        Me.Controls(Me.Controls.IndexOfKey("roboter")).Left -= 75

                        schritte = schritte + 1

                        schritte_ausg.Text = schritte


                    Case False


                        MsgBox("nicht möglich")



                End Select

            Case 38, 87


                Select Case wegfrei


                    Case True


                        Me.Controls(Me.Controls.IndexOfKey("roboter")).Top -= 75

                        schritte = schritte + 1

                        schritte_ausg.Text = schritte


                    Case False


                        MsgBox("nicht möglich")


                End Select

            Case 39, 68


                Select Case wegfrei


                    Case True


                        Me.Controls(Me.Controls.IndexOfKey("roboter")).Left += 75

                        schritte = schritte + 1

                        schritte_ausg.Text = schritte


                    Case False


                        MsgBox("nicht möglich")


                End Select

            Case 40, 83


                Select Case wegfrei


                    Case True


                        Me.Controls(Me.Controls.IndexOfKey("roboter")).Top += 75

                        schritte = schritte + 1

                        schritte_ausg.Text = schritte


                    Case False


                        MsgBox("nicht möglich")


                End Select

        End Select


        If Field.Feld(Me.Controls(Me.Controls.IndexOfKey("roboter")).Location.X, Me.Controls(Me.Controls.IndexOfKey("roboter")).Location.Y) = 3 Then


            Call schieben()


        End If

        Call check()


    End Sub


    Private Sub schieben()


        With Me.Controls(Me.Controls.IndexOfKey("kiste"))


            Select Case position

                Case "rechts"

                    Me.Controls(Me.Controls.IndexOfKey("kiste")).Left = Me.Controls(Me.Controls.IndexOfKey("kiste")).Left - 75


                Case "links"

                    Me.Controls(Me.Controls.IndexOfKey("kiste")).Left = Me.Controls(Me.Controls.IndexOfKey("kiste")).Left + 75


                Case "drüber"

                    Me.Controls(Me.Controls.IndexOfKey("kiste")).Top = Me.Controls(Me.Controls.IndexOfKey("kiste")).Top + 75


                Case "drunter"

                    Me.Controls(Me.Controls.IndexOfKey("kiste")).Top = Me.Controls(Me.Controls.IndexOfKey("kiste")).Top - 75


            End Select


        End With


    End Sub


    Private Sub check()


        If Me.Controls(Me.Controls.IndexOfKey("roboter")).Left = Me.Controls(Me.Controls.IndexOfKey("ziel")).Left And Me.Controls(Me.Controls.IndexOfKey("roboter")).Top = Me.Controls(Me.Controls.IndexOfKey("ziel")).Top Then


            MsgBox("Stufe geschafft" & "Benötigte Schritte: " & schritte)

            level = level + 1

            Me.Controls.Clear()

            Call stufen()

        Else


        End If

    End Sub


    Private Sub stufen()

        Select Case level

            Case 1

                Field = New Game("C:\Users\Marvin\Desktop\Informatik2\Informatik-Sokoban-17.05.2010\Informatik-Sokoban-17.05.2010\LEVEL\1.txt")

            Case 2

                Field = New Game("C:\Users\Marvin\Desktop\Informatik2\Informatik-Sokoban-17.05.2010\Informatik-Sokoban-17.05.2010\LEVEL\2.txt")

            Case 3

                Field = New Game("C:\Users\Marvin\Desktop\Informatik2\Informatik-Sokoban-17.05.2010\Informatik-Sokoban-17.05.2010\LEVEL\3.txt")

            Case 4

                Field = New Game("C:\Users\Marvin\Desktop\Informatik2\Informatik-Sokoban-17.05.2010\Informatik-Sokoban-17.05.2010\LEVEL\4.txt")

            Case 5

                Field = New Game("C:\Users\Marvin\Desktop\Informatik2\Informatik-Sokoban-17.05.2010\Informatik-Sokoban-17.05.2010\LEVEL\5.txt")

            Case 6

                MsgBox("Herzlichen Glückwunsch. Du hast das Spiel gewonnen. Das Programm wird nun beendet")

                Me.Close()

        End Select


        For x As Integer = 0 To 7

            For y As Integer = 0 To 7

                Dim baustein As New PictureBox

                Dim baustein2 As New PictureBox

                Select Case Field.Feld(x, y)

                    Case 0

                        Me.Controls.Add(baustein)

                        With baustein


                            .Parent = Me

                            .Name = "boden" & (x + (y * 2))

                            .Left = 75 * x

                            .Top = 75 * y

                            .Height = 75

                            .Width = 75

                            .BackgroundImage = My.Resources.Boden

                            .SendToBack()


                        End With

                    Case 1

                        Me.Controls.Add(baustein)

                        With baustein


                            .Parent = Me

                            .Name = "mauer" & (x + (y * 2))

                            .Left = 75 * x

                            .Top = 75 * y

                            .Height = 75

                            .Width = 75

                            .BackgroundImage = My.Resources.Mauer

                            .SendToBack()


                        End With

                    Case 2

                        Me.Controls.Add(baustein)

                        Me.Controls.Add(baustein2)

                        With baustein


                            .Parent = Me

                            .Name = "boden" & (x + (y * 2))

                            .Left = 75 * x

                            .Top = 75 * y

                            .Height = 75

                            .Width = 75

                            .BackgroundImage = My.Resources.Boden

                            .SendToBack()


                        End With

                        With baustein2


                            .Parent = Me

                            .Name = "roboter"

                            .Left = 75 * x

                            .Top = 75 * y

                            .Height = 75

                            .Width = 75

                            .BackgroundImage = My.Resources.Roboter

                            .BringToFront()


                        End With

                    Case 3

                        Me.Controls.Add(baustein)

                        Me.Controls.Add(baustein2)

                        With baustein


                            .Parent = Me

                            .Name = "boden" & (x + (y * 2))

                            .Left = 75 * x

                            .Top = 75 * y

                            .Height = 75

                            .Width = 75

                            .BackgroundImage = My.Resources.Boden

                            .SendToBack()


                        End With

                        With baustein2


                            .Parent = Me

                            .Name = "kiste" & (x + (y * 2))

                            .Left = 75 * x

                            .Top = 75 * y

                            .Height = 75

                            .Width = 75

                            .BackgroundImage = My.Resources.Kiste

                            .BringToFront()


                        End With

                    Case 4

                        Me.Controls.Add(baustein)

                        With baustein


                            .Parent = Me

                            .Name = "ziel" & (x + (y * 2))

                            .Left = 75 * x

                            .Top = 75 * y

                            .Height = 75

                            .Width = 75

                            .BackgroundImage = My.Resources.Ziel

                            .BringToFront()


                        End With

                End Select


            Next

        Next

        'end

    End Sub

End Class

Game.vb:
Public Class Game

    Public Feld(,) As Integer


    Public Sub New(ByVal file As String)


        'auslesen

        Dim inhalt As New List(Of String)

        inhalt.AddRange(IO.File.ReadAllText(file).Split(CChar(" ")))


        Dim k(7, 7) As Integer


        'auswerten

        For x As Integer = 0 To 7

            For y As Integer = 0 To 7

                k(x, y) = CInt(CStr(inhalt(x)(y)))

            Next

        Next


        Feld = k

    End Sub

End Class
Mein derzeitiges Problem ist ein IndexOutOfRangeException-Fehler, welcher an folgender Stelle in der Form1.vb auftritt, wenn ich eine Pfeiltaste drücke (und somit das keydown Event anspreche)
[...]

Select Case Field.Feld(Me.Controls(Me.Controls.IndexOfKey("roboter")).Location.X - 1, Me.Controls(Me.Controls.IndexOfKey("roboter")).Location.Y)


            Case 0


[...]

Ich stehe völlig auf dem Schlauch. Ich hab echt keine Ahnung wodurch der Fehler entsteht.

Ich würde mich über eine Hilfreiche Antwort sehr freuen!

Mit freundlichen Grüßen,

marvin_hubert

Geschrieben (bearbeitet)

Hallo,

Ich habe leider nur Visual Studio Express für c# deshalb kann ich deinen Code gerade nicht kopieren.

Ich vermute aber es liegt am folgendem:

Die Methode IndexOfKey der Klasse Control.ControlCollection die Du hier aufrufst


Me.Controls.IndexOfKey("roboter")

gibt wie alle "IndexOf" - Methoden den Wert -1 für eine nicht gefundenes Objekt zurück. -1 ist ein Index der bei einem Array / einer Liste / einer Colelction / etc. nicht möglich ist da der kleinste vergebene Index immer 0 ist. Wenn der Ausdruck

Me.Controls.IndexOfKey("roboter")

also den Wert -1 liefert führt dieser Ausdruck

Me.Controls(Me.Controls.IndexOfKey("roboter"))

zu der angezeigten Expcetion. Das wird daran Liegen, dass die Methode "IndexOfKey" nicht rekursiv arbeitet. Die Form (mit "Me" angesprochen) hat keine Control mit dem Namen "roboter", sondern nur sagen wir ein Panel. Das Panel wiederum beinhaltet dann die gesuchte Control mit dem Namen "roboter". Also musst statt in der Form (also "Me") in dem Panel suchen.

[U]Panel1[/U].Controls(Panel1[I][/I].Controls.IndexOfKey("roboter"))

Wenn Du keine Ahnung hast was der Parent der gesuchten Control ist musst Du eine rekursive Such Mehtode schreiben und die Dann mit dem TopParent (in dem Fall die Form also "Me") aufrufen:

// Ist jetzt C# Code sollte aber gut umzumünzen sein

private int findIndexOfControl(Control parent, String key)

{

[INDENT]

if (parent.Controls.IndexOfKey(key) != -1)

{

[INDENT] 

// Wenn das Element gefunden wurde wird der Index zurück geben.

return parent.Controls.IndexOfKey(key);

[/INDENT]


}

else

{

[INDENT]

int gesuchterIndex = -1;

// Hier erfolgt der Rekursive aufruf der Suchmethode und zwar so lange bis

// alles durchsucht wurde oder das Control gefunden wurde.

for (int i = 0; i < parent.Controls.Count && gesuchterIndex == -1; i++)

{

[INDENT]

gesuchterIndex = findIndexOfControl(parent.Controls[i], key);

[/INDENT]


}

return gesuchterIndex;[/INDENT]

}

[/INDENT]

}

der Aufruf der Methode erfolgt dann Mittels

findIndexOfControl(Me, "roboter");

Bearbeitet von Mcolli
Geschrieben

Hmm... hab da leider meine Schwierigkeiten im Umwandeln :/

soweit bekomme ich es ja noch hin:

private function findIndexOfControl(Control parent, String key) as integer

if parent.Controls.IndexOfKey(key) <> -1 then

return parent.Controls.IndexOfKey(key)

else

dim gesuchterIndex as integer = -1

/*hier fängt es an zu hapern

for (int i = 0; i < parent.Controls.Count && gesuchterIndex == -1; i++) {

gesuchterIndex = findIndexOfControl(parent.Controls, key);

/*hier hört es auf zu hapern

return gesuchterIndex

end function

bitte um Hilfe :/

Gruß

Geschrieben

Hab wie gesagt keine Entwicklungsumgebung (IDE) die VB unterstützt aber wenn ich an meine gehassten VBA-Makros zurück denke müsste das so aussehen (also nur der Teil wo es harpert):


for i as Integer = 0 To parent.Controls.Count

gesuchterIndex = findIndexOfControl(parent.Controls(i), key); 

if gesuchterIndex <> -1 then EXIT FOR

Next

Wenn Du allerdings weisst was der Container deines "Roboter" Controls ist kannst Du Dir die Suchmethode schenken und einfach:
[I]Containername[/I].Controls.IndexOfKey("roboter")

schreiben um an den Index des Controls zu kommen.

Ein Container ist das Übergeordnete "Steuer"-Element ... Also ein Panel zum Beispiel.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...