Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 13.04.2016
Сообщений: 27
1

Движение змейки

10.08.2018, 18:34. Показов 1963. Ответов 13

Author24 — интернет-сервис помощи студентам
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
    Private Sub Form1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        Const r = 0
        Do While r = 0
            If e.KeyValue = 37 Then head.Left -= 5
            If e.KeyValue = 39 Then head.Left += 5
            If e.KeyValue = 38 Then head.Top -= 5
            If e.KeyValue = 40 Then head.Top += 5
            For i = 1 To 10000000
            Next i
        Loop
 
    End Sub
подскажите, пожалуйста, почему змейка начинает двигаться в одну сторону и потом управление не работает
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.08.2018, 18:34
Ответы с готовыми решениями:

Как происходит движение змейки?
Подскажите пожалуйста,как происходит движение змейки? Вот она съедает кубик,и я делаю...

Синхронное движение ProgressBar и TrackBar, движение в обратную сторону
Public Class Form4 Private Sub Form4_Load(sender As Object, e As EventArgs) Handles...

Как сделать чтобы уровень змейки и уровень яблока совпадал?
Здравствуйте. Как сделать чтобы уровень змейки и уровень яблока совпадал?

Движение змейки
Никак не получается сделать движение змейки с последующим присоединением элементов к ней при...

13
Модератор
Эксперт .NET
15466 / 10712 / 2786
Регистрация: 21.04.2018
Сообщений: 31,536
Записей в блоге: 2
10.08.2018, 21:18 2
Лучший ответ Сообщение было отмечено Painkiller13 как решение

Решение

Цитата Сообщение от Painkiller13 Посмотреть сообщение
VB.NET
1
2
3
4
        Const r = 0
        Do While r = 0
           ' На цикл не влияют
        Loop
End Subподскажите, пожалуйста, почему змейка начинает двигаться в одну сторону и потом управление не работает
У Вас же здесь бесконечный цикл!
Обрабатывается одна клавиша и потом прерывание уходит в вечный цикл.

Добавлено через 6 минут
Если я правильно понял смысл Вашего кода, то надо так
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    Private Sub Form1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
 
        Select Case e.KeyValue
            Case 37
                head.Left -= 5
            Case 39
                head.Left += 5
            Case 38
                head.Top -= 5
            Case 40
                head.Top += 5
        End Select
 
    End Sub
На каждое нажатие клавиши будет один шаг в выбранную сторону.

Добавлено через 42 минуты
Если надо отслеживать удержание клавиш, то можно так

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
    'Переменные для запоминания направления шага
    Dim StepLeft As Integer = 0, StepTop As Integer = 0
 
    'Активация таймера при показе Формы
    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
        Timer1.Interval = 100 ' Установка необходимого интервала в миллисекундах
        Timer1.Enabled = True
    End Sub
 
    Private Sub Form1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
 
        ' Установка направления шага
        Select Case e.KeyValue
            Case 37
                StepLeft = -5
            Case 39
                StepLeft = 5
            Case 38
                StepTop = -5
            Case 40
                StepTop = 5
        End Select
 
        ' Один шаг сразу после нажатия клавиши
        head.Left += StepLeft
        head.Top += StepTop
 
        ' Запуск таймера для следующих шагов
        Timer1.Start()
 
    End Sub
 
    Private Sub Form1_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
 
        ' Изменения направления шага по отпусканию клавиши
        Select Case e.KeyValue
            Case 37, 39
                StepLeft = 0
            Case 38, 40
                StepTop = 0
        End Select
 
    End Sub
 
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        ' Один шаг в выбранном направлении каждый установленный интервал
        head.Left += StepLeft
        head.Top += StepTop
    End Sub
1
0 / 0 / 0
Регистрация: 13.04.2016
Сообщений: 27
11.08.2018, 17:10  [ТС] 3
Почему то происходит один шаг за одно нажатие, хотя змейка должна продолжать двигаться постоянно, а клавиши просто давать направление
0
Модератор
Эксперт .NET
15466 / 10712 / 2786
Регистрация: 21.04.2018
Сообщений: 31,536
Записей в блоге: 2
11.08.2018, 18:19 4
Цитата Сообщение от Painkiller13 Посмотреть сообщение
Почему то происходит один шаг за одно нажатие, хотя змейка должна продолжать двигаться постоянно, а клавиши просто давать направление
Вы какой вариант, пробовали? С таймеров?
После отпускания клавиши змейка должна двигаться в выбранном направлении? Или только пока удерживаешь клавишу? По диагонали может двигаться?
0
0 / 0 / 0
Регистрация: 13.04.2016
Сообщений: 27
11.08.2018, 18:28  [ТС] 5
я переписал весь код, что вы отправили, движение происходит только при нажатии клавиш

Добавлено через 2 минуты
да, она должна двигаться в выбранном направлении
0
Модератор
Эксперт .NET
15466 / 10712 / 2786
Регистрация: 21.04.2018
Сообщений: 31,536
Записей в блоге: 2
11.08.2018, 18:32 6
Вот ещё вариант:
  • Движение только по вертикали или горизонтали
  • Движение после отпускании клавиши не останавливается
  • Один шаг, каждые 100 мс.
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
    'Переменные для запоминания напраления шага
    Dim StepLeft As Integer = 0, StepTop As Integer = 0
 
    'Активация таймера при показе Формы
    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
        Timer1.Interval = 100 ' Установка необходимого ингтервала в милисекундах
        Timer1.Enabled = True
    End Sub
 
    Private Sub Form1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
 
        ' Запись в переменные для запоминания направления шага
        Select Case e.KeyValue
            Case 37
                StepLeft -= 5
                StepTop = 0
            Case 39
                StepLeft += 5
                StepTop = 0
            Case 38
                StepLeft = 0
                StepTop -= 5
            Case 40
                StepLeft = 0
                StepTop += 5
        End Select
 
        ' Один шаг сразу после нажатия клавиши
        head.Left += StepLeft
        head.Top += StepTop
 
        ' Запуск таймера для следующих шагов
        Timer1.Start()
 
    End Sub
 
    Private Sub Form1_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
 
        ' Закомментирован блок останавливающий движение после отпускания клавиши
        ' Изменения направления шага по отпусканию клавиши
        'Select Case e.KeyValue
        '    Case 37, 39
        '        StepLeft = 0
        '    Case 38, 40
        '        StepTop = 0
        'End Select
 
    End Sub
 
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        ' Один шаг в выбранном напралении
        head.Left += StepLeft
        head.Top += StepTop
    End Sub
Добавлено через 1 минуту
Таймер на Форму поставили?

Добавлено через 1 минуту
Цитата Сообщение от Painkiller13 Посмотреть сообщение
я переписал весь код, что вы отправили, движение происходит только при нажатии клавиш
Я же два разных варианта посылал!
Там же написано.
1
0 / 0 / 0
Регистрация: 13.04.2016
Сообщений: 27
11.08.2018, 18:40  [ТС] 7
теперь движется без остановки, но когда меняю направление идет небольшой рывок, а когда нажимаю несколько раз одну клавишу скорость увеличивается
0
Модератор
Эксперт .NET
15466 / 10712 / 2786
Регистрация: 21.04.2018
Сообщений: 31,536
Записей в блоге: 2
11.08.2018, 18:53 8
Цитата Сообщение от Painkiller13 Посмотреть сообщение
еперь движется без остановки, но когда меняю направление идет небольшой рывок, а когда нажимаю несколько раз одну клавишу скорость увеличивается
Да, это я скопировал с Вашего кода. Подумал что Вам так и надо.
Чтобы скорость оставалась неизменной в блоке Select Case e.KeyValue уберите + и - перед знаком =.

Добавлено через 2 минуты
Цитата Сообщение от Painkiller13 Посмотреть сообщение
меняю направление идет небольшой рывок
Попробуйте закомментировать Timer1.Start(), но тогда может срабатывать немного с опозданием. Проверьте.
1
0 / 0 / 0
Регистрация: 13.04.2016
Сообщений: 27
11.08.2018, 19:00  [ТС] 9
решил эту проблему, просто обнулил upmove,leftmove перед каждым движением
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    Select Case e.KeyValue
            Case 37
                leftmove = 0
                leftmove -= 5
                upmove = 0
            Case 39
                leftmove = 0
                leftmove += 5
                upmove = 0
            Case 38
                upmove = 0
                leftmove = 0
                upmove -= 5
            Case 40
                upmove = 0
                leftmove = 0
                upmove += 5
        End Select
Добавлено через 5 минут
Убрал шаг сразу после нажатия, вроде помогло
Visual Basic
1
2
3
 ' Один шаг сразу после нажатия клавиши
        head.Left += StepLeft
        head.Top += StepTop
0
Модератор
Эксперт .NET
15466 / 10712 / 2786
Регистрация: 21.04.2018
Сообщений: 31,536
Записей в блоге: 2
11.08.2018, 19:03 10
Сделайте так. Тоже самое но короче.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
           Select Case e.KeyValue
            Case 37
                StepLeft = 5
                StepTop = 0
            Case 39
                StepLeft = 5
                StepTop = 0
            Case 38
                StepLeft = 0
                StepTop = 5
            Case 40
                StepLeft = 0
                StepTop = 5
        End Select
0
0 / 0 / 0
Регистрация: 13.04.2016
Сообщений: 27
11.08.2018, 19:05  [ТС] 11
так он по диагонали ходит
0
Модератор
Эксперт .NET
15466 / 10712 / 2786
Регистрация: 21.04.2018
Сообщений: 31,536
Записей в блоге: 2
11.08.2018, 19:12 12
Да, диагональ осталась. Я подправил посмотрите.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
           Select Case e.KeyValue
            Case 37
                StepLeft = -5
                StepTop = 0
            Case 39
                StepLeft = 5
                StepTop = 0
            Case 38
                StepLeft = 0
                StepTop = -5
            Case 40
                StepLeft = 0
                StepTop = 5
        End Select
1
0 / 0 / 0
Регистрация: 13.04.2016
Сообщений: 27
11.08.2018, 19:15  [ТС] 13
Так работает, спасибо за помощь!
0
Модератор
Эксперт .NET
15466 / 10712 / 2786
Регистрация: 21.04.2018
Сообщений: 31,536
Записей в блоге: 2
11.08.2018, 19:31 14
Ок! Удачи!
0
11.08.2018, 19:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.08.2018, 19:31
Помогаю со студенческими работами здесь

Реализовать движение змейки
Помогите сделать курсовую из turbo pascal в ABC! uses crt,graph; {подключаем модули Crt и Graph}...

Движение змейки - разобрать код
Доброе время суток. Есть задание написать змейку, которая ползает по экрану. Искал подобные темы,...

Осуществить движение змейки без задержки на ожидания ввода
Я вот пишу змейку и у меня встал вопрос. Змейка движется сама, то есть мы управляем только ее...

Перемещение змейки
#include <iostream> //стандартная библиотека #include <time.h> //случайные числа #include...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru