Snake

    • VB.NET

    Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von TheVBTutorialsVB.

      Hallo,

      da ich vor langer, langer, langer Zeit gebeten wurde mein Snake in XNA vorzustellen tue ich dies jetzt. Vorraussetzung ist natürlich XNA. Zuerst habe ich dieses Programm in C#, jetzt allerdings in VB geschrieben.

      Code:

      VB.NET-Quellcode

      1. Imports System
      2. Imports System.Linq
      3. Imports System.Collections.Generic
      4. Imports Microsoft.Xna.Framework
      5. Imports Microsoft.Xna.Framework.Audio
      6. Imports Microsoft.Xna.Framework.Content
      7. Imports Microsoft.Xna.Framework.Input
      8. Imports Microsoft.Xna.Framework.Media
      9. Imports Microsoft.Xna.Framework.Graphics
      10. Imports Microsoft.Xna.Framework.GamerServices
      11. Imports System.Collections
      12. Public Class Game1
      13. Inherits Microsoft.Xna.Framework.Game
      14. Private WithEvents graphics As GraphicsDeviceManager
      15. Private WithEvents spriteBatch As SpriteBatch
      16. Dim Spielende As Boolean = False
      17. Dim Schrift As SpriteFont
      18. Dim LängeY As New ArrayList()
      19. Dim LängeX As New ArrayList()
      20. Dim LängeA As New ArrayList()
      21. Dim LängeB As New ArrayList()
      22. Dim FoodY As New ArrayList()
      23. Dim FoodX As New ArrayList()
      24. Dim Mitzählen As Integer = 0
      25. Dim Geschwindigkeit As Integer = 5
      26. Dim Mitzählen2 As Integer = 0
      27. Dim Geschwindigkeit2 As Integer = 5
      28. Dim Punkte As Integer = 0
      29. Dim Hoch As Integer
      30. Dim Breit As Integer
      31. Dim AKTLenkung As String
      32. Dim AKTLenkung2 As String
      33. Dim futter, hintergrund, snakekopf, snaketeile, snakekopf2, snaketeile2 As Texture2D
      34. Public Sub New()
      35. graphics = New GraphicsDeviceManager(Me)
      36. Content.RootDirectory = "Content"
      37. End Sub
      38. Protected Overrides Sub Initialize()
      39. graphics.PreferredBackBufferWidth = 1000
      40. graphics.PreferredBackBufferHeight = 700
      41. graphics.ApplyChanges()
      42. Hoch = graphics.PreferredBackBufferHeight / 10
      43. Breit = graphics.PreferredBackBufferWidth / 10
      44. LängeX.Add(0)
      45. LängeY.Add(0)
      46. LängeX.Add(1)
      47. LängeY.Add(0)
      48. LängeX.Add(2)
      49. LängeY.Add(0)
      50. LängeA.Add(0)
      51. LängeB.Add(0)
      52. LängeA.Add(1)
      53. LängeB.Add(0)
      54. LängeA.Add(2)
      55. LängeB.Add(0)
      56. Dim z As New Random()
      57. FoodX.Add(z.[Next](0, graphics.PreferredBackBufferWidth / 10))
      58. FoodY.Add(z.[Next](0, graphics.PreferredBackBufferHeight / 10))
      59. FoodX.Add(z.[Next](0, graphics.PreferredBackBufferWidth / 10))
      60. FoodY.Add(z.[Next](0, graphics.PreferredBackBufferHeight / 10))
      61. MyBase.Initialize()
      62. End Sub
      63. Protected Overrides Sub LoadContent()
      64. spriteBatch = New SpriteBatch(GraphicsDevice)
      65. snaketeile = Content.Load(Of Texture2D)("snaketeile")
      66. snakekopf = Content.Load(Of Texture2D)("snakekopf")
      67. futter = Content.Load(Of Texture2D)("essen")
      68. hintergrund = Content.Load(Of Texture2D)("hintergrund")
      69. snakekopf2 = Content.Load(Of Texture2D)("snakekopf")
      70. snaketeile2 = Content.Load(Of Texture2D)("snaketeile")
      71. Schrift = Content.Load(Of SpriteFont)("SpriteFont1")
      72. End Sub
      73. Protected Overrides Sub UnloadContent()
      74. End Sub
      75. Protected Overrides Sub Update(ByVal gameTime As GameTime)
      76. If GamePad.GetState(PlayerIndex.One).Buttons.Back = ButtonState.Pressed Then
      77. Me.Exit()
      78. End If
      79. Dim i As Integer = 1
      80. While i < LängeX.Count
      81. If LängeX(i).ToString() = LängeX(0).ToString() AndAlso LängeY(i).ToString() = LängeY(0).ToString() Then
      82. Spielende = True
      83. End If
      84. i += 1
      85. End While
      86. Dim ks As KeyboardState = Keyboard.GetState()
      87. If Spielende = False Then
      88. If ks.IsKeyDown(Keys.Left) Then
      89. If AKTLenkung <> "r" Then
      90. AKTLenkung = "l"
      91. End If
      92. End If
      93. If ks.IsKeyDown(Keys.Right) Then
      94. If AKTLenkung <> "l" Then
      95. AKTLenkung = "r"
      96. End If
      97. End If
      98. If ks.IsKeyDown(Keys.Up) Then
      99. If AKTLenkung <> "d" Then
      100. AKTLenkung = "u"
      101. End If
      102. End If
      103. If ks.IsKeyDown(Keys.Down) Then
      104. If AKTLenkung <> "u" Then
      105. AKTLenkung = "d"
      106. End If
      107. End If
      108. If ks.IsKeyDown(Keys.Escape) Then
      109. [Exit]()
      110. End If
      111. If Mitzählen = Geschwindigkeit Then
      112. If AKTLenkung = "d" Then
      113. LängeX.Insert(0, LängeX(0))
      114. LängeX.RemoveAt(LängeX.Count - 1)
      115. LängeY.Insert(0, Convert.ToInt16(LängeY(0)) + 1)
      116. LängeY.RemoveAt(LängeY.Count - 1)
      117. End If
      118. If AKTLenkung = "u" Then
      119. LängeX.Insert(0, LängeX(0))
      120. LängeX.RemoveAt(LängeX.Count - 1)
      121. LängeY.Insert(0, Convert.ToInt16(LängeY(0)) - 1)
      122. LängeY.RemoveAt(LängeY.Count - 1)
      123. End If
      124. If AKTLenkung = "l" Then
      125. LängeX.Insert(0, Convert.ToInt16(LängeX(0)) - 1)
      126. LängeX.RemoveAt(LängeX.Count - 1)
      127. LängeY.Insert(0, LängeY(0))
      128. LängeY.RemoveAt(LängeY.Count - 1)
      129. End If
      130. If AKTLenkung = "r" Then
      131. LängeX.Insert(0, Convert.ToInt16(LängeX(0)) + 1)
      132. LängeX.RemoveAt(LängeX.Count - 1)
      133. LängeY.Insert(0, LängeY(0))
      134. LängeY.RemoveAt(LängeY.Count - 1)
      135. End If
      136. Mitzählen = 0
      137. Else
      138. Mitzählen += 1
      139. End If
      140. i = 0
      141. While i < FoodX.Count
      142. If FoodX(i).ToString() = LängeX(0).ToString() AndAlso FoodY(i).ToString() = LängeY(0).ToString() Then
      143. FoodX.RemoveAt(i)
      144. FoodY.RemoveAt(i)
      145. LängeX.Add(-1)
      146. LängeY.Add(-1)
      147. Punkte += 1
      148. Dim z As New Random()
      149. FoodX.Add(z.[Next](0, graphics.PreferredBackBufferWidth / 10))
      150. FoodY.Add(z.[Next](0, graphics.PreferredBackBufferHeight / 10))
      151. End If
      152. i += 1
      153. End While
      154. If Convert.ToInt16(LängeX(0)) < 0 Then
      155. LängeX(0) = graphics.PreferredBackBufferWidth / 10
      156. End If
      157. If Convert.ToInt16(LängeX(0)) > graphics.PreferredBackBufferWidth / 10 Then
      158. LängeX(0) = 0
      159. End If
      160. If Convert.ToInt16(LängeY(0)) < 0 Then
      161. LängeY(0) = graphics.PreferredBackBufferHeight / 10
      162. End If
      163. If Convert.ToInt16(LängeY(0)) > graphics.PreferredBackBufferHeight / 10 Then
      164. LängeY(0) = 0
      165. End If
      166. End If
      167. While i < LängeA.Count
      168. If LängeA(i).ToString() = LängeA(0).ToString() AndAlso LängeB(i).ToString() = LängeB(0).ToString() Then
      169. Spielende = True
      170. End If
      171. i += 1
      172. End While
      173. Dim sk As KeyboardState = Keyboard.GetState()
      174. If Spielende = False Then
      175. If sk.IsKeyDown(Keys.A) Then
      176. If AKTLenkung2 <> "r" Then
      177. AKTLenkung2 = "l"
      178. End If
      179. End If
      180. If sk.IsKeyDown(Keys.D) Then
      181. If AKTLenkung2 <> "l" Then
      182. AKTLenkung2 = "r"
      183. End If
      184. End If
      185. If sk.IsKeyDown(Keys.W) Then
      186. If AKTLenkung2 <> "d" Then
      187. AKTLenkung2 = "u"
      188. End If
      189. End If
      190. If sk.IsKeyDown(Keys.S) Then
      191. If AKTLenkung <> "u" Then
      192. AKTLenkung = "d"
      193. End If
      194. End If
      195. If Mitzählen2 = Geschwindigkeit2 Then
      196. If AKTLenkung = "d" Then
      197. LängeA.Insert(0, LängeA(0))
      198. LängeA.RemoveAt(LängeA.Count - 1)
      199. LängeB.Insert(0, Convert.ToInt16(LängeB(0)) + 1)
      200. LängeB.RemoveAt(LängeB.Count - 1)
      201. End If
      202. If AKTLenkung = "u" Then
      203. LängeA.Insert(0, LängeA(0))
      204. LängeA.RemoveAt(LängeA.Count - 1)
      205. LängeB.Insert(0, Convert.ToInt16(LängeB(0)) - 1)
      206. LängeB.RemoveAt(LängeB.Count - 1)
      207. End If
      208. If AKTLenkung = "l" Then
      209. LängeA.Insert(0, Convert.ToInt16(LängeA(0)) - 1)
      210. LängeA.RemoveAt(LängeA.Count - 1)
      211. LängeB.Insert(0, LängeB(0))
      212. LängeB.RemoveAt(LängeB.Count - 1)
      213. End If
      214. If AKTLenkung = "r" Then
      215. LängeA.Insert(0, Convert.ToInt16(LängeA(0)) + 1)
      216. LängeA.RemoveAt(LängeA.Count - 1)
      217. LängeB.Insert(0, LängeB(0))
      218. LängeB.RemoveAt(LängeB.Count - 1)
      219. End If
      220. Mitzählen2 = 0
      221. Else
      222. Mitzählen2 += 1
      223. End If
      224. i = 0
      225. While i < FoodX.Count
      226. If FoodX(i).ToString() = LängeA(0).ToString() AndAlso FoodY(i).ToString() = LängeB(0).ToString() Then
      227. FoodX.RemoveAt(i)
      228. FoodY.RemoveAt(i)
      229. LängeA.Add(-1)
      230. LängeB.Add(-1)
      231. Punkte += 1
      232. Dim z As New Random()
      233. FoodX.Add(z.[Next](0, graphics.PreferredBackBufferWidth / 10))
      234. FoodY.Add(z.[Next](0, graphics.PreferredBackBufferHeight / 10))
      235. End If
      236. i += 1
      237. End While
      238. If Convert.ToInt16(LängeA(0)) < 0 Then
      239. LängeA(0) = graphics.PreferredBackBufferWidth / 10
      240. End If
      241. If Convert.ToInt16(LängeA(0)) > graphics.PreferredBackBufferWidth / 10 Then
      242. LängeA(0) = 0
      243. End If
      244. If Convert.ToInt16(LängeB(0)) < 0 Then
      245. LängeB(0) = graphics.PreferredBackBufferHeight / 10
      246. End If
      247. If Convert.ToInt16(LängeB(0)) > graphics.PreferredBackBufferHeight / 10 Then
      248. LängeB(0) = 0
      249. End If
      250. End If
      251. MyBase.Update(gameTime)
      252. End Sub
      253. Protected Overrides Sub Draw(ByVal gameTime As GameTime)
      254. GraphicsDevice.Clear(Color.CornflowerBlue)
      255. spriteBatch.Begin()
      256. spriteBatch.Draw(hintergrund, New Rectangle(0, 0, graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight), Color.White)
      257. Dim i As Integer = 0
      258. While i < LängeX.Count
      259. spriteBatch.Draw(snaketeile, New Rectangle(Convert.ToInt16(LängeX(i)) * 10, Convert.ToInt16(LängeY(i)) * 10, 10, 10), Color.White)
      260. i += 1
      261. End While
      262. spriteBatch.Draw(snakekopf, New Rectangle(Convert.ToInt16(LängeX(0)) * 10, Convert.ToInt16(LängeY(0)) * 10, 10, 10), Color.White)
      263. i = 0
      264. While i < LängeA.Count
      265. spriteBatch.Draw(snaketeile2, New Rectangle(Convert.ToInt16(LängeA(i)) * 10, Convert.ToInt16(LängeB(i)) * 10, 10, 10), Color.White)
      266. i += 1
      267. End While
      268. spriteBatch.Draw(snakekopf2, New Rectangle(Convert.ToInt16(LängeA(0)) * 10, Convert.ToInt16(LängeB(0)) * 10, 10, 10), Color.White)
      269. i = 0
      270. While i < FoodX.Count
      271. spriteBatch.Draw(futter, New Rectangle(Convert.ToInt16(FoodX(i)) * 10, Convert.ToInt16(FoodY(i)) * 10, 10, 10), Color.White)
      272. i += 1
      273. End While
      274. If Spielende Then
      275. spriteBatch.DrawString(Schrift, "VERLOREN!", New Vector2(450, graphics.PreferredBackBufferHeight / 2), Color.Black)
      276. End If
      277. spriteBatch.DrawString(Schrift, "Punkte: " & Punkte.ToString(), New Vector2(10, 10), Color.Black)
      278. spriteBatch.[End]()
      279. MyBase.Draw(gameTime)
      280. End Sub
      281. End Class


      Kritik ist erwünscht!

      LG :D

      VB.NET und C# sind Objektorientierte Sprachen.
      Du hast eine Klasse für ein ganzes Spiel und wenn ich groß drüber schau nur die Standartmethoden. Sprich keine einzige Methode, Property, Klasse,... naja -.-


      Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
      Mir kam es erstmal darauf an das es ÜBERHAUPT funktioniert. Mit XNA habe ich ewig nix mehr gemacht, da muss ich mich erst noch reinlesen. :D

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

      Weil das so ziemlich der hässlichste Code ist den du für sowas schreiben kannst.
      Möglichst alles in Klassen aufteilen. Wenn du das nicht kannst, hast du auch nicht viel Ahnung von VB.NET. Es geht darum, dass du z.B. Teile der Schlange als Klasse machst diese wieder in Klasse haust wo diese verwaltet und zeichnet. Dann von mir aus einen Inputmanager machst welcher wieder dem "Schlangenmanager" sagt was er machen soll. Dann eine Klasse von Teilen die du fressen kannst und dort wieder andere ableitest usw....


      Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.