Нужно пошатнуть части тела змеи с таймером - PullRequest
0 голосов
/ 07 декабря 2018

Мне нужно поразить каждую часть тела, чтобы они не перекрывались, как в настоящее время.

Есть ли способ помешать выполнению этого кода?

Public Class Form1
Public xx As New List(Of Integer)
Public yy As New List(Of Integer)
Public up As Boolean = True
Public down As Boolean = False
Public lefty As Boolean = False
Public righty As Boolean = False
Public sizey As Integer = -1
Public tik As Integer = 0
Public neww As Boolean = False
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    newpart()
    newpart()
    newpart()
End Sub

Public Sub square(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs)

    e.Graphics.Clear(Color.Black)
    For a = 0 To sizey
        e.Graphics.FillRectangle(Brushes.Aqua, xx(a), yy(a), 20, 20)
    Next

End Sub

Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    If e.KeyCode = Keys.Right Then
        righty = True
        lefty = False
        up = False
        down = False
    ElseIf e.KeyCode = Keys.Left Then
        righty = False
        lefty = True
        up = False
        down = False
    ElseIf e.KeyCode = Keys.Up Then
        righty = False
        lefty = False
        up = True
        down = False
    ElseIf e.KeyCode = Keys.Down Then
        righty = False
        lefty = False
        up = False
        down = True
    End If
End Sub

Private Sub Form1_Paint(ByVal sender As Object, ByVal e _
 As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    square(sender, e)
End Sub

Private Sub clock_Tick(sender As Object, e As EventArgs) Handles head.Tick
    If up = True Then
        yy(0) = yy(0) - 20
    ElseIf down = True Then
        yy(0) = yy(0) + 20
    ElseIf lefty = True Then
        xx(0) = xx(0) - 20
    ElseIf righty = True Then
        xx(0) = xx(0) + 20
    End If
    Me.Refresh()
    For b = 0 To sizey - 1
        If yy(b) - yy(b + 1) = 0 Then
            xx(b + 1) = xx(b + 1) + (xx(b) - xx(b + 1))
        ElseIf xx(b) - xx(b + 1) = 0 Then
            yy(b + 1) = yy(b + 1) + (yy(b) - yy(b + 1))

            If neww = True Then
                neww = False
                Exit For
            End If
        End If
    Next
End Sub

Sub newpart()
    xx.Add(100)
    yy.Add(100)
    sizey = sizey + 1
    neww = True
    Return
End Sub

End Class

Егоглавным образом, бит в такте, так как мне нужно подождать еще один такт, прежде чем снова запустить цикл for.Эта отредактированная версия работает, но очень плохо, потому что третья часть тела иногда переходит к первой, а затем просто остается на месте.

1 Ответ

0 голосов
/ 08 декабря 2018

Вы слишком усложнили это для цикла там.Просто заставь хвост подтянуться, прежде чем двигать головой.Это может быть сделано в один тик.

Public Class Form1
Public p As New List(Of Point)
Public direction As eDircetion = eDircetion.Up
Public Enum eDircetion
    Up
    Down
    Left
    Right
End Enum
Public sizey As Integer = -1
Public tik As Integer = 0

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    newpart()
    newpart()
    newpart()
    head.Interval = 500
    head.Start()
End Sub

Public Sub square(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs)

    e.Graphics.Clear(Color.Black)
    For a = 0 To sizey
        e.Graphics.FillRectangle(Brushes.Aqua, p(a).X, p(a).Y, 20, 20)
    Next

End Sub

Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    If e.KeyCode = Keys.D Then
        direction = eDircetion.Right
    ElseIf e.KeyCode = Keys.A Then
        direction = eDircetion.Left
    ElseIf e.KeyCode = Keys.W Then
        direction = eDircetion.Up
    ElseIf e.KeyCode = Keys.S Then
        direction = eDircetion.Down
    End If
End Sub

Private Sub Form1_Paint(ByVal sender As Object, ByVal e _
 As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    square(sender, e)
End Sub

Private Sub clock_Tick(sender As Object, e As EventArgs) Handles head.Tick

    'THIS!
    For i = p.Count - 1 To 1 Step -1
        p(i) = p(i - 1)
    Next

    Select Case direction
        Case eDircetion.Up
            p(0) -= New Size(0, 20)
        Case eDircetion.Down
            p(0) += New Size(0, 20)
        Case eDircetion.Left
            p(0) -= New Size(20, 0)
        Case eDircetion.Right
            p(0) += New Size(20, 0)
        Case Else : Throw New Exception("Something went wrong")
    End Select

    'Me.Refresh()
    me.Invalidate() 'This is faster.
    Me.Update()

    'For b = 0 To sizey - 1
    '    If p(b).Y - p(b + 1).Y = 0 Then
    '        p(b + 1).X = p(b + 1).X + (p(b).X - p(b + 1).X)
    '    ElseIf xx(b) - xx(b + 1) = 0 Then
    '        yy(b + 1) = yy(b + 1) + (yy(b) - yy(b + 1))

    '        If neww = True Then
    '            neww = False
    '            Exit For
    '        End If
    '    End If
    'Next
End Sub

Sub newpart()
    p.Add(New Point(100, 100))
    sizey = sizey + 1
    Return
End Sub

End Class

Я внес некоторые незначительные изменения:

- Использование enum вместо 4 логических значений, делает более чистый код

- Не использоватьMe.Refresh, это медленно и делает вещи, которые вам не нужны здесь

- Лучше использовать не два списка целых чисел, а один список точек

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...