Sokoban Klon - Thread von hammerdollen

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Sokoban Klon - Thread von hammerdollen

    So hier habe ich mal vorsichtshalber einen ganzen Thread aufgemacht.
    Bei meinem Projekt handelt es sich um einen, eher spartanisch gehaltenen, Sokoban-Klon.
    Ich lerne Visual Basic nun seit ca 5 Monaten(in der Schule), daher würde ich mir bitte schlagfertige Äußerungen über meinen Programmierstil verbieten.

    Das einzige was noch fehlt, ist das festlegen der nicht überquerbaren Flächen (das bekomme ich noch nicht so richtig hin :/)

    Hier einmal den Code:


    Form1.vb

    Quellcode

    1. Public Class Form1
    2. Private Field As level
    3. Public robo As New PictureBox
    4. Public kiste As New PictureBox
    5. Public position As String
    6. Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    7. Field = New level("C:\Users\Marvin\Documents\Visual Studio 2010\Projects\Infoprojekt\Infoprojekt\level\1.txt")
    8. With robo
    9. .Parent = Me
    10. .Tag = "roboter"
    11. .Name = "roboter"
    12. .Height = 75
    13. .Width = 75
    14. .Location = New Point(75, 75)
    15. .Enabled = True
    16. .BackgroundImage = My.Resources.Boden
    17. .Image = My.Resources.Roboter
    18. End With
    19. With kiste
    20. .Parent = Me
    21. .Tag = "kiste"
    22. .Name = "kiste"
    23. .Height = 75
    24. .Width = 75
    25. .Location = New Point(225, 225)
    26. .Enabled = True
    27. .BackgroundImage = My.Resources.Boden
    28. .Image = My.Resources.Kiste
    29. End With
    30. 'start
    31. For x As Integer = 0 To Field.Size.Width - 1
    32. For y As Integer = 0 To Field.Size.Height - 1
    33. Dim bausteine As New PictureBox
    34. With bausteine
    35. .Parent = Me
    36. .Tag = New Point(x, y)
    37. .Height = 75
    38. .Width = 75
    39. .Left = 75 * x
    40. .Top = 75 * y
    41. .SizeMode = PictureBoxSizeMode.StretchImage ' damit das Bild bei jeder Größe passt
    42. If Field.Field(x, y) = 0 Then
    43. bausteine.Image = My.Resources.Boden
    44. bausteine.Name = "boden"
    45. ElseIf Field.Field(x, y) = 1 Then
    46. .Image = My.Resources.Mauer
    47. bausteine.Name = "mauer"
    48. ElseIf Field.Field(x, y) = 2 Then
    49. bausteine.Image = My.Resources.Ziel
    50. bausteine.Name = "ziel"
    51. End If
    52. End With
    53. Next
    54. Next
    55. 'end
    56. End Sub
    57. Public Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    58. Select Case e.KeyValue
    59. Case 37, 65
    60. robo.Left -= 75
    61. Case 38, 87
    62. robo.Top -= 75
    63. Case 39, 68
    64. robo.Left += 75
    65. Case 40, 83
    66. robo.Top += 75
    67. End Select
    68. If kiste.Location.X = robo.Location.X + 75 And kiste.Location.Y = robo.Location.Y Then
    69. position = "links"
    70. 'MsgBox(position)
    71. End If
    72. 'Rechts
    73. If kiste.Location.X = robo.Location.X - 75 And kiste.Location.Y = robo.Location.Y Then
    74. position = "rechts"
    75. 'MsgBox(position)
    76. End If
    77. 'Unten
    78. If kiste.Location.X = robo.Location.X And kiste.Location.Y = robo.Location.Y - 75 Then
    79. position = "unten"
    80. 'MsgBox(position)
    81. End If
    82. 'Oben
    83. If kiste.Location.X = robo.Location.X And kiste.Location.Y = robo.Location.Y + 75 Then
    84. position = "oben"
    85. 'MsgBox(position)
    86. End If
    87. If robo.Location.X = kiste.Location.X And robo.Location.Y = kiste.Location.Y Then
    88. Call schieben()
    89. End If
    90. End Sub
    91. Private Function schieben()
    92. With kiste
    93. Select Case position
    94. Case "rechts"
    95. kiste.Left = kiste.Left - 75
    96. Case "links"
    97. kiste.Left = kiste.Left + 75
    98. Case "oben"
    99. kiste.Top = kiste.Top + 75
    100. Case "unten"
    101. kiste.Top = kiste.Top - 75
    102. End Select
    103. End With
    104. schieben = 1
    105. End Function
    106. End Class


    level.vb

    Quellcode

    1. Public Class level
    2. Private f(,) As Integer ' das Feld bestehend aus Indices
    3. Private usef(,) As Integer
    4. Private s As Size ' Feldgröße
    5. Private orig_hero As Point
    6. Public Sub New(ByVal file As String)
    7. 'auslesen
    8. Dim abc As New List(Of String)
    9. abc.AddRange(IO.File.ReadAllText(file).Split(CChar(" ")))
    10. Dim width, height As Integer
    11. width = abc(0).Length
    12. height = abc.Count
    13. Dim k(width, height) As Integer
    14. s = New Size(width, height)
    15. 'auswerten
    16. For x As Integer = 0 To width - 1
    17. For y As Integer = 0 To height - 1
    18. k(x, y) = CInt(CStr(abc(y)(x)))
    19. Next
    20. Next
    21. f = k
    22. usef = f
    23. End Sub
    24. Public ReadOnly Property Size() As Size
    25. Get
    26. Return s
    27. End Get
    28. End Property
    29. Public ReadOnly Property OriginalField() As Integer(,)
    30. Get
    31. Return f
    32. End Get
    33. End Property
    34. Public Property Field() As Integer(,)
    35. Get
    36. Return usef
    37. End Get
    38. Set(ByVal value As Integer(,))
    39. usef = value
    40. End Set
    41. End Property
    42. End Class


    Ich würde mich seeeeeeeeeeehr über Verbesserungsvorschläge und allgemeine Unterstützung freuen, da es sich dabei um ein Schulprojekt handelt, welches für mich entscheidend für di Versetzung ist, da die gesamte Info-Note aus diesem Projekt hervorgeht.


    Hocherfreut,

    hammerdollen
    Ich habe mir eher etwas so in der Art vorgestellt:

    Picturebox a (Spielfigur) wird verschoben, nun greift eine Funktion, welche überprüfen soll, ob die Position.X oder Position.Y der Spielfigur um eine Spielfigurbreite/Spielfigurhöhe ( in meinem Fall 75px) von dem Objekt (in meinem Fall die Mauer) entfernt ist.
    Nun soll die Funktion verhindern, dass man die SPielfigur über das Objekt hinaus bewegen kann.

    In der Theorie habe ich mir viele Gedanken darüber gemacht, jedoch haperts an der Umsetzung :(.
    Wenn mir jemand einen Kommentierten Beispielcode schreiben könnte (bzw einen kleinen Teil, damit ich sehen kann wie es in etwa geht, Ihr sollt ja nicht meine ganze Arbeit machen ;) und ich soll ja etwas daraus lernen) wäre ich bestens bedient.

    Hochachtungsvoll,

    hammerdollen
    oho sogar Hochachtungsvoll^^

    ich geb dir nur Pseudo Code :P

    Quellcode

    1. Wenn X1+Breite1 >= X2 UNDAUCH X1 <= X2 + Breite2
    2. Wenn Y1+Höhe1 >= Y2 UNDAUCH Y1 <= Y2 + Höhe2
    3. KOLLISION

    sollte doch kein Problem darstellen das umzusetzen...

    P.S.: Wenn du schon kein DX verwenden willst, dann nimm doch pls wenigstens GDI+ ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Also es ist insofern nicht das Problem dass ich dx oder GDI nicht nehmen mag, aber mein Prof haut mich dann in die Pfanne, er merkt sofort, dass ich des noch nicht drauf habe, weil wir des bei ihm nicht mal ansatzweise durchgenommen haben :)


    // Problem:

    Wenn ich per For-Next Schleife

    Quellcode

    1. For x As Integer = 1 To 8
    2. For y As Integer = 1 To 8
    3. Dim feld As New PictureBox
    4. With feld
    5. .BringToFront() 'Stellt sicher, dass die PixtureBox sichtbar ist (z-index wird aufgehoben)
    6. .Enabled = True
    7. .Parent = Me
    8. .SizeMode = PictureBoxSizeMode.StretchImage
    9. .Tag = "boden"
    10. .Name = "boden"
    11. .Image = My.Resources.Boden
    12. .Height = 75
    13. .Width = 75
    14. .Left = 75 * x
    15. .Top = 75 * y
    16. If feld.Location.X = 75 Then
    17. .Tag = "mauer"
    18. .Name = "mauer"
    19. .Image = My.Resources.Mauer
    20. ElseIf feld.Location.X = 600 Then
    21. .Tag = "mauer"
    22. .Name = "mauer"
    23. .Image = My.Resources.Mauer
    24. ElseIf feld.Location.Y = 75 Then
    25. .Tag = "mauer"
    26. .Name = "mauer"
    27. .Image = My.Resources.Mauer
    28. ElseIf feld.Location.Y = 600 Then
    29. .Tag = "mauer"
    30. .Name = "mauer"
    31. .Image = My.Resources.Mauer
    32. End If
    33. End With
    34. Next
    35. Next


    ein 8x8 PB großes Feld erstelle, wie schaffe ich es dann die einzelnen PBs zu "nutzen" sprich

    If roboter.location.x = mauer.location.x -75 then
    blablabla

    (alle meine PBs die während der Schleife entstehen sollten "mauer" heissen)

    Könnt Ihr mir einen Tipp geben, wie ich dies verändern könnte?

    Danke im Vorraus für Eure Antworten :)

    hammerdollen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hammerdollen“ ()

    Me.Controls("ControlName") dann machst du einfach TextBoxen mit Indicies und kannst entsprechend alle auslesen...

    Edit: musst du das machen, hat er das genau so gesagt? Weil ich finde es blöd wenn ihr das direkt falsch lernt...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Jup, so waren die Vorraussetzungen :/

    welche u.A. auch noch sind:

    -Level aus Textdatei laden lassen
    -Mithilfe eines Timers jeden Schritt der FIgur verfolgen und ebenfalls in einer Textdatei abspeichern, um sie später auslesen zu können (eine Art "replay" sagte er)

    So ich habe das Programm nun erst einmal wieder etwas abgespeckt. Ich fange noch einmal an:

    Quellcode

    1. Public Class Form1
    2. Public i As Integer = 1
    3. Dim position As String
    4. Dim robo As New PictureBox 'Deklarierung des Roboters als neue PictureBox
    5. Dim kiste As New PictureBox 'Deklarierung der Kiste als neue PictureBox
    6. Dim positionr As Point = robo.Location 'Position des Roboters
    7. Dim positionk = kiste.Location ' Position der Kiste
    8. Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    9. With robo
    10. .BringToFront() 'Stellt sicher, dass die PixtureBox sichtbar ist (z-index wird aufgehoben)
    11. .Enabled = True
    12. .Parent = Me
    13. .SizeMode = PictureBoxSizeMode.StretchImage
    14. .Tag = "Roboter"
    15. .Name = "Roboter"
    16. .BackgroundImage = My.Resources.Boden
    17. .Image = My.Resources.Roboter
    18. .Height = 75
    19. .Width = 75
    20. .Left = 150
    21. .Top = 150
    22. End With
    23. With kiste
    24. .BringToFront() 'Stellt sicher, dass die PixtureBox sichtbar ist (z-index wird aufgehoben)
    25. .Enabled = True
    26. .Parent = Me
    27. .SizeMode = PictureBoxSizeMode.StretchImage
    28. .Tag = "Kiste"
    29. .Name = "Kiste"
    30. .BackgroundImage = My.Resources.Boden
    31. .Image = My.Resources.Kiste
    32. .Height = 75
    33. .Width = 75
    34. .Left = 225
    35. .Top = 225
    36. End With
    37. Select Case i
    38. Case 1
    39. For x As Integer = 1 To 8
    40. For y As Integer = 1 To 8
    41. Dim feld As New PictureBox
    42. With feld
    43. .BringToFront() 'Stellt sicher, dass die PixtureBox sichtbar ist (z-index wird aufgehoben)
    44. .Enabled = True
    45. .Parent = Me
    46. .SizeMode = PictureBoxSizeMode.StretchImage
    47. .Tag = "boden"
    48. .Name = "boden"
    49. .Image = My.Resources.Boden
    50. .Height = 75
    51. .Width = 75
    52. .Left = 75 * x
    53. .Top = 75 * y
    54. If feld.Location.X = 75 Then
    55. .Tag = "mauer"
    56. .Name = "mauer"
    57. .Image = My.Resources.Mauer
    58. ElseIf feld.Location.X = 600 Then
    59. .Tag = "mauer"
    60. .Name = "mauer"
    61. .Image = My.Resources.Mauer
    62. ElseIf feld.Location.Y = 75 Then
    63. .Tag = "mauer"
    64. .Name = "mauer"
    65. .Image = My.Resources.Mauer
    66. ElseIf feld.Location.Y = 600 Then
    67. .Tag = "mauer"
    68. .Name = "mauer"
    69. .Image = My.Resources.Mauer
    70. End If
    71. End With
    72. Next
    73. Next
    74. End Select
    75. End Sub
    76. Public Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    77. Select Case e.KeyValue
    78. Case 37, 65
    79. robo.Left -= 75
    80. Case 38, 87
    81. robo.Top -= 75
    82. Case 39, 68
    83. robo.Left += 75
    84. Case 40, 83
    85. robo.Top += 75
    86. End Select
    87. If kiste.Location.X = robo.Location.X + 75 And kiste.Location.Y = robo.Location.Y Then
    88. position = "links"
    89. End If
    90. 'Rechts
    91. If kiste.Location.X = robo.Location.X - 75 And kiste.Location.Y = robo.Location.Y Then
    92. position = "rechts"
    93. End If
    94. 'Unten
    95. If kiste.Location.X = robo.Location.X And kiste.Location.Y = robo.Location.Y - 75 Then
    96. position = "unten"
    97. End If
    98. 'Oben
    99. If kiste.Location.X = robo.Location.X And kiste.Location.Y = robo.Location.Y + 75 Then
    100. position = "oben"
    101. End If
    102. If robo.Location.X = kiste.Location.X And robo.Location.Y = kiste.Location.Y Then
    103. Call schieben()
    104. End If
    105. End Sub
    106. Private Function schieben()
    107. With kiste
    108. Select Case position
    109. Case "rechts"
    110. kiste.Left = kiste.Left - 75
    111. Case "links"
    112. kiste.Left = kiste.Left + 75
    113. Case "oben"
    114. kiste.Top = kiste.Top + 75
    115. Case "unten"
    116. kiste.Top = kiste.Top - 75
    117. End Select
    118. End With
    119. schieben = 1
    120. End Function
    121. End Class


    Bewegen der Figur und Schieben der Kiste funktioniert einwandfrei.
    Nun möchte ich, dass die Kiste(und natührlich auch die Figur) vor der Mauer halt macht, heisst sie nicht überqueren kann.
    Ich würde es ja einfach mit einer If-Abfrage regeln, jedoch kann ich "mauer" nicht verwenden, obwohl ich die pictureboxen während der Schleife genauso benannte habe :/
    Ich verzweifle

    hammerdollen
    mach doch den Teil:

    VB.NET-Quellcode

    1. If feld.Location.X = 75 Then
    2. .Tag = "mauer"
    3. .Name = "mauer"
    4. .Image = My.Resources.Mauer
    5. ElseIf feld.Location.X = 600 Then
    6. .Tag = "mauer"
    7. .Name = "mauer"
    8. .Image = My.Resources.Mauer
    9. ElseIf feld.Location.Y = 75 Then
    10. .Tag = "mauer"
    11. .Name = "mauer"
    12. .Image = My.Resources.Mauer
    13. ElseIf feld.Location.Y = 600 Then
    14. .Tag = "mauer"
    15. .Name = "mauer"
    16. .Image = My.Resources.Mauer
    17. End If


    mal einfacher...bzw. die If abfragen kannst du ja allgemein alle bleiben lassen oder nicht?! eins muss ja True sein,sonst hätte es gar keinen sinn...xD aber egal...mach bei .Name = "mauer"
    einfach .Name = "mauer" & (x+(y-1)*8-1)
    somit hat jede Mauer einen eindeutigen Namen... also "mauer0","mauer1","mauer2" usw...leichter wäre es, wenn du die Schleife bei 0 beginnen würdest...: .Name = "mauer" & (x+y*8)

    Edit: achja bitte VB CodeTags verwenden ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Danke für Deine schnelle Antwort :)

    gesagt getan, nur leider funktionierts noch nicht so, wie ich es möchte. Ich möchte im Programm eine Überprüfungsfunktion schreiben, welche die roboterposition mit der der umliegenden mauern vergleicht, und wenn die Positionen übereinstimmen, dass sich der Roboter dann wieder zurückbewegt (Ausgangsrichtung)

    Freue mich über eine Antwort

    hammerdollen
    um diesen codeausschnitt dreht es sich:

    VB.NET-Quellcode

    1. For x As Integer = 0 To 9
    2. For y As Integer = 0 To 9
    3. Dim bausteine As New PictureBox
    4. With bausteine
    5. .Parent = Me
    6. .Tag = New Point(x, y)
    7. .Height = 75
    8. .Width = 75
    9. .Left = 75 * x
    10. .Top = 75 * y
    11. .SizeMode = PictureBoxSizeMode.StretchImage ' damit das Bild bei jeder Größe passt
    12. If Field.Field(x, y) = 0 Then
    13. .BackColor = Color.Black
    14. ElseIf Field.Field(x, y) = 1 Then
    15. .Image = My.Resources.Mauer
    16. .Name = "New Point(x, y)"
    17. ElseIf Field.Field(x, y) = 2 Then
    18. .Image = My.Resources.Boden
    19. .Name = "boden"
    20. ElseIf Field.Field(x, y) = 3 Then
    21. .Image = My.Resources.Ziel
    22. .Name = "ziel"
    23. End If
    24. End With
    25. Next
    26. Next



    ich möchte später auf diese dynamisch erstellten pictureboxen zugreifen, um z.b. eine kollisionsabfrage zu ermöglichen.

    hammerdollen
    .Tag = New Point(x, y)
    völlig unnötig...
    .Name = "New Point(x, y)"
    ka was du damit erreichen willst, warum machst du es jetzt nicht wie ich gesagt hatte?

    .Name = "mauer" & (x+y*9)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    So, habe das Programm "etwas" umgeschrieben:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Field As Game
    3. Dim position As String
    4. Dim schritte As Integer = 0
    5. Dim level As Integer = 1
    6. Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    7. Call stufen()
    8. End Sub
    9. Public Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    10. Select Case e.KeyValue
    11. Case 37, 65
    12. Me.Controls("roboter").Left -= 75
    13. 'If Me.Controls("roboter").Left = Me.Controls("boden").Left - 75 And Me.Controls("roboter").Top = Me.Controls("boden").Top Then
    14. 'schritte = schritte + 1
    15. If Me.Controls("roboter").Location.X = Me.Controls("mauer").Location.X And Me.Controls("roboter").Location.Y = Me.Controls("mauer").Location.Y Then
    16. Me.Controls("roboter").Left += 75
    17. End If
    18. Case 38, 87
    19. Me.Controls("roboter").Top -= 75
    20. If Me.Controls("roboter").Location.X = Me.Controls("boden").Location.X And Me.Controls("roboter").Location.Y = Me.Controls("boden").Location.Y Then
    21. schritte = schritte + 1
    22. End If
    23. Case 39, 68
    24. Me.Controls("roboter").Left += 75
    25. If Me.Controls("roboter").Left = Me.Controls("boden").Left And Me.Controls("roboter").Top = Me.Controls("boden").Top Then
    26. schritte = schritte + 1
    27. End If
    28. Case 40, 83
    29. Me.Controls("roboter").Top += 75
    30. If Me.Controls("roboter").Left = Me.Controls("boden").Left And Me.Controls("roboter").Top = Me.Controls("boden").Top Then
    31. schritte = schritte + 1
    32. End If
    33. End Select
    34. If Me.Controls("kiste").Location.X = Me.Controls("roboter").Location.X + 75 And Me.Controls("kiste").Location.Y = Me.Controls("roboter").Location.Y Then
    35. position = "links"
    36. End If
    37. 'Rechts
    38. If Me.Controls("kiste").Location.X = Me.Controls("roboter").Location.X - 75 And Me.Controls("kiste").Location.Y = Me.Controls("roboter").Location.Y Then
    39. position = "rechts"
    40. End If
    41. 'Unten
    42. If Me.Controls("kiste").Location.X = Me.Controls("roboter").Location.X And Me.Controls("kiste").Location.Y = Me.Controls("roboter").Location.Y - 75 Then
    43. position = "unten"
    44. 'MsgBox(position)
    45. End If
    46. 'Oben
    47. If Me.Controls("kiste").Location.X = Me.Controls("roboter").Location.X And Me.Controls("kiste").Location.Y = Me.Controls("roboter").Location.Y + 75 Then
    48. position = "oben"
    49. 'MsgBox(position)
    50. End If
    51. If Me.Controls("roboter").Location.X = Me.Controls("kiste").Location.X And Me.Controls("roboter").Location.Y = Me.Controls("kiste").Location.Y Then
    52. Call schieben()
    53. End If
    54. Call check()
    55. End Sub
    56. Private Sub schieben()
    57. With Me.Controls("kiste")
    58. Select Case position
    59. Case "rechts"
    60. Me.Controls("kiste").Left = Me.Controls("kiste").Left - 75
    61. Case "links"
    62. Me.Controls("kiste").Left = Me.Controls("kiste").Left + 75
    63. Case "oben"
    64. Me.Controls("kiste").Top = Me.Controls("kiste").Top + 75
    65. Case "unten"
    66. Me.Controls("kiste").Top = Me.Controls("kiste").Top - 75
    67. End Select
    68. End With
    69. End Sub
    70. Private Sub check()
    71. If Me.Controls("kiste").Location = Me.Controls("ziel").Location Then
    72. MsgBox("Stufe geschafft")
    73. level = level + 1
    74. Me.Controls.Clear()
    75. Call stufen()
    76. End If
    77. End Sub
    78. Private Sub stufen()
    79. Select Case level
    80. Case 1
    81. Field = New Game("C:\Users\Marvin\Desktop\Informatik2\Informatik-Sokoban-17.05.2010\Informatik-Sokoban-17.05.2010\LEVEL\1.txt")
    82. Case 2
    83. Field = New Game("C:\Users\Marvin\Desktop\Informatik2\Informatik-Sokoban-17.05.2010\Informatik-Sokoban-17.05.2010\LEVEL\2.txt")
    84. Case 3
    85. Field = New Game("C:\Users\Marvin\Desktop\Informatik2\Informatik-Sokoban-17.05.2010\Informatik-Sokoban-17.05.2010\LEVEL\3.txt")
    86. Case 4
    87. Field = New Game("C:\Users\Marvin\Desktop\Informatik2\Informatik-Sokoban-17.05.2010\Informatik-Sokoban-17.05.2010\LEVEL\4.txt")
    88. Case 5
    89. Field = New Game("C:\Users\Marvin\Desktop\Informatik2\Informatik-Sokoban-17.05.2010\Informatik-Sokoban-17.05.2010\LEVEL\5.txt")
    90. Case 6
    91. MsgBox("Herzlichen Glückwunsch. Du hast das Spiel gewonnen")
    92. End Select
    93. For x As Integer = 0 To 7
    94. For y As Integer = 0 To 7
    95. Select Case Field.Field(x, y)
    96. Case 0
    97. Dim boden As New PictureBox
    98. Me.Controls.Add(boden)
    99. With boden
    100. boden.Name = "boden"(x + (y - 1) * 8).ToString
    101. Me.Controls("boden" & (x + (y - 1) * 8)).Left = 75 * x (*)
    102. Me.Controls("boden" & (x + (y - 1) * 8)).Top = 75 * y (*)
    103. Me.Controls("boden" & (x + (y - 1) * 8)).Height = 75
    104. Me.Controls("boden" & (x + (y - 1) * 8)).Width = 75
    105. Me.Controls("boden" & (x + (y - 1) * 8)).BackgroundImage = My.Resources.Boden
    106. Me.Controls("boden" & (x + (y - 1) * 8)).SendToBack()
    107. End With
    108. Case 1
    109. Dim mauer As New PictureBox
    110. Me.Controls.Add(mauer)
    111. With mauer
    112. .Name = "mauer" & (x + (y - 1) * 8).ToString
    113. Me.Controls("mauer" & (x + (y - 1) * 8)).Left = 75 * x (*)
    114. Me.Controls("mauer" & (x + (y - 1) * 8)).Top = 75 * y (*)
    115. Me.Controls("mauer" & (x + (y - 1) * 8)).Height = 75
    116. Me.Controls("mauer" & (x + (y - 1) * 8)).Width = 75
    117. Me.Controls("mauer" & (x + (y - 1) * 8)).BackgroundImage = My.Resources.Mauer
    118. Me.Controls("mauer" & (x + (y - 1) * 8)).SendToBack()
    119. End With
    120. Case 2
    121. Dim untergrund1 As New PictureBox
    122. Dim roboter As New PictureBox
    123. Me.Controls.Add(untergrund1)
    124. Me.Controls.Add(roboter)
    125. With untergrund1
    126. untergrund1.Name = "boden" & (x + (y - 1) * 8).ToString
    127. Me.Controls("boden" & (x + (y - 1) * 8)).Left = 75 * x (*)
    128. Me.Controls("boden" & (x + (y - 1) * 8)).Top = 75 * y (*)
    129. Me.Controls("boden" & (x + (y - 1) * 8)).Height = 75
    130. Me.Controls("boden" & (x + (y - 1) * 8)).Width = 75
    131. Me.Controls("boden" & (x + (y - 1) * 8)).BackgroundImage = My.Resources.Boden
    132. Me.Controls("boden" & (x + (y - 1) * 8)).SendToBack()
    133. End With
    134. With roboter
    135. roboter.Name = "roboter"
    136. Me.Controls("roboter" & (x + (y - 1) * 8)).Left = 75 * x (*)
    137. Me.Controls("roboter" & (x + (y - 1) * 8)).Top = 75 * y (*)
    138. Me.Controls("roboter" & (x + (y - 1) * 8)).Height = 75
    139. Me.Controls("roboter" & (x + (y - 1) * 8)).Width = 75
    140. Me.Controls("roboter" & (x + (y - 1) * 8)).BackgroundImage = My.Resources.Boden
    141. Me.Controls("roboter" & (x + (y - 1) * 8)).BringToFront()
    142. End With
    143. Case 3
    144. Dim untergrund2 As New PictureBox
    145. Dim kiste As New PictureBox
    146. Me.Controls.Add(untergrund2)
    147. Me.Controls.Add(kiste)
    148. With untergrund2
    149. untergrund2.Name = "boden" & (x + (y - 1) * 8).ToString
    150. Me.Controls("boden" & (x + (y - 1) * 8)).Left = 75 * x (*)
    151. Me.Controls("boden" & (x + (y - 1) * 8)).Top = 75 * y (*)
    152. Me.Controls("boden" & (x + (y - 1) * 8)).Height = 75
    153. Me.Controls("boden" & (x + (y - 1) * 8)).Width = 75
    154. Me.Controls("boden" & (x + (y - 1) * 8)).BackgroundImage = My.Resources.Boden
    155. Me.Controls("boden" & (x + (y - 1) * 8)).SendToBack()
    156. End With
    157. With kiste
    158. kiste.Name = "kiste" & (x + (y - 1) * 8).ToString
    159. Me.Controls("kiste" & (x + (y - 1) * 8)).Left = 75 * x (*)
    160. Me.Controls("kiste" & (x + (y - 1) * 8)).Top = 75 * y (*)
    161. Me.Controls("kiste" & (x + (y - 1) * 8)).Height = 75
    162. Me.Controls("kiste" & (x + (y - 1) * 8)).Width = 75
    163. Me.Controls("kiste" & (x + (y - 1) * 8)).BackgroundImage = My.Resources.Kiste
    164. Me.Controls("kiste" & (x + (y - 1) * 8)).BringToFront()
    165. End With
    166. Case 4
    167. Dim ziel As New PictureBox
    168. Me.Controls.Add(ziel)
    169. With ziel
    170. ziel.Name = "ziel" & (x + (y - 1) * 8).ToString
    171. Me.Controls("ziel" & (x + (y - 1) * 8)).Left = 75 * x
    172. Me.Controls("ziel" & (x + (y - 1) * 8)).Top = 75 * y
    173. Me.Controls("ziel" & (x + (y - 1) * 8)).Height = 75
    174. Me.Controls("ziel" & (x + (y - 1) * 8)).Width = 75
    175. Me.Controls("ziel" & (x + (y - 1) * 8)).BackgroundImage = My.Resources.Ziel
    176. Me.Controls("ziel" & (x + (y - 1) * 8)).BringToFront()
    177. End With
    178. End Select
    179. Next
    180. Next
    181. 'end
    182. End Sub
    183. End Class



    jedoch wird mir an markierter Stelle (*) immer ein NullReferenceException-Fehler angezeigt.
    Kann mir bitte jemand bei der Fehlersuche/-behebung helfen?


    Danke!

    hammerdollen