Онлайн
библиотека книг
Книги онлайн » Разная литература » Интернет-журнал "Домашняя лаборатория", 2008 №7 - Журнал «Домашняя лаборатория»

Шрифт:

-
+

Закладка:

Сделать
1 ... 181 182 183 184 185 186 187 188 189 ... 192
Перейти на страницу:
экрана должен быть и снизу Размер_старта = 600 Размер_финиша = 600

Х_старта = Размер_поля — Размер_старта 'Чтобы старт находился у правой кромки поля

Х_финиша = 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

Недоработки проекта

Замеченные мной недоработки вызваны в основном нежеланием увеличивать размер кода и заключаются в следующем:

Координатами (х, у) машины считается ее левый верхний угол, а не центр. Причина этого — слишком простые операторы в процедуре Показываем_автомобиль. Это приводит к некоторой ассиметрии поведения машины при переезде с цвета на цвет. Немного повозившись, вы сможете исправить положение.

При большой скорости машина делает огромные шаги от одного такта таймера к другому. А ведь цвет под собой она ощущает не непрерывно, а только на тактах таймера. Значит она может перепрыгнуть через тоненький газон, не заметив его. То же относится к финишу и особенно к ограждению. Сделайте их потолще, чем у меня на картинке, или ограничьте

1 ... 181 182 183 184 185 186 187 188 189 ... 192
Перейти на страницу: