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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Игра змейка на vbnet 2003, как сделать поворот змейки? 
:(
    Опции темы
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   Вверх
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   Вверх
WWW123
Дата 7.10.2016, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


Опытный
**


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

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



jsharp36 Расскажи про ООП smile)) 
WWW123 У тебя есть размер одной клетки в пикселях. Значит ты знаешь сколько всего клеток на форме скажем махX и MaxY. Таким образом при генерации яблока ты генерируешь случайное число от 0 до maxX-1 и второе случайное число от 0 до maxY-1. Умножаешь на ширину одной клетки в пикселях и получаешь координаты в пикселях.
PM   Вверх
WWW123
Дата 7.10.2016, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Размер клетки у меня 8x8. Форма у меня 304х304. Клеток 38х38. Голова змеи 16х16. Размер яблока 16х16. При генерации яблока я генерирую числа от 0 до 38 и от 0 до 38. Умножаем на 8. Получаем координаты в пикселях. А как привязать координаты яблока и координаты змеи?
PM MAIL   Вверх
Garmahis
Дата 7.10.2016, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Так. Погоди. У тебя получается змея и яблоко занимают 4 клетки??? Какой в этом смысл? Насколько я понимаю логику этой игры один сегмент змеи = 1 клетке. и яблоко = 1 клетке. И змея каждую итерацию перемещается на одну клетку.
PM   Вверх
WWW123
Дата 7.10.2016, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Крупнее лучше видно и красивее. Змея движется по таймеру. 
PM MAIL   Вверх
Garmahis
Дата 7.10.2016, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Тогда делай клетку тоже 16х16
PM   Вверх
WWW123
Дата 7.10.2016, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Сделал клетку 16х16. Что дальше?
PM MAIL   Вверх
Garmahis
Дата 7.10.2016, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ну вот теперь у тебя 19 клеток. 
И так алгоритм следующий.
1. у тебя всего 361 клетка. Ты должен сравнить число существующих PictureBox, которые являются телом змеи и уже созданными яблоками и убедиться что их число < 361. 
2. Получаешь координаты x и y:  случайное число от 0 до 18 * 16. Дальше ты сравниваешь их с координатами существующих PictureBox, которые являются телом змеи и уже созданными яблоками и убедиться что они не совпадают. Если совпадают то повторяешь генерацию еще раз. 
3. Создаешь новый PictureBox по этим координатам.
Вот это простейший алгоритм. На самом деле он ущербен. Так как по мере увеличения занятых клеток генерация новых координат будет занимать все больше и больше времени. Какие способы решения? Их множество. Например ты можешь создать массив по всем клеткам 1 - клетка занята, 0 - свободна. Дальше ты генерируешь случайное число от 1 до количества свободных клеток. А дальше смотришь в твоем массиве какая эта клетка. Это гарантирует что он всегда с первого раза будет попадать в свободную клетку. Именно по этому для решения этих задач предпочтителен объектно оринтированый подход. 
PM   Вверх
WWW123
Дата 7.10.2016, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот исходник. Змея и яблоко на разных уровнях.


Код

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
        If PictureBox1.Left + 35 >= Width Then Timer1.Enabled = False 'проверка выхода за границу
        If PictureBox1.Left <= 0 Then Timer1.Enabled = False
        If PictureBox1.Top + 55 >= Height Then Timer1.Enabled = False
        If PictureBox1.Top <= 0 Then Timer1.Enabled = False
        If PictureBox1.Top <= 0 Then Label1.Visible = True 'игра окончена
        If PictureBox1.Top + 55 >= Height Then Label1.Visible = True
        If PictureBox1.Left <= 0 Then Label1.Visible = True
        If PictureBox1.Left + 35 >= Width Then Label1.Visible = True
    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
        Randomize()
        PictureBox0.Left = (272 * Rnd())     'добавляем яблоко
        PictureBox0.Top = (256 * Rnd())
    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

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


Опытный
**


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

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



Не не так. Зачем тебе двигать голову? Ты собираешься двигать каждую часть змеи даже когда она будет состоять из 300 сегментов? Я же писал переноси просто хвост и ставь его перед головой. Тебе надо написать функцию, которая бы возвращала бы тебе PictureBox головы или хвоста. Ты получаешь PictureBoxFirst и PictureBoxLast. Кроме того тебе нужна функция, которая определяет есть ли в координатах яблоко. Если SearchApple(PictureBoxFirst.Left +x, PictureBoxFirst.Top +y) тогда это яблоко становиться телом змеи и шаг заканчивается. Если нет то проверяешь что PictureBoxFirst.Left +x, PictureBoxFirst.Top +y не выходят за границу поля и не втыкаются в тело змеи. Если да то конец игры. А дальше просто PictureBoxLast.Left = PictureBoxFirst.Left + x  PictureBoxLast.Top = PictureBoxFirst.Top +y
Вот и все. змея сделала шаг.

PM   Вверх
WWW123
Дата 7.10.2016, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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



Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  snake7.rar 220,65 Kb
PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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