Смекни!
smekni.com

Программа "Крестики-нолики 5 в ряд на неограниченном игровом поле" (стр. 1 из 4)

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

Государственное образовательное учреждение высшего профессионального образования

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»

Курсовая работа

по дисциплине: программирование

«Крестики-нолики 5 в ряд на неограниченном игровом поле»

Выполнил студент А.С.Лебедев

Руководитель М.Н.Суслов

Санкт-Петербург 2010

СОДЕРЖАНИЕ

1. Цель работы

2. Описание игры

3. Описание входных и выходных данных

4. Описание переменных и функций программы

5. Алгоритм работы программы

6. Текст программы

7. Примеры выполнения программы

Выводы

Список литературы

программа игра данные алгоритм

1. Цель работы

Разработать программу игры в крестики-нолики пять в ряд на неограниченном поле. Программа должна быть написана на языке С++ в среде Visual Studio 2008 или Visual Studio 2010.

2. Описание игры

Игра ведется на бесконечном поле, разлинованном в клетку. Перед игрой противники решают, кто будет играть крестиками, а кто ноликами. В ходе игры противники ставят по очереди крестик или нолик (в зависимости от договоренности перед началом игры) в свободную клетку на поле.

Цель игры – построить линию из 5 стоящих рядом по вертикали, горизонтали или диагонали крестиков или ноликов. Первый игрок, построивший такую комбинацию из знаков своего типа (крестиков или ноликов) выигрывает.

Несмотря на то, что по определению игровое поле по определению бесконечно, обычно пользуются ограниченными размерами поля. Например, в игре гомоку, поле имеет размер 15x15 (ранее имело 19x19).

Пример игровой ситуации на игровом поле (показана только часть поля):

X 0 X
X 0
0 X 0
0 X 0
0 X X X

Пример выигрыша крестиков:

0
X 0 X 0
X 0
0 X X 0
0 X X 0
0 0 X X X

Пример выигрыша ноликов:

X 0 0 X 0 X X
X X 0 0 0 0 0 X
X X X 0 X
0 X 0 0 X
0 0 X X X
X 0 0 X 0 0
0 X X 0 0
0 X 0 X 0 0
0 X 0 X X X X

3. Описание входных и выходных данных

Входные данные:

1) Размер игрового поля (10x10, 19x19, 30x30, 50x50 или 100х100) – задается из главного меню программы.

2) Уровень игры компьютера (новичок, любитель или профессионал) – задается из главного меню программы.

3) Очередность первого хода (человек, компьютер).

4) Координаты щелчка левой кнопкой мыши по игровому полю (x,y) – координаты очередного хода.

Выходные данные:

1) Игровое поле, заполненное крестиками и ноликами, отображаемое на экран.

2) В случае выигрыша одного из игроков, отображение выигрышной последовательности и соответствующего сообщения.

4. Описание переменных и функций программы

Функции расчета оценочной функции, состояния игрового поля, обработки нажатия клавиши мыши, вывода игрового поля на экран объявлены в классе представления клиентской области главного окна CChildView.

Объявление класса находится в модуле СhieldView.h. Определения функций и объявления глобальных переменных программы, отвечающих за алгоритм расчета расположены в модуле СhieldView.cpp.

Описание переменных:

unsigned char** fields – Динамический двумерный массив, представляющий игровое поле. Каждый элемент массива представляет клетку на поле. Индексы массива соответствуют положению клеток на поле.

Элемент массива может принимать следующие значения:

0 – клетка пуста;

1 – в клетке нолик;

2 – в клетке крестик;

3 – в клетке нолик, входящий в выигрышный ряд по окончанию игры, служит для выделения другим цветом на поле выигрышного ряда;

4 – в клетке крестик, входящий в выигрышный ряд по окончанию игры, служит для выделения другим цветом на поле выигрышного ряда;

5 – в клетке нолик, поставленный последним ходом, служит для выделения другим цветом на поле последнего хода;

6 – в клетке крестик, поставленный последним ходом, служит для выделения другим цветом на поле последнего хода;

float** calc_fields – Динамический двумерный массив, представляющий значение оценочной функции для каждой клетки игрового поля.

int size_x – Размер игрового поля по х, по умолчанию равен 19.

int size_y – Размер игрового поля по y, по умолчанию равен 19.

int old_size_x – Предыдущий размер игрового поля по x, используется при изменении размеров игрового поля.

int old_size_y – Предыдущий размер игрового поля по y, используется при изменении размеров игрового поля.

int attack_factor – Коэффициент агрессивности игры компьютера, используется при расчете оценочной функции. При меньшем значении данного параметра компьютер играет более атакующе. По умолчанию равен 1 для игрока уровня эксперт.

int valuation_factor – Коэффициент, используемый при расчете оценочной функции. По умолчанию равен 3.

