Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
💸 Как сделать бизнес проще, а карман толще?
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое раписание, но и напоминать клиентам о визитах тоже.
Проблема в том, что средняя цена по рынку за такой сервис — 800 руб/мес или почти 15 000 руб за год. И это минимальный функционал.
Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.⚡️ Для новых пользователей первый месяц бесплатно. А далее 290 руб/мес, это в 3 раза дешевле аналогов. За эту цену доступен весь функционал: напоминание о визитах, чаевые, предоплаты, общение с клиентами, переносы записей и так далее. ✅ Уйма гибких настроек, которые помогут вам зарабатывать больше и забыть про чувство «что-то мне нужно было сделать». Сомневаетесь? нажмите на текст, запустите чат-бота и убедитесь во всем сами! Создаем шар. Завершаем проект
Модуль класса 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). · Я не знаю, как поведет себя шар, попавший точно в угол. По идее, он должен там застрять. Но у меня так ни разу не было. · Постоянными нажатиями на клавиши направления мы можем передвигать ловца за пределами стола. Ни к чему это. Надо бы запретить.
|