В мир информатики # 78 (1—15 октября).
Games.exe
Игра “Быки и коровы”
в среде Microsoft Excel
Кто сам пилит свои дрова, тот
согревается дважды1 .
Кто сам программирует свои
компьютерные игры, тот наслаждается дважды2 .
В нашей газете были опубликованы
материалы, посвященные программированию игры
“Быки и коровы” [1–2]. В настоящей статье мы
рассмотрим методику моделирования этой игры
средствами программы Microsoft Excel.
Напомним правила игры. Компьютер
генерирует четырехзначное число, в котором все
цифры различны. Играющий пытается отгадать это
число, делая несколько попыток. После каждой
попытки компьютер проводит анализ ответа и
сообщает о степени совпадения введенного числа с
задуманным, которая характеризуется количеством
“коров” и количеством “быков”. “Бык” — это
цифра в ответе, совпадающая по разряду с такой же
цифрой отгадываемого числа. “Корова” — цифра в
числе играющего, имеющаяся в загаданном числе, но
не совпадающая с ней по разряду. Например, если
загадано число 5391, то число 9345 содержит одного
“быка” (цифра 3) и две “коровы” (5
и 9). Для чисел 4710 и 7148 — соответственно имеем ноль
“быков” и три “коровы”. Если играющий сдается
— он должен ввести 0.
На рис. 1 представлен вид рабочего
листа в начале новой игры (после щелчка на кнопке
с надписью “Новая игра”).
Рис. 1
Видно, что на листе имеются две
кнопки3 , по щелчку на каждой из которых должны
выполняться какие-то действия. Как известно [3],
действия, выполняемые по щелчку на кнопках,
оформляются в виде программ, написанных на языке
программирования Visual Basic for Application
(VBA). Если вы не знакомы с этим языком, не пугайтесь
— для создания нашей игры потребуются
простейшие операторы языка VBA, в том числе
известные вам по другим языкам программирования
(например, оператор присваивания, условный
оператор и оператор цикла). Упомянутые чуть выше
программы называют “макросами”. Чтобы создать
макрос, необходимо:
1) выбрать пункты меню Сервис | Макрос
| Макросы (тот же результат можно получить,
нажав одновременно клавиши ALT и );
2) в появившемся диалоговом окне Макрос
в поле Имя макроса: ввести имя макроса и щелкнуть
на кнопке Создать — появится окно кода с
заголовком макроса и его завершающей
конструкцией:
Sub ИмяМакроса()
End Sub
Окно кода появляется также при
создании новой кнопки (см. ниже).
По щелчку на кнопке с надписью “Новая
игра” производятся следующие действия:
1) очищаются ячейки С5 (число, которое
вводит играющий) и С7 (количество сделанных
играющим попыток отгадать задуманное число);
2) генерируется случайное
четырехзначное число, в котором все цифры
различны (имя переменной величины —
ЗадуманноеЧисло);
3) переменной НомерПопытки
присваивается нулевое значение;
4) указатель активной ячейки (его часто
называют “курсором”) устанавливается на ячейку
С5.
Соответствующий макрос имеет вид:
Sub НоваяИгра()
'Очищаем ячейки С5 и С7
Range("C5").Value = ""
Range("C7").Value = ""
'"Перенастраиваем"
датчик случайных чисел
Randomize
Do
'Генерируем случайное
4-значное число
ЗадуманноеЧисло = 1000 + RND * 8999
'Выделяем его цифры и
записываем их в массив
ЦифрыЗадуманногоЧисла(1) =
ЗадуманноеЧисло \ 1000
'Обращаем внимание на
использование скобок
ЦифрыЗадуманногоЧисла(2) =
(ЗадуманноеЧисло Mod 1000) \ 100
ЦифрыЗадуманногоЧисла(3) =
(ЗадуманноеЧисло Mod 100) \ 10
ЦифрыЗадуманногоЧисла(4) =
ЗадуманноеЧисло Mod 10
Loop Until
ЦифрыЗадуманногоЧисла(1) <>
ЦифрыЗадуманногоЧисла(2) And
ЦифрыЗадуманногоЧисла(1) <>
ЦифрыЗадуманногоЧисла(3) And
ЦифрыЗадуманногоЧисла(1) <>
ЦифрыЗадуманногоЧисла(4) And
ЦифрыЗадуманногоЧисла(2) <>
ЦифрыЗадуманногоЧисла(3) And
ЦифрыЗадуманногоЧисла(2) <>
ЦифрыЗадуманногоЧисла(4) And
ЦифрыЗадуманногоЧисла(3) <>
ЦифрыЗадуманногоЧисла(4)
НомерПопытки = 0
Range("C5").Activate
End Sub
Прокомментируем приведенный макрос.
1. Запись Range("С5").Value
(и подобные) означает значение, записанное в
ячейке с адресом С5. Это значение
может использоваться в любом месте программы — в
операторе присваивания (в его левой или правой
частях), в условном операторе и т.д.
2. Запись Range("С5").Activate
соответствует установке указателя активной
ячейки на ячейку С5.
3. Для получения случайного
четырехзначного числа используется функция RND.
Так как цифры этого числа должны быть различными,
то число генерируется до соблюдения этого
условия (применяется оператор цикла с
постусловием).
4. Для хранения значений цифр
используется массив с именем
ЦифрыЗадуманногоЧисла из четырех элементов.
Поскольку эти значения понадобятся для
определения числа “быков” и “коров” после
ввода играющим ответа (в другом макросе), массив
должен быть описан не в макросе НоваяИгра, а как
глобальный — перед всеми макросами. Также
глобальными должны быть переменные
ЗадуманноеЧисло и НомерПопытки:
Option Explicit
Dim ЦифрыЗадуманногоЧисла(1
To 4),
НомерПопытки,
ЗадуманноеЧисло As Integer
Внимание! Запись Option Explicit
предусматривает, что все использованные в
макросах переменные величины должны быть
объявлены (описаны) перед их использованием. Это
связано с очень важным вопросом, на котором
остановимся подробнее. Дело в том, что в
программах на языке Бейсик (во всех его
вариантах) объявление переменных величин не
является обязательным. Такое положение может
привести к ошибкам в программе. Например, в
следующей программе нахождения корней
квадратного уравнения:
…
diskr = b * b – 4 * a * c
if diskr < 0 then
PRINT "Уравнение корней не
имеет"
ELSE
x1 = (- b + SQR(disk)) / (2 * a)
x2 = (- b - SQR(disk)) / (2 * a)
…
— значения величин x1 и x2 будут
определены неправильно (почему — подумайте
самостоятельно). Конечно, в приведенном примере
ошибку найти не сложно, а в других случаях это
может потребовать значительно больше времени (и
нервов). Поэтому мы рекомендуем всегда
использовать директиву Option Explicit.
Вернемся к оформлению листа. Текст в
ячейках А1, А3, А5, D5 и А7
вводится “вручную” (а не с помощью макроса).
Ячейку С5 желательно оформить с
рамкой вокруг нее.
Теперь о том, как разместить на листе
кнопки (см. рис. 1). Это можно сделать следующим
образом:
1) вывести на экран панель инструментов
Формы (Вид | Панели инструментов | Формы);
2) на появившейся панели выбрать
элемент управления Кнопка;
3) “нарисовать” мышью кнопку нужного
размера в нужном месте;
4) в появившемся окне Назначить макрос
объекту: ввести имя макроса, который будет
выполняться по щелчку на кнопке (если такого
макроса еще нет), и щелкнуть на кнопке Создать
в окне либо выбрать ранее созданный макрос из
приведенного перечня и щелкнуть на кнопке OK.
Вторую кнопку можно получить путем
копирования первой созданной на листе (изменив
затем макрос, “привязанный” к первой кнопке).
Чтобы разместить на кнопке
соответствующую надпись, щелкните на ней правой
кнопкой мыши, в появившемся контекстном меню
выберите пункт Изменить надпись и введите
нужный текст. Стиль символов на кнопках
устанавливается так же, как для “обычного”
текста.
Действия играющего заключаются в
следующем. Он вводит число в ячейку С5,
после щелкает мышью на кнопке с надписью “Да”.
Если ответ правильный, то выводится
соответствующее сообщение и число сделанных до
отгадывания попыток (см. рис. 2), если нет —
определяется и выводится количество “быков” и
“коров” (см. рис. 3). Макрос, “привязанный” к
только что упомянутой кнопке, оформляется так:
Sub ОчереднаяПопытка()
'Описываем локальные
переменные величины
Dim Ответ, ЦифрыОтвета(1 To
4), ЧислоБыков, ЧислоКоров, i, j As Integer
'Увеличиваем значение
величины НомерПопытки
НомерПопытки = НомерПопытки
+ 1
'и выводим его в ячейке С7
Range("C7").Value =
НомерПопытки
'Считываем число-ответ
Ответ = Range("C5").Value
'и сравниваем его с
задуманным числом
If Ответ =
ЗадуманноеЧисло Then
MsgBox("Правильно! Число
попыток = " + STR$(НомерПопытки))
Else
If Ответ = 0 Then
MsgBox("Вы сдались!")
Else 'Игра продолжается
'Определяем цифры в ответе
'и записываем их в массив
ЦифрыОтвета
ЦифрыОтвета(1) = otvet \ 1000
ЦифрыОтвета(2) = (otvet Mod 1000) \ 100
ЦифрыОтвета(3) = (otvet Mod 100) \ 10
ЦифрыОтвета(4) = otvet Mod 10
'Подсчитываем количество
"быков"
For i = 1 To 4
If ЦифрыОтвета(i)=
ЦифрыЗадуманного Числа(i)Тhen
ЧислоБыков= ЧислоБыков + 1
End If
Next i
'и количество "коров"
For i = 1 To 4
For j = 1 To 4
If ЦифрыОтвета(i)=
ЦифрыЗадуманного Числа(j)And i <> j Then
ЧислоКоров = ЧислоКоров + 1
End If
Next j
Next i
'Выводим результат
MsgBox("Число быков = " +
STR$(ЧислоБыков) + " Число коров = "
+ STR$(ЧислоКоров))
'Готовимся принять новое
число
Range("C5").Activate
End If
End If
End Sub
Примечания
1. Функция STR$ используется для
преобразования числового значения в строковую
величину.
2. Оператор MsgBox обеспечивает вывод
информации на экран.
Рис. 2
Рис. 3
В заключение заметим, что в дальнейшем
мы рассмотрим методику моделирования средствами
программы Microsoft Excel (в том числе с использованием
языка программирования VBA) и более сложных игр.
Литература
1. Компьютерная игра “Быки и коровы”. /
“В мир информатики” № 60 (“Информатика” № 19/2005).
2. Ответы, решения, разъяснения. / “В мир
информатики” № 70 (“Информатика” №
5/2006).
3. Макросы. / “В мир информатики” № 48
(“Информатика” № 1/2005).
4. Моделирование простейших игр в Microsoft
Excel. / “В мир информатики” № 61 (“Информатика” №
20/2005). |