Moin,
schon einige male habe ich hier in den Foren nützliches gefunden, jetzt hoffe ich selbst auf Hilfe.
direkt Butter bei die Fische:
Der Rahmen:
Ich programmiere neuerdings mit vb.net und habe als Einstiegsprojekt aufgetragen bekommen snake zu programmieren.
Die Basiselemente des Spiels funktionieren auch super, sodass ich mir weiter und weiter kleinere Sachen ausdenke, die ich dann einarbeite.
Aktuell ist dies eine Bestenliste (leaderboard) welches in einer txt Datei gespeichert werden soll. Auch dies funktioniert für sich genommen.
Das Problem:
Ich habe die Steuerung der Schlange über eine überschriebene IsInputKey Funktion realisiert. Eine MoveToStart Funktion soll das Spiel auf den Startzustand bringen, dh. die wichtigen Variablen zurücksetzen etc. Für das Leaderboard und eine Namenseingabe habe ich Groupboxen verwendet, die jeweils wenn sie gebraucht werden über die Visible Property angezeigt oder ausgeblendet werden.
So weit so gut...
Für sich genommen funktionieren alle dieser drei "Teilnehmer", dh. das Programm lief einwandfrei, bevor ich den ganzen Leaderboardkram eingearbeitet habe.
Jetzt die Kuriosität:
Nachdem ich mich ins Leaderboard eingetragen habe wird die MoveToStart Funktion aufgerufen, jedoch reagiert jetzt die IsInputKey Funktion nicht mehr auf meine Pfeiltasteneingabe, genauer gesagt: alles steht still..
Setze ich jedoch einen Breakpoint und gehe step by step durch den Code so funktioniert es prima, nachdem eintragen ins Leaderboard springt das Programm bei Pfeiltasteneingabe in die IsInputKey Funktion...
Da ich keine Ahnung habe wo das Problem liegt, obs n Einzeiler is oder ich mir ordentlich was zusammengebraut habe, füge ich den kompletten Code mit an und hoffe auf euch!
schon einige male habe ich hier in den Foren nützliches gefunden, jetzt hoffe ich selbst auf Hilfe.
direkt Butter bei die Fische:
Der Rahmen:
Ich programmiere neuerdings mit vb.net und habe als Einstiegsprojekt aufgetragen bekommen snake zu programmieren.
Die Basiselemente des Spiels funktionieren auch super, sodass ich mir weiter und weiter kleinere Sachen ausdenke, die ich dann einarbeite.
Aktuell ist dies eine Bestenliste (leaderboard) welches in einer txt Datei gespeichert werden soll. Auch dies funktioniert für sich genommen.
Das Problem:
Ich habe die Steuerung der Schlange über eine überschriebene IsInputKey Funktion realisiert. Eine MoveToStart Funktion soll das Spiel auf den Startzustand bringen, dh. die wichtigen Variablen zurücksetzen etc. Für das Leaderboard und eine Namenseingabe habe ich Groupboxen verwendet, die jeweils wenn sie gebraucht werden über die Visible Property angezeigt oder ausgeblendet werden.
So weit so gut...
Für sich genommen funktionieren alle dieser drei "Teilnehmer", dh. das Programm lief einwandfrei, bevor ich den ganzen Leaderboardkram eingearbeitet habe.
Jetzt die Kuriosität:
Nachdem ich mich ins Leaderboard eingetragen habe wird die MoveToStart Funktion aufgerufen, jedoch reagiert jetzt die IsInputKey Funktion nicht mehr auf meine Pfeiltasteneingabe, genauer gesagt: alles steht still..
Setze ich jedoch einen Breakpoint und gehe step by step durch den Code so funktioniert es prima, nachdem eintragen ins Leaderboard springt das Programm bei Pfeiltasteneingabe in die IsInputKey Funktion...
Da ich keine Ahnung habe wo das Problem liegt, obs n Einzeiler is oder ich mir ordentlich was zusammengebraut habe, füge ich den kompletten Code mit an und hoffe auf euch!
VB.NET-Quellcode
- Imports System
- Imports System.IO
- Public Class Form1
- Dim pausenVariable As Integer
- Dim randomize As New Random
- Dim randomX As Integer
- Dim randomY As Integer
- Dim getPoint As Boolean
- Dim scoreCount As Integer
- Dim upKey As Boolean
- Dim downKey As Boolean
- Dim leftKey As Boolean
- Dim rightKey As Boolean
- Dim snake(0 To 2, 0 To 9) As Integer
- Dim Schlange(256) As System.Windows.Forms.Label
- Dim RichtungSchlange As Integer = 0 '0 = Stop, 1 = hoch, 2 = runter, 3 = links, 4 = rechts
- Dim timerCounter As Integer
- Dim leaderboard As New List(Of String)
- Dim rank As Integer
- Public Sub New()
- ' Dieser Aufruf ist für den Designer erforderlich.
- InitializeComponent()
- ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
- For index As Integer = 0 To 255
- Schlange(index) = New System.Windows.Forms.Label
- Schlange(index).Size = New System.Drawing.Size(10, 10)
- Schlange(index).BackColor = Color.Black
- Schlange(index).BorderStyle = BorderStyle.Fixed3D
- Schlange(0).Visible = True
- Me.Panel1.Controls.Add(Schlange(index))
- Next
- ' Leaderboard/bestenliste einlesen
- Using sr As New StreamReader("C:\Users\Labor\Documents\Visual Studio 2010\Projects\snakePfeiltasten\Leaderboard.txt")
- ' bis dateiende lesen
- While (sr.Peek <> -1)
- Dim zeile = sr.ReadLine()
- ' zur hauptliste hinzufügen
- leaderboard.Add(zeile)
- End While
- ' streamreader schliessen
- End Using
- MoveToStart()
- End Sub
- Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
- checkCrash()
- checkWallCrash()
- 'Bewegung der Schlange merken
- For index As Integer = 255 To 1 Step -1
- Schlange(index).Location = New Point(Schlange(index - 1).Location.X, Schlange(index - 1).Location.Y)
- Next
- 'Bewegen der Schlange
- If (upKey = True) Then
- Schlange(0).Location = New Point(Schlange(0).Location.X, Schlange(0).Location.Y - 10)
- RichtungSchlange = 1
- ElseIf (downKey = True) Then
- Schlange(0).Location = New Point(Schlange(0).Location.X, Schlange(0).Location.Y + 10)
- RichtungSchlange = 2
- ElseIf (leftKey = True) Then
- Schlange(0).Location = New Point(Schlange(0).Location.X - 10, Schlange(0).Location.Y)
- RichtungSchlange = 3
- ElseIf (rightKey = True) Then
- Schlange(0).Location = New Point(Schlange(0).Location.X + 10, Schlange(0).Location.Y)
- RichtungSchlange = 4
- End If
- 'Punkt gefressen
- If (Schlange(0).Location = Label2.Location) Then
- getPoint = True
- scoreCount = scoreCount + 1
- Schlange(scoreCount).Visible = True
- Label1.Text = scoreCount
- Label1.Visible = True
- Timer2.Start()
- If Timer1.Interval > 50 Then
- Timer1.Interval = Timer1.Interval - 5
- End If
- End If
- 'Neuen zufälligen Punkt erstellen
- If (getPoint) Then
- randomX = randomize.Next(1, 48) * 10
- randomY = randomize.Next(1, 48) * 10
- Label2.Location = New Point(randomX, randomY)
- getPoint = False
- End If
- End Sub
- 'prüft, ob die schlange sich selbst gebissen hat. falls ja, wird der scorecount geprüft und ggf. ein eintrag in der bestenliste vollzogen
- Private Sub checkCrash()
- Dim j As Integer
- If scoreCount > 0 Then
- While (j < scoreCount - 1)
- j = j + 1
- If Schlange(j + 1).Location = Schlange(0).Location Then
- Timer1.Stop()
- MessageBox.Show("Oops, you crashed!!")
- If scoreCount > leaderboard(9) Then
- Label3.Text = scoreCount
- checkLeaderboard()
- Else
- MoveToStart()
- End If
- End If
- End While
- End If
- End Sub
- 'setzt die wichtigen variablen zurück und setzt das spiel auf den startzustand
- Private Sub MoveToStart()
- getPoint = False
- scoreCount = 0
- For index As Integer = 1 To 255
- Schlange(index).Visible = False
- Schlange(index).Location = Nothing
- Next
- Schlange(0).Location = New Point(250, 250)
- upKey = False
- downKey = False
- leftKey = False
- rightKey = False
- randomX = randomize.Next(1, 48) * 10
- randomY = randomize.Next(1, 48) * 10
- Label2.Location = New Point(randomX, randomY)
- Label1.Visible = False
- End Sub
- 'über RichtungSchlange wird die aktuelle fahrtrichtung der schlange gemerkt und eine 180° wendung ausgeschlossen
- Protected Overrides Function IsInputKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean
- Select Case keyData
- Case Keys.Up
- If RichtungSchlange <> 2 Then
- leftKey = False
- rightKey = False
- upKey = True
- End If
- Timer1.Start()
- Return True
- Case Keys.Down
- If RichtungSchlange <> 1 Then
- leftKey = False
- rightKey = False
- downKey = True
- End If
- Timer1.Start()
- Return True
- Case Keys.Left
- If RichtungSchlange <> 4 Then
- upKey = False
- downKey = False
- leftKey = True
- End If
- Timer1.Start()
- Return True
- Case Keys.Right
- If RichtungSchlange <> 3 Then
- upKey = False
- downKey = False
- rightKey = True
- End If
- Timer1.Start()
- Return True
- End Select
- End Function
- 'bei kollision mit einer wand wird die schlange automatisch auf die entferntere ecke abgelenkt
- Private Sub checkWallCrash()
- If RichtungSchlange = 1 And Schlange(0).Location.Y = 0 Then
- If Schlange(0).Location.X > 245 Then
- upKey = False
- leftKey = True
- RichtungSchlange = 3
- ElseIf Schlange(0).Location.X < 245 Then
- upKey = False
- rightKey = True
- RichtungSchlange = 4
- End If
- End If
- If RichtungSchlange = 2 And Schlange(0).Location.Y = 480 Then
- If Schlange(0).Location.X > 245 Then
- downKey = False
- leftKey = True
- RichtungSchlange = 3
- ElseIf Schlange(0).Location.X < 245 Then
- downKey = False
- rightKey = True
- RichtungSchlange = 4
- End If
- End If
- If RichtungSchlange = 3 And Schlange(0).Location.X = 0 Then
- If Schlange(0).Location.Y > 245 Then
- leftKey = False
- upKey = True
- RichtungSchlange = 1
- ElseIf Schlange(0).Location.Y < 245 Then
- leftKey = False
- downKey = True
- RichtungSchlange = 2
- End If
- End If
- If RichtungSchlange = 4 And Schlange(0).Location.X = 480 Then
- If Schlange(0).Location.Y > 245 Then
- rightKey = False
- upKey = True
- RichtungSchlange = 1
- ElseIf Schlange(0).Location.Y < 245 Then
- rightKey = False
- downKey = True
- RichtungSchlange = 2
- End If
- End If
- End Sub
- 'für 2 sekunden wird bei jedem neuen gefressenem punkt der scorecount auf der spielfläche angezeigt
- Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
- timerCounter = timerCounter + 1 '1 tick = 0,5 s
- If timerCounter = 2 Then
- Timer2.Stop()
- Label1.Visible = False
- timerCounter = 0
- End If
- End Sub
- 'prüft, ob der scorecount für eine platzierung in der bestenliste reicht und wenn ja wo. zeigt bei ja eine groupbox an in welcher man einen namen einträgt
- Private Sub checkLeaderboard()
- Select Case scoreCount
- Case leaderboard(9) + 1 To leaderboard(7)
- rank = 8
- enterNameGroupBox.Visible = True
- Case leaderboard(7) + 1 To leaderboard(5)
- rank = 6
- enterNameGroupBox.Visible = True
- Case leaderboard(5) + 1 To leaderboard(3)
- rank = 4
- enterNameGroupBox.Visible = True
- Case leaderboard(3) + 1 To leaderboard(1)
- rank = 2
- enterNameGroupBox.Visible = True
- Case Is > leaderboard(1)
- rank = 0
- enterNameGroupBox.Visible = True
- End Select
- End Sub
- 'sobald ein buchstabe eingegeben ist, soll dieser als name bestätigt werden können
- Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
- Button1.Enabled = True
- End Sub
- 'mit ("accept"-button) bestätigtem namen wird die leaderboardgroupbox aktualisiert angezeigt, gespeichert und die groupbox für die namenseingabe für das nächste mal vorbereitet
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- ' Leaderboard überschreiben
- For index As Integer = 9 To rank Step -1
- If index = 1 Then
- Exit For
- End If
- leaderboard(index) = leaderboard(index - 2)
- Next
- leaderboard(rank) = TextBox1.Text
- leaderboard(rank + 1) = scoreCount
- Using writer As StreamWriter =
- New StreamWriter("C:\Users\Labor\Documents\Visual Studio 2010\Projects\snakePfeiltasten\Leaderboard.txt")
- For index As Integer = 0 To 9
- writer.WriteLine(leaderboard(index))
- Next
- End Using
- enterNameGroupBox.Visible = False
- Label4.Text = leaderboard(0)
- Label5.Text = leaderboard(1)
- Label6.Text = leaderboard(2)
- Label7.Text = leaderboard(3)
- Label8.Text = leaderboard(4)
- Label9.Text = leaderboard(5)
- Label10.Text = leaderboard(6)
- Label11.Text = leaderboard(7)
- Label12.Text = leaderboard(8)
- Label13.Text = leaderboard(9)
- LeaderboardGroupBox.Visible = True
- Button1.Enabled = False
- End Sub
- 'der button "play again" in der leaderboardgroupbox
- Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
- LeaderboardGroupBox.Visible = False
- MoveToStart()
- End Sub
- End Class