bool end_game – Установка данной переменной в значение true обозначает конец игры. Дальнейшие щелчки мышью по игровому полю не воспринимаются до старта новой игры. Начальное значение – false.

int last_x – Координата x последнего хода.

int last_y – Координата y последнего хода.

bool player_first_step – Определяет приоритетность хода при старте новой игры. При значении true первым ходит человек, при false – компьютер. Значение по умолчанию – true.

int comp_level – Уровень игры компьютера. Возможные значения:

0 – профессионал, сильный уровень, играет агрессивно;

1 – любитель, придерживается защитной стратегии;

2 – новичок, играет слабо, но достаточно агрессивно.

Описание функций программы:

void CChildView::OnPaint() – выполняет перерисовку клиентской области окна.

Входные параметры:

Нет.

Возвращаемое значение:

Нет.

Алгоритм работы:

Производит перерисовку клеток игрового поля. В зависимости от значений массива fields выводит в клетку:

0 – ничего не выводит;

1 – нолик синим цветом;

2 – крестик зеленым цветом;

3 – нолик красным цветом (входит в выигрышный ряд);

4 – крестик красным цветом (входит в выигрышный ряд);

5 – нолик желтым цветом (последний сделанный ход);

6 – крестик желтым цветом (последний сделанный ход);

void CChildView::OnLButtonDown(UINT, CPoint xy) – Обработка нажатия левой кнопки мыши на клиентской области окна.

Входные параметры:

UINT – флаги, не используется;

CPoint xy – координаты точки нажатия.

Возвращаемое значение:

Нет.

Алгоритм работы:

По нажатию левой кнопки мыши, если игра не закончена выполняются следующие действия:

1) Обновляется массив fields c учетом последнего поставленного нолика.

2) Осуществляется проверка, не закончена ли игра с помощью функции end_analyze.

3) Вычисляется ход компьютера с помощью функции ii.

4) Осуществляется проверка, не закончена ли игра с помощью функции end_analyze.

5) Производится перерисовка окна.

Алгоритм работы функции приведен на рисунке 1 в разделе 5.

int CChildView::end_analyze() – Функция определяет не закончена ли игра, т. е. не составлен ли выигрышный ряд на поле одним из игроков, на основании значений элементов массива fields.

Входные параметры:

Нет.

Возвращаемое значение:

int – реузультат работы, = 1 – игра окончена, = 0 – игра не окончена.

Алгоритм работы:

Для каждой клетки на игровом поле просматриваются соседние клетки по горизонтали, вертикали, вниз и вправо по диагонали. Если в одном из направлений символы во всех клетках на расстоянии до 4 совпадают с символом в текущей клетке, то игра считается выигранной. К значениям найденных клеток в массиве fields прибавляется 2 для отображения выигрышной ситуации в окно.

void CChildView::ii() – Функция расчета очередного хода компьютера.

Входные параметры:

Нет.

Возвращаемое значение:

Нет.

Алгоритм работы:

Функция рассчитывает оценочную функцию для каждой клетки игрового поля, с помощью вызова функции calculate, и заносит рассчитанные значения в массив calc_field. Исходя из значений массива calc_field выбирает очередной ход компьютера.

Алгоритм работы функции приведен в разделе 6.

unsigned long CChildView::calculate(int id,int x,int y) – Расчет оценочной функции для клетки игрового поля, с учетом установки в нее крестика или нолика.

Входные параметры:

int id – определяет какой символ ставится в клетку (= 1 – нолик, = 2 – крестик);

int x – координата x клетки.

int y – координата y клетки.

Возвращаемое значение:

unsigned long – значение оценочной функции.

Алгоритм работы:

Алгоритм работы функции приведен в разделе 6.

void CChildView::OnNewGame() – В главном меню нажата кнопка «Новая игра».

Входные параметры:

Нет.

Возвращаемое значение:

Нет.

Алгоритм работы:

Вызывается функция new_game для начала новой игры. Перерисовывается игровое поле.

void CChildView::OnX1010() – В главном меню выбран размер поля 10x10.

Входные параметры:

Нет.

Возвращаемое значение:

Нет.

Алгоритм работы:

Изменяются значения size_x, size_y. Вызывается функция new_game для начала новой игры. С помощью функции resize_window устанавливаются новые размеры окна.

void CChildView::OnX1919() – В главном меню выбран размер поля 19x19.

Входные параметры:

Нет.

Возвращаемое значение:

Нет.

Алгоритм работы:

Изменяются значения size_x, size_y. Вызывается функция new_game для начала новой игры. С помощью функции resize_window устанавливаются новые размеры окна.

void CChildView::OnX3030() – В главном меню выбран размер поля 30x30.

Входные параметры:

Нет.

Возвращаемое значение:

Нет.

Алгоритм работы:

Изменяются значения size_x, size_y. Вызывается функция new_game для начала новой игры. С помощью функции resize_window устанавливаются новые размеры окна.