Игра на VB стрельба из пушки
Игра на 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
Моделирование полета тела
Поделиться:
Нет комментариев. Ваш будет первым!