Игра на 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) 
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.
Теперь займёмся визуализацией траектории снаряда. Мы будем рисовать его текущее местоположение через заданные промежутки времени. Для этого инициализируем  графику и будем рисовать положение снаряда как окружность. Подробно о работе с графикой в Vb
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) 
        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)

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