Приложение 2. ИГРА БЫКИ-КОРОВЫ

Приложение 2. ИГРА БЫКИ-КОРОВЫ

1 Автор: Тенгиз Куправа Приложение 2. ИГРА БЫКИ-КОРОВЫ Язык Visual Basic for Applications (VBA) используется для программирования приложений Microsoft Office. Он поддерживает современные технологии программирования и содержит специфические для каждого приложения объекты, в частности Excel. На примере простой программы Быки-Коровы покажем элементы программирования в Excel. Описание языка VBA можно найти в справочной системе Excel (клавиша F1), в разделе Сведения о программировании. Смысл игры пояснен на рис. П.19. Компьютер загадывает число из 4-х цифр. Ваша задача отгадать число из 10-ти попыток. После каждой попытки компьютер выводит информацию о совпадении цифр введенного числа с загаданным. Бык (Б) означает, что цифра отгадана и она стоит в нужной позиции. Корова (К) означает, что цифра отгадана, но она стоит не в своей позиции. На рис. П.19 загаданные цифры отгаданы с 3-ей попытки: Б=4, К=0. Рис. П.19 Кнопки для ввода цифр расположены на панели справа. Кнопка Новая игра инициирует новую игру. Кнопка Решение показывает загаданные цифры. Кнопка Сохранить позволяет сохранить протокол игры в файл, а кнопка Просмотреть просмотреть протоколы игр в редакторе NotePad. Ваша задача воспроизвести эту программу на своем компьютере. Задача решается в 4 этапа: ввод игрового поля и панели кнопок как на рис. П.19; ввод текста программы в редакторе Visual Basic; назначение кнопкам панели макросов-подпрограмм; отладка и тестирование программы. Введите игровое поле. Обратите внимание, что игровое поле размещено в диапазоне ячеек от (4:3) до (22:13) выбран стиль ссылок R1C1 (Сервис Параметры. вкладка Общие флаг Стиль ссылок R1C1, рис. 1.5). Строки для ввода цифр идут с интервалом 2, начиная со строки 4. Колонки также идут с интервалом 2, начиная с колонки 3. Колонки 11 и 13 используются для вывода результат совпадений. Нарисуйте панель с кнопками. Настройте изображения кнопок щелкните правой кнопкой мыши по каждой кнопке и в окне Формат объекта выполните настройки: шрифт, выравнивание по центру и пр. Рисование кнопок и назначение макросов было рассмотрено в главе 1. Вызовите редактор Visual Basic, вставьте новый модуль и введите текст программы (рис. П.18). После ввода текста программы проверьте его на наличие синтаксических ошибок: пункт меню Отладка Компилировать VBAProject (Debug Compile VBAProject). Исправьте ошибки

2 строго по тексту программы, с учетом всех знаков, точного написания названий подпрограмм, переменных и операторов. Текст программы можно скачать из Интернета по адресу в разделе Excel. Здесь приводим полный текст программы Быки-Коровы на языке VBA с комментариями. Public Row, Col As Integer Public Цифры(1 To 4) As Integer Sub Auto_open() НоваяИгра ' переменные для координат игрового поля ' массив для загаданных цифр ' обработчик события "при открытии книги" Sub НоваяИгра() ' инициализация игры Randomize ' загадывание 4-х разных чисел Цифры(1) = Int(10 * Rnd) ' с помощью функции Rnd() I = 2 Do While I <= 4 Цифры(I) = Int(10 * Rnd) For J = 1 To I - 1 If Цифры(J) = Цифры(I) Then I = I - 1 Exit For Next J I = I + 1 Loop For Row = 4 To 23 Step 1 ' очистка игрового поля For Col = 2 To 14 Step 1 Cells(Row, Col).Value = "" ' значение ячейки - пусто Cells(Row, Col).Font.Color = RGB(0, 0, 0) цвет символов ячейки - черный Next Col Next Row For I = 1 To 10 Step 1 ' пронумеровать строки Cells(2 + 2 * I, 2).Value = I Row = 4 ' подготовить координаты Col = 3 ' первой ячейки ввода Sub Кнопка0() ОбработкаЦифры (0) ' подпрограммы обработки нажатий цифровых кнопок Sub Кнопка1() ОбработкаЦифры (1) Sub Кнопка2() ОбработкаЦифры (2) Sub Кнопка3() ОбработкаЦифры (3) Sub Кнопка4() ОбработкаЦифры (4) Sub Кнопка5()

3 ОбработкаЦифры (5) Sub Кнопка6() ОбработкаЦифры (6) Sub Кнопка7() ОбработкаЦифры (7) Sub Кнопка8() ОбработкаЦифры (8) Sub Кнопка9() ОбработкаЦифры (9) Sub ОбработкаЦифры(Цифра) Cells(Row, Col).Activate ActiveCell.Value = Цифра If ActiveCell.Column < 9 Then Col = ActiveCell.Column + 2 Col = 3 Расчет ' подпрограмма записи цифры ' активизировать ячейку ' и записать в нее цифру ' все колонки строки заполнены? ' нет, на следующую колонку ' подготовить номер колонки ' да, расчет введенной строки Sub Расчет() ' подпрограмма расчета строки If Проверка Then ' если все цифры отгаданы, то For I = 3 To 9 Step 2 ' покрасить их в красный цвет Cells(Row, I).Font.Color = RGB(255, 0, 0) Cells(Row, 11).Font.Color = RGB(255, 0, 0) Cells(Row, 13).Font.Color = RGB(255, 0, 0) MsgBox "Вы выиграли!",, "Быки & Коровы" If (Row = 22) Then Решение ' проигрыш и вывод решения Row = Row + 2 ' подготовить номер следующей строки Function Проверка() ' подпрограмма-функция подсчета быков и коров Dim Быки As Integer, Коровы As Integer, БылБык As Boolean Быки = 0 ' счетчик быков Коровы = 0 ' счетчик коров For I = 1 To 4 БылБык = False If Cells(Row, 1 + I * 2).Value = Цифры(I) Then Быки = Быки + 1 ' подсчет быков БылБык = True ' установить флаг БылБык If Not БылБык Then ' если не был бык, то For j = 1 To 4 ' проверить I-ю цифру на корову If I <> j And Cells(Row, 1 + j * 2).Value = Цифры(I) Then

