Dim У_газона As Integer 'Вертикальная координата верхнего левого угла газона
For i = 1 То Число_газонов ' Числа в формулах подобраны на опыте:
Х_газона = 2 * Размер_финиша + Размер_поля * Rnd *2/3
У_газона = Размер_финиша + (Размер_поля — Размер_финиша — Максимальный_размер_газона) * Rnd
Line (Х_газона, У_газона)-(Х_газона + Максимальный_размер_газона * Rnd, У_газона + Максимальный_размер_газона * Rnd), vbMagenta, BF Next
End Sub
Private Sub Ставим_машину_на_старт()
x = Х_старта:
у = У_старта 'Координаты машины приравниваются координатам точки старта
Скорость = 0: Путь = 0: Время = 0
Руль = влево 'Это чтобы машина знала, куда ехать, когда стартуем нажатием на газ
Едем_влево 'Отсюда нам нужна только ориентация машины налево, а шага не будет, так как скорость=0
Педаль = ни_та_ни_эта 'Газовать пока нельзя, а тормозить бессмысленно
Image_авто. Visible = True 'До первого старта я сделал машину невидимой, теперь пришла пора ей появиться
Показываем_автомобиль
End Sub
Private Sub Timer1_Timer()
Определяем_где_мы
If Приехали Then Exit Sub
Изменяем_скорость
Выбираем_куда_ехать_и_делаем_шаг
Показываем автомобиль
Отображаем_информацию
End Sub
Private Sub Определяем_где_мы()
Цвет_под_автомобилем = Point(x, y)
Select Case Цвет_под_автомобилем
Case vbMagenta: Скорость = 15 'На газоне скорость мала
Case vbBlue: Сообщение.Text = "Финиш!": Timer1.Enabled = False: Приехали = True
Case vbRed: Сообщение.Text = "Врезались в ограждение!":
Timer1.Enabled = False: Приехали = True
End Select
End Sub
Private Sub Изменяем_скорость()
Select Case Педаль
Case газ
Скорость = Скорость + 5
Case тормоз
If Скорость > 0 Then Скорость = Скорость — 10 'потому, что тормоз быстрее газа
If Скорость < 0 Then Скорость =0 'В результате быстрого торможения скорость может стать отрицательной, что и предотвращается
End Select
Педаль = ни_та_ни_эта 'Это чтобы во время набора скорости и торможения приходилось без перерыва жать на педаль
End Sub
Private Sub Выбираем_куда_ехать_и_делаем_шаг()
Select Case Руль
Case вверх: Едем_вверх
Case вниз: Едем_вниз
Case влево: Едем_влево
Case вправо: Едем_вправо
End Select
End Sub
Private Sub Едем_вверх()
Image_авто. Picture = Image_вверх. Picture
у = у — Скорость
End Sub
Private Sub Едем_вниз()
Image_авто. Picture = Image_вниз. Picture
у = у + Скорость
End Sub
Private Sub Едем_влево()
Image_авто. Picture = Image_налево. Picture
x = x — Скорость
End Sub
Private Sub Едем вправо()
Image_авто. Picture = Image_направо. Picture
х = х + Скорость
End Sub
Private Sub Показываем_автомобиль()
Image_авто. Left = x
Image_авто. Top = у
End Sub
Private Sub Отображаем_информацию()
Спидометр.Text = Скорость
Путь = Путь + Скорость 'Нужно помнить, что именем Скорость назван шаг автомобиля
txtПуть.Text = Путь
If Клавиатура_сработала Then Время = Время + 1 'Счетчик времени запускается только тогда, когда мы стартуем
txtBpeмя.Text = Время
End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Клавиатура_сработала = True
Select Case KeyCode
Case vbKeyUp: If Скорость < Пороговая_скорость Then Руль = вверх 'Поворот на большой скорости запрещен
Case vbKeyLeft: If Скорость < Пороговая_скорость Then Руль = влево
Case vbKeyDown: If Скорость < Пороговая_скорость Then Руль = вниз
Case vbKeyRight: If Скорость < Пороговая_скорость Then Руль = вправо
Case vbKeySpace: Педаль = газ
Case vbKeyB: Педаль = тормоз
End Select
KeyCode = 0 ' Это чтобы объекты на форме не реагировали на клавиатуру
End Sub
Недоработки проекта
Замеченные мной недоработки вызваны в основном нежеланием увеличивать размер кода и заключаются в следующем:
Координатами (х, у) машины считается ее левый верхний угол, а не центр. Причина этого — слишком простые операторы в процедуре Показываем_автомобиль. Это приводит к некоторой ассиметрии поведения машины при переезде с цвета на цвет. Немного повозившись, вы сможете исправить положение.
При большой скорости машина делает огромные шаги от одного такта таймера к другому. А ведь цвет под собой она ощущает не непрерывно, а только на тактах таймера. Значит она может перепрыгнуть через тоненький газон, не заметив его. То же относится к финишу и особенно к ограждению. Сделайте их потолще, чем у меня на картинке, или ограничьте скорость.
Сам бог велел вам добавить в проект управление машиной с помощью мыши. Например, щелчок мышью в стороне от машины вызывает поворот машины в эту сторону, удерживание нажатой левой клавиши мыши — газ, правой — тормоз. Для этого вам нужно будет написать процедуру MouseDown, придавая в ней нужные значения переменным Руль и Педаль аналогично тому, как это делает процедура KeyDown. Вам придется поразмыслить, как правильно сравнить координаты машины и мыши, чтобы добиться нужного результата.