русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Создаем шар. Завершаем проект


Дата добавления: 2015-06-12; просмотров: 589; Нарушение авторских прав


Модуль класса clsЛовец остается прежним. Приведу в окончательном виде все остальное, а именно: модуль класса clsШар, модуль кода и модуль (окно кода) формы.

Модуль кода

Public Const Число_шаров = 10

Public Const Размер_шара = 200

Public Const Размер_ловца = 500

Public Const Дальность = 200 'Это расстояние, на котором ловец достает шар

Public Ловец As clsЛовец 'Объявляем объект Ловец класса clsЛовец

Public Шар(1 To Число_шаров) As clsШар 'Объявляем массив объектов Шар класса clsШар

Модуль формы

Public intЧисло_пойманных_шаров As Integer

 

Private Sub Form_Load() 'Эта процедура выполняется один раз при запуске проекта

Dim i As Integer

Randomize 'Шары должны разлетаться со случайной скоростью и в случайном направлении

'Настраиваем размеры изображений шара и ловца:

imgШар(1).Height = Размер_шара

imgШар(1).Width = Размер_шара

imgЛовец.Height = Размер_ловца

imgЛовец.Width = Размер_ловца

'Порождаем массив изображений шара:

For i = 2 To Число_шаров

Load imgШар(i)

imgШар(i).Visible = True

Next i

'Порождаем объект Ловец и массив объектов-шаров:

Set Ловец = New clsЛовец

For i = 1 To Число_шаров

Set Шар(i) = New clsШар

Next i

 

Начальная_установка

KeyPreview = True 'Чтобы форма реагировала на клавиатуру

txtСчетчик_времени.Locked = True 'Чтобы в процессе игры нельзя было вручную менять показания счетчика

End Sub

 

Private Sub cmd_Начинай_сначала_Click() 'Что происходит при нажатии кнопки НАЧИНАЙ СНАЧАЛА

Начальная_установка

txtСчетчик_времени.SetFocus 'Чтобы фокус ушел с кнопки, иначе первое нажатие на стрелки клавиатуры не вызывает движения ловца

End Sub

 

Private Sub Начальная_установка() 'Все объекты встают в исходную позицию и настраиваются на новую игру

Dim i As Integer

txtСчетчик_времени.Text = 0 'Обнуляем счетчик времени



intЧисло_пойманных_шаров = 0 'Обнуляем число пойманных шаров

 

Ловец.Начальная_установка 'Ловец встает в исходную позицию и настраивается на новую игру

For i = 1 To Число_шаров 'Все шары встают в исходную позицию и настраиваются на новую игру

Шар(i).Начальная_установка

Next i

End Sub

 

Private Sub Timer1_Timer() 'Главная_процедура игры, выполняется один раз на каждом импульсе таймера

Dim i As Integer

'Действуют все шары:

For i = 1 To Число_шаров

Шар(i).Действие 'Сначала объект Шар вычисляет свои координаты,

imgШар(i).Left = Шар(i).x 'Затем изображение шара сдвигается на вычисленные координаты

imgШар(i).Top = Шар(i).y

Next i

'Действует ловец:

Ловец.Действие 'Сначала объект Ловец вычисляет свои координаты,

imgЛовец.Left = Ловец.x 'Затем изображение Ловца сдвигается на вычисленные координаты

imgЛовец.Top = Ловец.y

'Действует счетчик времени на форме, увеличивая свои показания на 1:

If intЧисло_пойманных_шаров <> Число_шаров Then txtСчетчик_времени.Text = txtСчетчик_времени.Text + 1

End Sub

'Обработка события - нажатия клавиши на клавиатуре для управления ловцом:

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)

Select Case KeyCode

Case vbKeyUp Ловец.Руль = вверх

Case vbKeyLeft Ловец.Руль = влево

Case vbKeyDown Ловец.Руль = вниз

Case vbKeyRight: Ловец.Руль = вправо

Case vbKeyControl: Ловец.Руль = стоп

End Select

End Sub

 

Модуль clsШар

Public x As Long 'Координаты шара

Public y As Long

Private dx As Long 'Шаг шара по горизонтали и вертикали между двумя импульсами таймера

Private dy As Long

Private Макс_шаг As Long 'Максимально возможное значение шага шара

 

Private Sub Class_Initialize() 'Процедура, выполняющаяся при рождении шара

Макс_шаг = 100

End Sub

 

Public Sub Начальная_установка() 'Шар встает в исходную позицию и настраивается на новую игру

'Ставим шар на исходную позицию:

x = f.shpБортик.Left + f.shpБортик.Width * 3 / 4 'Она отстоит по горизонтали на четверть ширины поля от правого его края

y = f.shpБортик.Top + f.shpБортик.Height / 2 'Она по вертикали расположена посредине поля

'Вычисление шага:

dx = Макс_шаг * (1 - 2 * Rnd) 'Шаг по горизонтали случаен и не превосходит Макс_шаг

