В мир информатики # 78 (1—15 октября). Games.exe

Игра “Быки и коровы”
в среде Microsoft Excel

Кто сам пилит свои дрова, тот согревается дважды1 .

Кто сам программирует свои компьютерные игры, тот наслаждается дважды2 .

В нашей газете были опубликованы материалы, посвященные программированию игры “Быки и коровы” [1–2]. В настоящей статье мы рассмотрим методику моделирования этой игры средствами программы Microsoft Excel.

Напомним правила игры. Компьютер генерирует четырехзначное число, в котором все цифры различны. Играющий пытается отгадать это число, делая несколько попыток. После каждой попытки компьютер проводит анализ ответа и сообщает о степени совпадения введенного числа с задуманным, которая характеризуется количеством “коров” и количеством “быков”. “Бык” — это цифра в ответе, совпадающая по разряду с такой же цифрой отгадываемого числа. “Корова” — цифра в числе играющего, имеющаяся в загаданном числе, но не совпадающая с ней по разряду. Например, если загадано число 5391, то число 9345 содержит одного “быка” (цифра 3) и две “коровы” (5
и 9). Для чисел 4710 и 7148 — соответственно имеем ноль “быков” и три “коровы”. Если играющий сдается — он должен ввести 0.

На рис. 1 представлен вид рабочего листа в начале новой игры (после щелчка на кнопке с надписью “Новая игра”).

37-0.gif (13954 bytes)

Рис. 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).