Игра на VB стрельба из пушки

27 октября 2018 - Администратор

Игра на Vb стрельба из пушки на подобии игры танки.

В этом уроке мы разберём компьютерное моделирование полёта снаряда на VB, использование констант в Vb и случайные  значения в VB. Программа отображает траекторию полета снаряда по параболе в поле тяжести земли по заданным углу и начальной скорости.

В программе должно быть два текстовых поля для ввода начального угла и начальной скорости  Введем поле для вывода результатов  и две кнопки «Выстрелить» и «Играть» В  поле для визуализации полёта снаряда отображается траектория полета снаряда. Сначала пользователь должен ввести значения скорости выпуска снаряда в метрах в секунду и угла выпуска снаряда в градусах, затем он должен нажать кнопку «Выстрелить», после чего на поле появится траектория снаряда, летящего с заданной скоростью под заданным углом с земной гравитацией. При нажатии кнопки «Играть»,  на поле появится мишень в виде прямой линии, позиция мишени задаётся компьютером случайно. После этого игрок должен подобрать такие значения скорости и угла запуска, чтобы снаряд попал в мишень. Если снаряд попал в мишень, то должно выводиться сообщение «Вы победили!», если нет, то «Вы проиграли». Мы не ограничиваем количество попыток для попадания в мишень. При каждой новой попытке попадания старые траектории не удаляются. Если же мы хотим поменять позицию мишени, то пользователь должен снова нажать кнопку «Играть», при этом все траектории сотрутся и мишень поменяет своё место.

Создаём данный интерфейс, при этом задаём элементы MaskedTextBox только для ввода угла и начальной скорости

интерфейс игры

Сначала введём константы, необходимые для расчёта траектории полёта. g – ускорение свободного падения на Земле и pi – число π.

Public Const g As Double = 9.81

Public Const pi As Double = 3.14

Теперь введём переменные для расчёта траектории полёта снаряда. Нам нужно ввести переменные v и phi, отвечающие за начальную скорость выпуска снаряда и угол выпуска снаряда соответственно.  Переменные x, y, отвечают за позицию снаряда, vx, vy, отвечают за скорость снаряда и ax, ay, отвечают за ускорение снаряда. Введём переменные xe, ye и r нужные для визуализации траектории, переменную xt, отвечающую за визуализацию мишени.

Для начала реализации алгоритма нам нужно считать данные. В Visual Basic синусы и косинусы считаются только в радианах, поэтому мы переведём угол из градусов в радианы.  Для этого напишем следующее.

v = MaskedTextBox2.Text

phi = MaskedTextBox3.Text

phi = phi * pi / 180

Теперь зададим начальную скорость по вертикали и горизонтали. Для расчёта скорости по вертикали умножим числовое значение скорости на синус заданного угла полёта, при этом нужно учитывать гравитацию, поэтому нужно убавить полученное значение на ускорение, умноженное на время. Для расчёта скорости по горизонтали умножим скорость на косинус заданного угла.  В итоге получится следующее.

vy = v * Math.Sin(phi) - ay * dt

vx = v * Math.Cos(phi)

x = 0

y = 1

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

While y > 0 

ay = -g

Минус g, потому что ускорение направлено вниз.

Запишем формулы для расчёта координат и скоростиснаряда.

y = y + vy * dt + ay * Math.Pow(dt, 2) / 2

vy = vy + ay * dt

x = x + vx * dt

Скорость  по горизонтали не меняется

Система координат в графике Vb для оси х слева направо для оси y сверху вниз, поэтому чтобы перевести координаты снаряда в  координаты графики Vb нужно использовать

ye = 300 - y

xe = x

300 нулевой уровень координаты y.

Теперь займёмся визуализацией траектории снаряда. Мы будем рисовать его текущее местоположение через заданные промежутки времени. Для этого иницилизируем  графику и будем рисовать положение снаряда как окружность.

Dim graph As Graphics = PictureBox1.CreateGraphics

Dim black = New Pen(Drawing.Color.Black, 1)

Dim rect As Rectangle

            rect.X = xe + r

            rect.Y = ye + r

            rect.Width = 2 * r

            rect.Height = 2 * r

            graph.DrawEllipse(black, rect)

Сделаем проверку того, попал ли снаряд в мишень или нет. Добавим разброс в 20 пикселей, чтобы было легче попасть в цель.

If xe > xt - 20 And xe < xt + 20 Then

            Label1.Text = "Вы победили!"

        End If

        If Not (xe > xt - 20 And xe < xt + 20) Then

            Label1.Text = "Вы проиграли."

        End If

Напишем визуализацию мишени. Для этого введём отдельный графический объект для мишени и новую переменную random, отвечающую за случайные значения. Случайное значение задаётся с помощью random.Next(0, 100). Присваиваем получившееся значение переменной xt. Нарисуем мишень с помощью линии при нажатии кнопки Играть, т.е.

 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        PictureBox1.Refresh()

        Dim graph As Graphics = PictureBox1.CreateGraphics

        Dim black = New Pen(Drawing.Color.Black, 1

        Dim random As New Random()

        xt = 30 + random.Next(0, 100)

        xt = random.Next(0, 400)

        graph.DrawLine(black, xt - 20, 300, xt + 20, 300)

    End Sub

Полная версия программы:

Public Class Form1

    Public Const g As Double = 9.81

    Public Const pi As Double = 3.14

    Dim v, phi As Double

    Dim x, y, vx, vy, ax, ay As Double

    Dim xe, ye As Double

    Dim r As Double = 2

    Dim dt As Double = 0.1

    Dim xt As Integer

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

       MaskedTextBox2.Text = 30

        MaskedTextBox3.Text = 70

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim graph As Graphics = PictureBox1.CreateGraphics

        Dim black = New Pen(Drawing.Color.Black, 1)

        v = MaskedTextBox2.Text

        phi = MaskedTextBox3.Text

        phi = phi * pi / 180

        vy = v * Math.Sin(phi) - ay * dt

        vx = v * Math.Cos(phi)

        x = 0

        y = 1

        While y > 0

            ay = -g

            y = y + vy * dt + ay * Math.Pow(dt, 2) / 2

            vy = vy + ay * dt

            x = x + vx * dt

            ye = 300 - y

            xe = x

            Dim rect As Rectangle

            rect.X = xe + r

            rect.Y = ye + r

            rect.Width = 2 * r

            rect.Height = 2 * r

            graph.DrawEllipse(black, rect)

        End While

        If xe > xt - 20 And xe < xt + 20 Then

            Label1.Text = "Вы победили!"

        End If

        If Not (xe > xt - 20 And xe < xt + 20) Then

            Label1.Text = "Вы проиграли."

        End If

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        PictureBox1.Refresh()

        Dim graph As Graphics = PictureBox1.CreateGraphics

        Dim black = New Pen(Drawing.Color.Black, 1

        Dim random As New Random()

        xt = 30 + random.Next(0, 100)

        xt = random.Next(0, 400)

        graph.DrawLine(black, xt - 20, 300, xt + 20, 300)

    End Sub

End Class

 Вернуться к содержанию

Комментарии (0)

Нет комментариев. Ваш будет первым!