В мир информатики # 91 (1-15 мая).
Microsoft Excel углубленно
Игра “Крестики-нолики” в среде Microsoft Excel
Кто сам пилит свои дрова,
тот согревается дважды 1.
Кто сам программирует свои
компьютерные игры, тот наслаждается дважды2.
Мы продолжаем (см. [1]) публикацию
материалов, посвященных моделированию
простейших игр средствами программы Microsoft Excel. В
этой статье мы рассмотрим известную игру
“Крестики-нолики”. Правила этой игры вы,
конечно, знаете.
На рис. 1 представлен вид рабочего
листа в начале новой игры (после щелчка на кнопке
с надписью “Новая игра”).

Рис. 1
Прежде всего надо оформить рабочее
поле игры — диапазон ячеек А6:С8:
— размеры строк и столбцов сделать
такими, чтобы каждая клетка поля имела форму
квадрата;
— установить соответствующие размеры
символов, которые будут записываться в каждую
ячейку диапазона (это будут буквы Х и О);
начертание символов предусмотреть полужирное;
— выравнивание текста в ячейках
сделать по центру.
Разместите на листе три кнопки. О том,
как это сделать и как разместить на кнопке
соответствующую надпись, рассказано в статье [1].
Там же описано, как создаются и “привязываются”
к кнопке макросы — программы, написанные на
языке программирования VBA, которые выполняются
по щелчку на той или иной кнопке.
Текст в ячейках А3 и А4 выводится по
щелчку на кнопке с надписью “Новая игра”, а
название игры в ячейку А1 следует ввести
“вручную”. По щелчку на этой кнопке очищаются
также 9 ячеек рабочего поля игры и ячейка E3.
Макрос, “привязанный” к кнопке с
надписью “Новая игра”, можно назвать
аналогичным именем:
Sub НоваяИгра()
Range("A3").Value = "Имя первого
игрока:"
Range("A4").Value = "Имя второго
игрока:"
'Очищаем 9 ячеек рабочего поля
Range("A6").Value = ""
Range("A7").Value = ""
…
Range("C7").Value = ""
Range("C8").Value = ""
'Готовимся принять имена играющих
'Устанавливаем указатель
'активной ячейки на ячейку E3
Range("E3").Activate
'и очищаем ее
Range("E3").Value = ""
End Sub
Напомним, что:
1) запись Range("E3").Value (и подобные)
означает значение, записанное в ячейке с адресом
Е3. Это значение может использоваться в любом
месте программы — в операторе присваивания (в
его левой или правой части), в условном операторе
и т.д.;
2) запись Range("E3").Activate
соответствует установке указателя активной
ячейки (его часто называют “курсором”) на ячейку
Е3.
Вернемся к игре. В ходе нее после ввода
имен играющих в ячейки E3 и E4 нужно щелкнуть на
кнопке с надписью “Начало” — картина изменится
на приведенную на рис. 2. В ней в ячейке будет
отражаться имя игрока, делающего очередной ход.