dy = Макс_шаг * (1 - 2 * Rnd) 'Шаг по вертикали случаен и не превосходит Макс_шаг

End Sub

 

Public Sub Действие() 'Главная_процедура шара, выполняется один раз на каждом импульсе таймера

If Поймали Then Выход_шара_из_игры 'Сначала шар определяет, не поймали ли его,

Отскакивать_или_нет 'затем, если бортик рядом, реагирует на него,

Шаг 'и наконец делает шаг

End Sub

 

Private Sub Отскакивать_или_нет() 'Реакция на бортик

If Шар_у_пола_или_потолка Then

dy = -dy 'Отскок от пола или потолка

ElseIf Шар_у_стен Then

dx = -dx 'Отскок от стен

End If

End Sub

 

Private Sub Шаг()

x = x + dx

y = y + dy

End Sub

 

Private Function Шар_у_пола_или_потолка() As Boolean

If y < f.shpБортик.Top Or y + Размер_шара > f.shpБортик.Top + f.shpБортик.Height Then

Шар_у_пола_или_потолка = True

Else

Шар_у_пола_или_потолка = False

End If

End Function

 

Private Function Шар_у_стен() As Boolean

If x < f.shpБортик.Left Or x + Размер_шара > f.shpБортик.Left + f.shpБортик.Width Then

Шар_у_стен = True

Else

Шар_у_стен = False

End If

End Function

 

Private Function Поймали() As Boolean

'ЕСЛИ расстояние по горизонтали между центрами шара и ловца меньше Дальности

'И если расстояние по вертикали между центрами шара и ловца меньше Дальности, ТО

If Abs(x - Ловец.x - ((Размер_ловца - Размер_шара) / 2)) < Дальность _

And Abs(y - Ловец.y - ((Размер_ловца - Размер_шара) / 2)) < Дальность _

Then

Поймали = True

Else

Поймали = False

End If

End Function

 

Private Sub Выход_шара_из_игры()

x = -10000: y = -10000: dx = 0: dy = 0 'Убрать шар подальше с глаз долой и чтоб не двигался

f.intЧисло_пойманных_шаров = f.intЧисло_пойманных_шаров + 1

End Sub

 

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

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

В модуле формы разберитесь самостоятельно. Я думаю, что комментариев достаточно. Поговорим подробнее о модуле шара. Совершенно аналогично модулю ловца здесь имеется два метода - Начальная_установка и Действие. Метод Действие главный, он определяет, что должен делать шар в каждое мгновение своего полета. Он должен знать, поймали его или нет, и пора ли отскакивать от бортика. Этому и посвящены первые две из трех строк процедуры Действие. Эти две строки вычисляют нужным образом dx и dy, а третья строка - Шаг - изменяет в соответствии с этими значениями координаты x и y. Все, больше ничего во время движения шара делать не нужно.

Теперь посмотрим, что происходит при нажатии на кнопку "Начинай сначала". Выполняется процедура cmd_Начинай_сначала_Click и после пары прыжков по процедурам Visual Basic передает управление процедуре Начальная_установка каждого шара. Здесь трудности у вас может вызвать вычисление dx и dy. Поскольку значение Rnd есть случайное число в диапазоне от 0 до 1, то легко видеть, что как dx, так и dy будут случайными числами в диапазоне от -100 до 100. Этого достаточно, чтобы шар полетел со случайной скоростью в случайном направлении.

Теперь насчет отскока. Возможно, тем, кто не очень силен в математике и физике, покажется удивительным, что для отскока от горизонтальной преграды достаточно выполнить оператор dy = -dy, то есть поменять вертикальную составляющую шага на ее противоположное значение. "Но это действительно так!" Аналогично, достаточно выполнить оператор dx = -dx для отскока от вертикальной преграды. Чтобы лучше понять этот факт, запустите пошаговый режим при Макс_шаг=1000 и Число_шаров=1. При этом проследите внимательно за dx и dy, x и y.

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

Замеченные мной недоработки проекта вызваны нежеланием усложнять и увеличивать в объеме его код. Вот они:

· Иногда шар, вместо того, чтобы отскочить от борта, начинает двигаться скачками вдоль него. Возьмем к примеру левый бортик. Почти наверняка это связано с неточностью обработки вещественных чисел в операторе x=x+dx, в результате чего после отскока опять выполняется условие x < f.shpБортик.Left и шарик опять выполняет оператор dx = -dx. Рискну посоветовать (сам не проверял): в момент отскока незначительно увеличьте абсоютное значение шага: dx = -(dx+0.001).

· Я не знаю, как поведет себя шар, попавший точно в угол. По идее, он должен там застрять. Но у меня так ни разу не было.

· Постоянными нажатиями на клавиши направления мы можем передвигать ловца за пределами стола. Ни к чему это. Надо бы запретить.



<== предыдущая лекция | следующая лекция ==>
Создаем ловца | Еще об объектах


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.009 сек.