Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Игра змейка на vbnet 2003, как сделать поворот змейки? 
:(
    Опции темы
WWW123
Дата 5.10.2016, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 28.9.2016

Репутация: нет
Всего: нет



Здравствуйте.
Как сделать поворот змейки не налево и направо, а по и против часовой стрелки?
PM MAIL   Вверх
Garmahis
Дата 5.10.2016, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 23.12.2004

Репутация: нет
Всего: 4



Точно так же как поворот налево и направо smile только против и по часовой стрелке... 
PM   Вверх
WWW123
Дата 5.10.2016, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 28.9.2016

Репутация: нет
Всего: нет



Как сделать чтобы при движении налево и при нажатии клавиши влево, змейка двигалась вниз, то есть против часовой стрелки?

Код

 Dim x, y As Integer

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        PictureBox1.Left = PictureBox1.Left + x
        PictureBox1.Top = PictureBox1.Top + y
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        y = -2                 'движение после загрузки
        Timer1.Enabled = True
    End Sub

    Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
        If e.KeyCode = Keys.Left Then x = -2 : y = 0
        If e.KeyCode = Keys.Right Then x = 2 : y = 0
        If e.KeyCode = Keys.Up Then x = 0 : y = -2
        If e.KeyCode = Keys.Down Then x = 0 : y = 2
    End Sub


Это сообщение отредактировал(а) WWW123 - 5.10.2016, 12:51
PM MAIL   Вверх
Garmahis
Дата 5.10.2016, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 23.12.2004

Репутация: нет
Всего: 4



в каждом if, где вы сейчас определяете какая клавиша нажата анализировать текущие значения x и y и уже на основании этого устанавливать новые значения.
PM   Вверх
WWW123
Дата 5.10.2016, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 28.9.2016

Репутация: нет
Всего: нет



Код

   Dim x, y As Integer

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        PictureBox1.Left = PictureBox1.Left + x
        PictureBox1.Top = PictureBox1.Top + y
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        y = -2                 'движение после загрузки
        Timer1.Enabled = True
    End Sub

    Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
        If e.KeyCode = Keys.Left And y = -2 Then x = -2 : y = 0
        If e.KeyCode = Keys.Left And y = 2 Then x = 2 : y = 0
        If e.KeyCode = Keys.Left And x = 2 Then x = 0 : y = -2
        If e.KeyCode = Keys.Right Then x = 2 : y = 0
        If e.KeyCode = Keys.Up Then x = 0 : y = -2
        If e.KeyCode = Keys.Down Then x = 0 : y = 2

    End Sub


Когда изменил третий If , программа стала работать неправильно. Перескакивает и выполняет следующий оператор If
PM MAIL   Вверх
WWW123
Дата 6.10.2016, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 28.9.2016

Репутация: нет
Всего: нет



 Не могу загрузить exe файл на форум. Такой тип файла не можете загружать, пишет.

Это сообщение отредактировал(а) WWW123 - 6.10.2016, 08:36
PM MAIL   Вверх
WWW123
Дата 6.10.2016, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 28.9.2016

Репутация: нет
Всего: нет



змейка движется правильно. Добавил ElseIf
PM MAIL   Вверх
WWW123
Дата 6.10.2016, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 28.9.2016

Репутация: нет
Всего: нет



Как сделать хвост змеи?
PM MAIL   Вверх
Garmahis
Дата 6.10.2016, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 23.12.2004

Репутация: нет
Всего: 4



Я правильно понимаю что каждая клеточка тела змеи у тебя отдельный PictureBox? Если так то просто переносишь последний в то место куда змея должна шагнуть. Если змея упирается головой в PictureBox еды то, он просто становиться головой и в эту итерацию змея не двигается. 
PM   Вверх
WWW123
Дата 6.10.2016, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 28.9.2016

Репутация: нет
Всего: нет



Спасибо, Garmahis. Сделал хвост. Как сделать чтобы игра прекращалась при ударении о границы формы? У меня не получается.

Код

    Dim x, y, x1, y1, n As Integer

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        PictureBox1.Left = PictureBox1.Left + x
        PictureBox1.Top = PictureBox1.Top + y
        PictureBox2.Left = PictureBox1.Left + x1
        PictureBox2.Top = PictureBox1.Top + y1

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        y = -2                 'движение после загрузки
        y1 = y + 20            'показываем хвост
        Timer1.Enabled = True
    End Sub

    Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
        If e.KeyCode = Keys.Left And y = -2 Then
            x = -2 : y = 0
        elseIf e.KeyCode = Keys.Left And y = 2 Then
            x = 2 : y = 0
        ElseIf e.KeyCode = Keys.Left And x = 2 Then
            x = 0 : y = -2
        ElseIf e.KeyCode = Keys.Left And x = -2 Then
            x = 0 : y = 2
        End If
        If e.KeyCode = Keys.Right And y = -2 Then
            x = 2 : y = 0
        ElseIf e.KeyCode = Keys.Right And y = 2 Then
            x = -2 : y = 0
        ElseIf e.KeyCode = Keys.Right And x = 2 Then
            x = 0 : y = 2
        ElseIf e.KeyCode = Keys.Right And x = -2 Then
            x = 0 : y = -2
        End If

        If x = -2 Then
            x1 = x + 20 : y1 = y
        End If
        If x = 2 Then
            x1 = x - 20 : y1 = y
        End If
        If y = -2 Then
            y1 = y + 20 : x1 = x
        End If
        If y = 2 Then
            y1 = y - 20 : x1 = x
        End If

        

    End Sub
  
    Sub выход_за_границы()
        If x > Width Then
            Timer1.Enabled = False
        End If
        If y > Height Then
            Timer1.Enabled = False
        End If
    End Sub


    Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click

    End Sub

PM MAIL   Вверх
Garmahis
Дата 6.10.2016, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 23.12.2004

Репутация: нет
Всего: 4



если (x, y <= 0) или (x >= Width) или (y >= Height)  значит конец так же я так понимаю если новые координаты головы совпали с координатами другой части змеи тоже конец.   
PM   Вверх
WWW123
Дата 6.10.2016, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 28.9.2016

Репутация: нет
Всего: нет



Я так и делаю. Змейка или прилипает к краю и движется только по краю или движется нормально, но в обоих случаях не реагирует на Timer1.Enabled = False
PM MAIL   Вверх
WWW123
Дата 6.10.2016, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 28.9.2016

Репутация: нет
Всего: нет



Сделал . Игра останавливается. Делал не через х , y,     а через picturebox

Это сообщение отредактировал(а) WWW123 - 6.10.2016, 19:36
PM MAIL   Вверх
jsharp36
Дата 7.10.2016, 04:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 8.10.2011

Репутация: нет
Всего: 1



Не хочется разбираться в этом адском языке и коде. Но если я понял задачу. Движется куда-то змея. Надо ее поворачивать относительно движения за или против стрелки.

Чуть простой математики и не надо этих ифов.

Давайте условимся направление помечать цифрой. По кругу, от 0 до 3.
Например, как мы привыкли в математике, от угла 0 и против часовой стрелки. (Это не важно на самом деле как, главное по кругу).
Вправо - 0, вверх - 1, влево - 2, вниз - 3.

Теперь, голова змеи всегда движется уже в каком-то направлении. И поворот ее клавишами вправо или влево будет значит к текущему направлению добавить +1 или -1. Желательно в этом же коде сразу проверить на выход за пределы и устанавливать нужное. Т.е. если стало значение -1, то сделать 3. Если +4, делает 0. Хотя подозреваю, работать будет и без этого, (на ходу придумываю алгоритм).

С направлениями определились? Дальше можете написать любимые ифы и в зависимости от направления, выставлять x и y: +2, 0, -2.

Что сложного вообще, вроде очевидно же?

Но и тут можно без ифов обойтись, чтобы красивее код был. Ифы портят код.

Не помню, как в VB деление по модулю? % ? Допустим так. Обычно так в других языках (хотя не всегда).
Допустим направление обозначим как d
Нам надо для икса, чтобы 0 и 2 стало 2 и -2. А 1 и 3 стали 0. Напряжем чуть мозг и:
x = 2 * ((1 - d) % 2) * (1 - d)
y = 2 * (d % 2) * (d - 2)

Тут я считаю, что координаты, как обычно в компьютере, идут с верхнего левого угла. Т.е. вверх y уменьшается.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
jsharp36
Дата 7.10.2016, 04:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 8.10.2011

Репутация: нет
Всего: 1



Не хочется разбираться в этом адском языке и коде. Но если я понял задачу. Движется куда-то змея. Надо ее поворачивать относительно движения за или против стрелки.

Чуть простой математики и не надо этих ифов.

Давайте условимся направление помечать цифрой. По кругу, от 0 до 3.
Например, как мы привыкли в математике, от угла 0 и против часовой стрелки. (Это не важно на самом деле как, главное по кругу).
Вправо - 0, вверх - 1, влево - 2, вниз - 3.

Теперь, голова змеи всегда движется уже в каком-то направлении. И поворот ее клавишами вправо или влево будет значит к текущему направлению добавить +1 или -1. Желательно в этом же коде сразу проверить на выход за пределы и устанавливать нужное. Т.е. если стало значение -1, то сделать 3. Если +4, делает 0. Хотя подозреваю, работать будет и без этого, (на ходу придумываю алгоритм).

С направлениями определились? Дальше можете написать любимые ифы и в зависимости от направления, выставлять x и y: +2, 0, -2.

Что сложного вообще, вроде очевидно же?

Но и тут можно без ифов обойтись, чтобы красивее код был. Ифы портят код.

Не помню, как в VB деление по модулю? % ? Допустим так. Обычно так в других языках (хотя не всегда).
Допустим направление обозначим как d
Нам надо для икса, чтобы 0 и 2 стало 2 и -2. А 1 и 3 стали 0. Напряжем чуть мозг и:
x = 2 * ((1 - d) % 2) * (1 - d)
y = 2 * (d % 2) * (d - 2)

Тут я считаю, что координаты, как обычно в компьютере, идут с верхнего левого угла. Т.е. вверх y уменьшается.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1811 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.