Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
6 / 6 / 0
Регистрация: 15.12.2010
Сообщений: 200
1

Игра "Змейка": чтобы змейка не съедала сама себя

12.01.2012, 08:20. Просмотров 3448. Ответов 1
Метки нет (Все метки)


Здравствуйте!
Пишу змейку на VB 2010.
Не получается составить условие того, что бы змейка не ползла в направлении обратному направлению, по которому она ползет в данный момент. (Если змейка ползет влево, то вправо она ползти не может.)
Переменная s - это направление.
1- вверх
2- вправо
3- вниз
4- влево
Помогите пожалуйста!

Вот код:
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
Public Class Form1
    Dim q As Integer
    Dim c
    Dim m As Integer = 5
    Dim p(m) As Point
    Dim k As Keys
    Dim s As Integer
    Dim start As Integer = 5
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
 
        Dim b As New Bitmap(512, 512)
        Dim g As Graphics = Graphics.FromImage(b)
'вот тут я начинаю создавать условия, по теме:
        If k = Keys.Left And s <> 2 Then
            p(m).X -= 16
            s = 4
        ElseIf k = Keys.Left Then
            p(m).X += 16
        End If
 
        If k = Keys.Right And s <> 4 Then
            p(m).X += 16
            s = 2
        ElseIf k = Keys.Left Then
            p(m).X -= 16
        End If
 
        If k = Keys.Up And s <> 3 Then
            p(m).Y -= 16
            s = 1
        ElseIf k = Keys.Left Then
            p(m).Y += 16
        End If
 
        If k = Keys.Down And s <> 1 Then
            p(m).Y += 16
            s = 3
        ElseIf k = Keys.Left Then
            p(m).Y -= 16
        End If
 
'была еще такая мысля но увы так же не увенчалась успехом
        'If k = Keys.Left Then
        '    's = 2
        '    p(m).X -= 16
        'ElseIf k = Keys.Right Then
        '    p(m).X -= 16
        'End If
 
        'If k = Keys.Right Then
        '    's = 4
        '    p(m).X += 16
        'ElseIf k = Keys.Left Then
        '    p(m).X += 16
        'End If
 
        'If k = Keys.Up Then
        '    's = 1
        '    p(m).Y -= 16
        'ElseIf Keys.Down Then
        '    p(m).Y -= 16
        'End If
 
        'If k = Keys.Down Then
        '    's = 3
        '    p(m).Y += 16
        'ElseIf k = Keys.Up Then
        '    p(m).Y += 16
        'End If
 
        For i As Integer = 0 To m - 1
            p(i) = p(i + 1)
            g.FillRectangle(Brushes.Black, New Rectangle(p(i), New Size(16, 16)))'тело змейки
        Next
        g.FillRectangle(Brushes.Red, New Rectangle(p(m), New Size(16, 16)))'голова змейки
        g.Dispose()
 
        Me.BackgroundImage = b
        Me.ClientSize = b.Size
        Me.Refresh()
'Ограничения по границам
        If p(m).X > 512 Then
            Timer1.Stop()
            MessageBox.Show("Your snake is dead! ")
        End If
        If p(m).Y > 512 Then
            Timer1.Stop()
            MessageBox.Show("Your snake is dead! ")
        End If
        If p(m).X < 0 Then
            Timer1.Stop()
            MessageBox.Show("Your snake is dead! ")
        End If
        If p(m).Y < 0 Then
            Timer1.Stop()
            MessageBox.Show("Your snake is dead! ")
        End If
    End Sub
'переменной k придается значения клавиш
    Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
        If e.KeyCode = Keys.Left Then
            k = Keys.Left
        End If
        If e.KeyCode = Keys.Right Then
            k = Keys.Right
        End If
        If e.KeyCode = Keys.Up Then
            k = Keys.Up
        End If
        If e.KeyCode = Keys.Down Then
            k = Keys.Down
        End If
       
    End Sub
 
