Интернет-журнал "Домашняя лаборатория", 2008 №7 - Журнал «Домашняя лаборатория»
Х_старта = Размер_поля — Размер_старта 'Чтобы старт находился у правой кромки поля
Х_финиша = 0 'Чтобы финиш находился у левой кромки поля
У_старта = Размер_поля / 2 'Чтобы старт по высоте находился посредине поля
У_финиша = Размер_поля / 2 'Чтобы финиш по высоте находился посредине поля
Число_газонов = 30
Максимальный_размер_газона = Размер_поля / 6 Пороговая_скорость = 200
End Sub
Private Sub Кнопка_начинай_сначала_С1ick()
Клавиатура_сработала = False 'Мы еще не стартовали
Timer1.Enabled = False 'Нечего мотору зря работать до начала гонки
'Рисуем поле игры со всеми элементами:
Cls 'Перед тем, как заново рисовать, надо все стереть
Рисуем_границы_поля
Рисуем_старт
Рисуем_финиш
Рисуем_газоны
'Необходимые начальные установки:
Ставим_машину_на_старт
Приехали = False
Timer1.Enabled = True 'Заводим мотор, скоро начало гонки
Спидометр. SetFocus 'Это чтобы фокус ушел с кнопки, а то первое нажатие на стрелку действует не так, как нам надо
End Sub
Private Sub Рисуем_границы_поля()
DrawWidth = 10
Line (0, 0) — (Размер_поля, Размер_поля), vbRed, В
DrawWidth = 1 'Возвращаем нормальную толщину карандаша
End Sub
Private Sub Рисуем_старт()
Line (Х_старта, У_старта)-(Х_старта + Размер_старта, У_старта + Размер_старта), vbGreen, BF
End Sub
Private Sub Рисуем_финиш()
Line (Х_финиша, У_финиша) — (Х_финиша + Размер_финиша, У_финиша + Размер_финиша), vbBlue, BF
End Sub
Private Sub Рисуем_газоны() 'Каждый газон — это прямоугольник случайного размера в случайном месте Dim i As Integer
Dim Х_газона As Integer 'Горизонтальная координата верхнего левого угла газона
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
Недоработки проекта
Замеченные мной недоработки вызваны в основном нежеланием увеличивать размер кода и заключаются в следующем:
Координатами (х, у) машины считается ее левый верхний угол, а не центр. Причина этого — слишком простые операторы в процедуре Показываем_автомобиль. Это приводит к некоторой ассиметрии поведения машины при переезде с цвета на цвет. Немного повозившись, вы сможете исправить положение.
При большой скорости машина делает огромные шаги от одного такта таймера к другому. А ведь цвет под собой она ощущает не непрерывно, а только на тактах таймера. Значит она может перепрыгнуть через тоненький газон, не заметив его. То же относится к финишу и особенно к ограждению. Сделайте их потолще, чем у меня на картинке, или ограничьте