4 Коровы = Коровы + 1 Exit For Next j Cells(Row, 11).Value = Быки Cells(Row, 13).Value = Коровы If Быки = 4 Then Проверка = True Проверка = False End Function ' выход из внутреннего цикла, чтобы ' не считать одинаковых коров ' запись быков и коров в ячейки ' 4 быка - окончание игры ' игра не окончена Sub Решение() ' подпрограмма вывода решения Dim Число As String Число = "" For I = 1 To 4 ' преобразование числа в строку Число = Число + Str(Цифры(I)) MsgBox "Вы проиграли! Загаданное число: " & Число,, "Быки & Коровы" Sub ПросмотрПротокола() ' подпрограмма кнопки Просмотреть Dim fso ' переменная для ссылки на ActiveX элемент доступа к файлам Set fso = CreateObject("Scripting.FileSystemObject") ' создать объект доступа к файлу If fso.fileexists(application.defaultfilepath & "\BC.txt") Then ' если файл BC.txt существует, Call Shell("C:\WINDOWS\NotePad.exe BC.txt", 1) ' то вызвать Блокнот с протоколом Sub СохранитьПротокол() ' подпрограмма кнопки Сохранить Const ForAppending = 8 Dim fso, f Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.opentextfile(application.defaultfilepath & "\BC.txt", ForAppending, True, 0) Line = "Дата " & Str(Now()) ' вычисление и запись ' даты в файл протокола Line = "Ваши числа Б К" ' запись заголовка ' в файл протокола For I = 4 To 22 Step 2 Line = " " ' формирование строки чисел k = 0 For J = 3 To 13 Step 2 Line = Line + " " + Str((Cells(I, J).Value)) k = k + 1 If k = 4 Then Line = Line + " " ' сдвиг цифр Б и К вправо Next J ' запись строки в файл протокола Line = "Загаданное число:" For I = 1 To 4 ' формирование строки чисел Line = Line + " " + Str(Цифры(I)) ' запись строки в файл протокола f.writeline f.close

5 Если синтаксический контроль не дает ошибок, то можно приступать к назначению макросов кнопкам. Вернитесь в окно Excel. Поочередно, щелкая правой кнопкой мыши (пункт Назначить макрос ), каждой кнопке припишите макрос из списка рис. П.20. Рис. П20 Кнопкам 0-9 назначьте макросы Кнопка0 Кнопка9 соответственно, кнопкам Новая игра и Решение одноименные макросы, кнопке Сохранить макрос СохранитьПротокол(0), кнопке Просмотреть макрос ПросмотрПротокола(). После этих действий сохраните xls-программу в файл, закройте его и выполните первую загрузку программы. По событию "открытие книги Excel" будет запущена подпрограмма Auto_open(), которая в свою очередь вызывает подпрограмму НоваяИгра(). НоваяИгра() загадывает 4 разные цифры, обновляет игровое поле и устанавливает координаты первой позиции в глобальные (Public, доступные из всех подпрограмм) переменные Row и Col. Подпрограмма НоваяИгра() также вызывается по нажатию одноименной кнопки. Применяемая здесь процедура Cells() использует R1C1-стиль обращения к ячейкам, функция RGB устанавливает цвет ячеек. На нажатие цифровых кнопок реагируют подпрограммы Кнопка0() - Кнопка9(). Они передают соответствующую цифру в подпрограмму ОбработкаЦифры(), которая записывает цифру в нужную ячейку, по координатам (Row,Col). В подпрограмме ОбработкаЦифры() проверяется, ввел ли игрок все 4 цифры, если да, то вызывается подпрограмма Расчет(). Вся расчетная часть программы выполняется в функции Проверка(). Она выполняет 3 основных действия: вычисляет количество быков и коров, записывает их в ячейки игрового поля, возвращает значение True (Истина) при вычислении 4-х быков, иначе возвращает значение False (Ложь). Подпрограмма Расчет(), проверяющая функцию Проверка(), либо заканчивает игру с сообщением "Вы выиграли", либо переходит на ввод новой строки цифр, либо выводит сообщение "Вы проиграли! Загаданное число: хххх" в случае 10-ти неверных попыток. Подпрограмма ПросмотрПротокола() проверяет наличие файла BC.txt в папке Excel по умолчанию (в MS Office 2000 это C:\Windows\Personal) и запускает программу блокнота NotePad.exe. Подпрограмма СохранитьПротокол(0) открывает текстовый файл для добавления и записывает туда протокол игры в виде:

6 Описание всех незнакомых директив и операторов можно найти в справочной системе редактора VBA. Для этого достаточно выделить незнакомое слово мышью и щелкнуть по клавише F1 будет открыта справочная система Visual Basic на нужной странице. Если правильность работы программы вызывает у вас сомнения, то протестируйте ее на различных данных. Если на вашем компьютере установлен антивирус Kaspersky Anti-Virus Office Guard, то установите низкий уровень безопасности, либо отключите его: в противном кнопки Сохранить и Просмотреть будут выдавать ошибки. Программа может быть расширена по вашему усмотрению. В программе показана лишь маленькая часть возможностей программирования в Excel.

📎📎📎📎📎📎📎📎📎📎