End Class
Добавлено через 8 часов 7 минут
вверх!

Добавлено через 1 час 50 минут
А есть такая функция что бы блокировала нажатие клавиш?
Например
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
If k=keys.right then
 
          p(m).X+=16
          'Тут блокировка k=keys.left
 
end if
 
If k=keys.left then
 
          p(m).X-=16
          'Тут блокировка k=keys.right
 
end if
Добавлено через 2 минуты
Есть ли такая функция, которая блокирует нажатие определенной клавиши?
Например если нажата -> то соответственно блокируется <-. и т.д.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.01.2012, 08:20
Ответы с готовыми решениями:

Нужно, чтобы форма распечатала сама себя, или только часть себя
Помогите, плиз! Нужно, чтобы форма (для этого имеется кнопка на форме) распечатала сама себя, или...

Обработка "null" в MS Access "Приведение типа "|DBNull" к типу "String" является недопустимым"
Здравствуйте. Работаю с базой MS Access Вывожу в DataGridView таблицу Проблема следующая, если у...

Поиск в DGW вылетает с ошибкой "Приведение типа "|DBNull" к типу "String" является недопустимым."
В общем такой вопрос. Код рабочий. Только у меня не работает. For i = 0 To...

Ошибка "Приведение строки "explorer.exe" к типу "Double" является недопустимым" при записи в реестр
Помогите, хочу получить доступ к winlogon, что бы изменять любое другое значение shell на...

1
Заблокирован
13.01.2012, 12:12 2
Делал я когда-то змею на C#

Предлагаю сделать так.
Вот вам костяк, а там уже наращивайте.

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
    Dim s As Integer
    Dim p As List(Of Point) = New List(Of Point)
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'три сегмента змеи
        p.Add(New Point(50, 50))
        p.Add(New Point(66, 50))
        p.Add(New Point(82, 50))
        s = 2
    End Sub
 
    Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
'смена направления, если не противоположное
        Select Case e.KeyCode
            Case Keys.Left
                If s <> 2 Then s = 4
            Case Keys.Right
                If s <> 4 Then s = 2
            Case Keys.Up
                If s <> 3 Then s = 1
            Case Keys.Down
                If s <> 1 Then s = 3
        End Select
    End Sub
 
    Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
        For m As Integer = 0 To p.Count - 1
            e.Graphics.FillRectangle(Brushes.Red, New Rectangle(p(m), New Size(16, 16))) 'отрисовка для теста 
        Next
    End Sub
 
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim z As Point = New Point(p(p.Count - 1).X, p(p.Count - 1).Y) 'старые координаты головы
        Select Case s
            Case 1
                z.Y -= 16
            Case 2
                z.X += 16
            Case 3
                z.Y += 16
            Case 4
                z.X -= 16
        End Select
        p.RemoveAt(0) 'удаляем хвостик
        p.Add(z) 'новые координаты головы
        Refresh()
    End Sub
Еще, расчеты того что рисовать в Timer1_Tick, сама отрисовка в Form1_Paint
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.01.2012, 12:12

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Ошибка при запуске .exe файла из debug: "Приведение строки "Июнь" к типу "Double" является недопустимым"
Если запускать из самого проекта(F5), то все нормально, а если скомпилированный запустить, то...

Оператор "+" для типов "String" и "System.Windows.Forms.ComboBox.ObjectCollection" не определен
Доброго времени суток,подскажите решение проблемы К комбобоксам привязал БД отображаются в них...

Игра "Змейка". Как добавить ей тело и чтобы оно равно количеству съеденной цифры
Всем доброе время суток) пишу программу на c# змейка и никак не могу понять как добавить ей тело и...

Игра "Змейка", ошибка "Globals.Close не объявлен", неправильная логика игры
Нашёл в интернете код игры &quot;змейка&quot; и саму скомпилированную игру. Но есть загвоздка. А точнее две...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.