2 Описание переменных
int mas[n][n] – Двумерный массив, представляющий игровое поле. Каждый элемент массива представляет клетку на поле. Индексы массива соответствуют положению клеток на поле.
Элемент массива может принимать следующие значения:
0 – клетка пуста;
1 – в клетке крестик;
2 – в клетке нолик;
Int count переменная хранящая значение количества заполенных клеток игрового поля, определяет окончание игры по наступлению ничьи.
Static int n =20 – определяет размер игрового поля.
bool myTurn – Установка данной переменной в значение true обозначает что ходит игрок 1, иначе будет ходить игрок номер 2. int last_x – Координата x последнего хода.
bool newGame – установка данной переменной в значение true обозначает что игра началась.
int x1 – Координата x последнего хода.
int y1 – Координата y последнего хода.
int x – размер игрового поля в пикселях по горизонтали
int y – размер игрового поля в пикселях по вертикали
int win – показывает каким способом была завершена игра:
-1 - игра не завершена;
0 – победил 2 игрок;
1 – победил 1 игрок:
Int stats[3] – хранит статистику об играх в данной сессии.
1 слот – количество побед игроком 1
2 слот – количество побед игроком 2
3 слов – количество ничьих
Int p[n] – хранит ссылки на значения массива mas[n][n]
Char output[100] – строка для показа статистики.
COLORREF crossColor = RGB(0,255,0);-цвет крестиков
COLORREF nullColor = RGB(0,0,255); - цвет ноликов
static HPEN hF – ручка для рисования крестиков
static HPEN hS – ручка для рисования ноликов
static HPEТ hLine- ручка для разметки поля
static HPEN hOldLine – ручка для хранения старого значения цвета разметки
static HPEN hOldF - ручка для хранения старого цвета крестиков
static HPEN hOldS - ручка для хранения старого цвета ноликов
static RECT rt – структура хранящая координаты для разметки страницы
static RECT rect – структура хранящая координаты для перерисовки выбранного по клику сектора.
COLORREF crFirst – цвет крестиков, выбираемый в настройках
COLORREF crSecond –цвет ноликов, выбираемый настройках
static CHOOSECOLOR cc - структура "выбора" цвета
static COLORREF CustClr[16] - массив структур для быстрого доступа к ранее выбранным цветам
3 Описание функций программы
Int fwinner(int**mas, int x1, int y1, int n) – выполняет вычисление условий для победы в игре.
Входные параметры:
Int**mas – ссылка на массив со значениями в нем.
Int x1 – координата х последнего хода
Int y1 – координата у последнего хода
Int n – количество клеток по горизонтали/вертикали
Возвращаемое значение:
0 – победил 2 игрок
Победил 1 игрок
Игра продолжается
4 Описание работы программы
Алгоритм выполнения очередного хода:
Игрок выполняет очередной ход при нажатии левой кнопки мыши на игровом поле. При этом вызывается функция обработчика WM_LBUTTONDOWN, которая содержит основной алгоритм выполнения очередного хода игроком и компьютером. Алгоритм работы функции приведен на рисунке 1.
Рисунок 1 – Блок-схема работы WM_LButtonDown.
Алгоритм расчета оценочной функции:
Расчет оценочной функции для клетки игрового поля производится вызовом функции fwinner. Входными параметрами являются ссылка на массив, индексы поля в массиве mas (текущая клетка) и идентификатор в виде числа, какой символ(крестик или нолик) будет поставлен в текущую клетку. Этот символ ставится в массив mas и определяет что поставленно в клетку.
Расчет производится по следующей схеме. Просматриваются все ряды, продолжением которых может являться текущая клетка. Под рядом подразумевается последовательность из 5 клеток, каждая из которых может быть пустой или содержащей такой же символ, как и в текущей. Для этого проходятся все клетки на расстоянии не более 4 от данной, сначала по вертикали, затем по горизонтали, затем по 2 диагоналям. Для каждой проходимой клетки рассчитывается длина ряда, в которую она входит вместе с текущей. Под длиной ряда понимается количество одинаковых символов(крестиков или ноликов) в последовательности из 5 клеток. Если ряд прерывается противоположным символом, то длина ряда принимается равной нулю.
В случае нахождения ряда длиной 5, т. е. выигрышной ситуации, значение длины на экран выводится окно с результатом игры, выиграл игрок 1 или игрок 2. Далее число по одному из индексов в массиве stats увеличивается на 1, в зависимости какой из игроков выиграли или произошла ничья. Это нужно для ведения статистики игры.
Текст программы смотрите в приложении А
