на тему рефераты
 
Главная | Карта сайта
на тему рефераты
РАЗДЕЛЫ

на тему рефераты
ПАРТНЕРЫ

на тему рефераты
АЛФАВИТ
... А Б В Г Д Е Ж З И К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я

на тему рефераты
ПОИСК
Введите фамилию автора:


Курсовая работа: Программа "Крестики-нолики 5 в ряд на неограниченном игровом поле"


Курсовая работа: Программа "Крестики-нолики 5 в ряд на неограниченном игровом поле"

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

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

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

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

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

«Крестики-нолики 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 устанавливаются новые размеры окна.

void CChildView::OnX5050() – В главном меню выбран размер поля 50x50.

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

Нет.

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

Нет.

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

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

void CChildView::OnX100100() – В главном меню выбран размер поля 100x100.

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

Нет.

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

Нет.

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

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

void CChildView::new_game() – Функция начала новой игры.

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

Нет.

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

Нет.

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

Функция начинает новую игру, при этом:

1)      Перевыделяется память для динамических массивов fields и calc_fields в зависимости от значений old_size_x, old_size_y и size_x, size_y.

2)      Сбрасывается в false флаг end_game.

3)      Если переменная player_first_step равна false, то рассчитывается первый ход компьютера с помощью вызова функции ii.

void CChildView::resize_window() – Функция установки размеров окна.

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

Нет.

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

Нет.

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

Устанавливает новые размеры окна, в зависимости от переменных size_x, size_y.

void CChildView::set_chеcked_menu(unsigned int old_id,unsigned int new_id) – Служит для снятия галочки и установки новой в главном меню при выборе размеров поля, уровня игры компьютера и очереднсоти хода.

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

unsigned int old_id – id элемента меню, с которого необходимо снять галочку;

unsigned int new_id – id элемента меню, на который необходимо поставить галочку;

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

Нет.

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

Снимает галочку в главном меню с элемента, определяемого переменной old_id и ставит галочку на элемент, определяемый переменной new_id.

void CChildView::OnStepH() – В главном меню выбрана очередность хода – человек.

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

Нет.

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

Нет.

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

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

void CChildView::OnStepС() – В главном меню выбрана очередность хода – компьютер.

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

Нет.

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

Нет.

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

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

void CChildView::OnLevelBeg() – В главном меню выбран уровень сложности начинающий.

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

Нет.

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

Нет.

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

Изменяется значение переменной comp_level. Значение коэффициента агрессивности игры компьютера attack_factor устанавливается в 1. Вызывается функция new_game для начала новой игры. Выполняется перерисовка окна.

void CChildView::OnLevelAmat() – В главном меню выбран уровень сложности любитель.

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

Нет.

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

Нет.

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

Изменяется значение переменной comp_level. Значение коэффициента агрессивности игры компьютера attack_factor устанавливается в 1. Вызывается функция new_game для начала новой игры. Выполняется перерисовка окна.

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

Алгоритм выполнения очередного хода:

Игрок выполняет очередной ход при нажатии левой кнопки мыши на игровом поле. При этом вызывается функция обработчика OnLButtonDown, которая содержит основной алгоритм выполнения очередного хода игроком и компьютером. Алгоритм работы функции приведен на рисунке 1.

Рисунок 1 – Блок-схема работы функции OnLButtonDown.


Алгоритм расчета очередного хода компьютерного соперника:

Расчет очередного хода компьютерного соперника выполняется при помощи вызова функции ii. Расчет производится при старте игры, если приоритет хода принадлежит компьютеру или после хода игрока вызовом из функции OnLButtonDown.

Расчет производится по следующему алгоритму:

1)         Рассчитывается суммарная оценочная функция  для всех непустых клеток игрового поля. Под оценочной функцией понимается некое значение, присваиваемое клетке и обозначающее выгодность хода в данную клетку.

Расчет производится при помощи функции calculate, которая позволяет рассчитать оценочную функцию для отдельной клетки в случае хода в эту клетку игроком или компьютером.

Суммарная оценочная функция вычисляется по формуле:

, где

 – значение суммарной оценочной функции;

– значение оценочной функции при постановке в клетку крестика, рассчитанное с помощью вызова функции calculate;

 – значение оценочной функции при постановке в клетку нолика, рассчитанное с помощью вызова функции calculate;

 – коэффициент агрессивности ИИ, задается переменной attack_factor.

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

Значение коэффициента агрессивности на уровнях новичок и профессионал равно 1, компьютер ведет себя агрессивно. На уровне любитель значение равно 10, алгоритм находится в глубокой обороне.

Для уровней новичок и любитель также дополнительно вносится случайность значения суммарной оценочной функции: на уровне новичок значение суммарной оценочной функции умножается на случайное число, принимающее значение [0,1], на уровне любитель умножается на случайное число, принимающее значение [0.5,1].

2)         Находится клетка с максимальным значением суммарной оценочной функции. Если таких клеток несколько, то из них выбирается случайная. Ход делается в найденную клетку, массив fields обновляется путем установки соответствующего элемента в значение 2.

Алгоритм расчета оценочной функции:

Расчет оценочной функции для клетки игрвого поля производится вызовом функции calculate. Входными параметрами являются индексы поля в массиве fields (текущая клетка) и идентификатор, какой символ(крестик или нолик) будет поставлен в текущую клетку. Этот символ временно ставится в массив fields до окончания работы функции.

Расчет производится по следующей схеме. Просматриваются все ряды, продолжением которых может являться текущая клетка. Под рядом подразумевается последовательность из 5 клеток, каждая из которых может быть пустой или содержащей такой же символ, как и в текущей. Для этого проходятся все клетки на расстоянии не более 4 от данной, сначала по вертикали, затем по горизонтали, затем по 2 диагоналям. Для каждой проходимой клетки рассчитывается длина ряда, в которую она входит вместе с текущей. Под длиной ряда понимается количество одинаковых символов(крестиков или ноликов) в последовательности из 5 клеток. Если ряд прерывается противоположным символом, то длина ряда принимается равной нулю.


Значение оценочной функции рассчитывается по формуле:

, где  – общее количество ненулевых длин рядов;

– коэффициент оценочной функции;

 – длина -го ряда.

Степенная функция выбрана потому, что увеличение длины ряда даже на 1 существенно повышает его важность и не может быть выражена линейной функцией.

В случае нахождения ряда длиной 5, т. е. выигрышной ситуации, значение длины приравнивается к 10000, если расчет ведется при постановке крестика в текущую клетку и 1000 при постановке нолика в текущую клетку. Значение при постановке крестика выше, т. к. при нахождении такой ситуации компьютерный игрок должен в первую очередь стремиться к своему выигрышу, а не к предотвращению выигрыша соперника.

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

Файл ChildView.cpp:

//Модуль, содержащий основной алгоритм работы программы

#include "stdafx.h"

Страницы: 1, 2


на тему рефераты
НОВОСТИ на тему рефераты
на тему рефераты
ВХОД на тему рефераты
Логин:
Пароль:
регистрация
забыли пароль?

на тему рефераты    
на тему рефераты
ТЕГИ на тему рефераты

Рефераты бесплатно, реферат бесплатно, курсовые работы, реферат, доклады, рефераты, рефераты скачать, рефераты на тему, сочинения, курсовые, дипломы, научные работы и многое другое.


Copyright © 2012 г.
При использовании материалов - ссылка на сайт обязательна.