Рис. 2
Макрос, связанный с кнопкой с надписью
“Начало”, имеет вид:
Sub Начало()
'Очищаем ячейки А4 и Е4
Range("A4").Value = ""
Range("E4").Value = ""
'Запоминаем имена участников игры
Имя1игрока = Range("E3").Value
Имя2игрока = Range("E4").Value
'Выводим текст в ячейку А3
Range("A3").Value = "Очередной ход
делает"
'Определяем начинающего игру
'и выводим его имя в ячейке Е3
If Int(Rnd * 2) + 1 = 1 Then
'Начинает 1-й участник
Range("E3").Value = Имя1игрока
НомерИгрокаДелающегоХод = 1
Else
'Начинает 2-й участник
Range("E3").Value = Имя2игрока
НомерИгрокаДелающегоХод = 2
End If
'Устанавливаем указатель
'активной ячейки на ячейку D7
Range("D7").Activate
End Sub
— где Имя1игрока и Имя2игрока —
переменные величины, означающие имена
участников (эти имена в ходе игры будут
поочередно отражаться в ячейке Е3);
НомерИгрокаДелающегоХод — переменная
величина — номер участника игры, делающего
очередной ход.
Так как значения этих трех величин
будут использоваться в макросе, связанном с
кнопкой с надписью “Х/О”3, то они должны быть
описаны не в процедуре Начало, а как глобальные —
перед всеми макросами.
Option Explicit4
DIM Имя1игрока, Имя2игрока As String,
НомерИгрокаДелающегоХод As Integer
Теперь настало время рассказать, что
для простановки того или иного знака следует
установить (мышью или используя клавиатуру)
указатель активной ячейки на нужную клетку
рабочего поля, после чего щелкнуть на кнопке с
надписью “Х/О”. Поскольку знаки должны
чередоваться, макрос, связанный с этой кнопкой,
нужно оформить следующим образом:
Sub СтавимЗнак()
If НомерИгрокаДелающегоХод = 1 Then
'Ставим крестик
ActiveCell.Value = "X"
'Следующий ход будет делать другой
игрок
НомерИгрокаДелающегоХод = 2
'Выводим его имя в ячейке Е3
Range("E3").Value = Имя2игрока
Else
'Ставим нолик
ActiveCell.Value = "O"
'Следующий ход будет делать другой
игрок
НомерИгрокаДелающегоХод = 1
'Выводим его имя в ячейке Е3
Range("E3").Value = Имя1игрока
End If
End Sub
Но всегда ли можно ставить крестик или
нолик? Нет, конечно. Во-первых, знак нельзя
ставить в клетки (ячейки), не принадлежащие
рабочему полю игры. Это условие записывается в
виде:
ActiveCell.Address <> “$A$6” And ActiveCell.Address <>
“$A$7” And ActiveCell.Address <> “$A$8” And ActiveCell.Address <>
“$B$6” And ActiveCell.Address <> “$B$7” And ActiveCell.Address <>
“$B$8” And ActiveCell.Address <> “$C$6” And ActiveCell.Address <>
“$C$7” And ActiveCell.Address <> “$C$8”
Кроме того, нельзя ставить знак в
клетку, в которой уже что-то записано.
С учетом сказанного процедура
СтавимЗнак примет вид:
Sub СтавимЗнак()
If ActiveCell.Address<>"$A$6" And
ActiveCell.Address<>"$A$7" And … Then
MsgBox "Клетка вне рабочего поля!"
Else
If ActiveCell.Value <> "" Then
MsgBox "В этой клетке уже стоит знак!"
Else 'Можно ставить знак
If НомерИгрокаДелающегоХод = 1 Then
ActiveCell.Value = "X"
НомерИгрокаДелающегоХод = 2
Range("E3").Value = Имя2игрока
Else
ActiveCell.Value = "O"
НомерИгрокаДелающегоХод = 1
Range("E3").Value = Имя1игрока
End If
End If 'Можно ставить знак
End If
End Sub
Видно, что в приведенной процедуре нет
проверки на факт победы того или иного игрока
(такая проверка должна проводиться после каждой
простановки крестика или нолика). Связанные с
такой проверкой изменения процедуры СтавимЗнак
должны быть следующими:
…
Else 'Можно ставить знак
If НомерИгрокаДелающегоХод = 1 Then
ActiveCell.Value = "X"
'Проверяем, не выиграл ли 1-й игрок
If Range("A6").Value="X" And
Range("A7").Value="X" And
Range("A8").Value="X" Or
Range("B6").Value="X" And
Range("B7").Value="X" And
Range("B8").Value="X" Or … Then
MsgBox ("Выиграл" + Имя1игрока)
Else 'игра продолжается
НомерИгрокаДелающегоХод = 2
Range("E3").Value = Имя2игрока
End If 'Конец проверки
Else
ActiveCell.Value = "O"
'Проверяем, не выиграл ли 2-й игрок
If Range("A6").Value="О" And
Range("A7").Value="О" And
Range("A8").Value="О" Or
Range("B6").Value="О" And
Range("B7").Value="О" And
Range("B8").Value="О" Or … Then
MsgBox ("Выиграл" + Имя2игрока)
Else 'игра продолжается
НомерИгрокаДелающегоХод = 1
Range("E3").Value = Имя1игрока
End If 'Конец проверки
End If
End If 'Можно ставить знак
End If
End Sub
Внимание! При оформлении условия
победы того или иного игрока следует учитывать
одинаковое написание русских и латинских
символов “Х” и “О”.
И, наконец, следует проверить, не
окончилась ли игра вничью:
…
End If 'Можно ставить знак
End If
'Проверка на ничью
If … Then
MsgBox "Ничья!"
End If
End Sub
Условие, при котором игра закончилась
вничью, запишите самостоятельно. Обращаем
внимание на то, что если все 9 клеток рабочего
поля игры заполнены, то это не означает, что игра
закончилась вничью — один из играющих мог
выиграть в результате последнего, девятого, хода.
Литература
1. Игра “Быки и коровы” в среде Microsoft Excel. / “В
мир информатики” № 78 (“Информатика”
№ 19/2006).
1 Французская поговорка
2 Из книги: Арсак Ж. Программирование игр и
головоломок. М.: Наука, 1985 |