Игра на 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, отвечают за ускорение снаряда по осям x и y. Введём переменные 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

Полная версия программы на Vb стрельба из пушки

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

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

Полезно почитать по теме графика в Vb
Графика в Vb
Моделирование полета тела

Поделиться:

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

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