
- •Оглавление
- •1.Задание на курсовой проект
- •2.Правила игры «Балда»
- •3.Описание структур данных
- •4.Основной алгоритм игры
- •5.Описание функций
- •5.1 Функции начала игры
- •5.2 Функции для работы с консольной графикой
- •5.3 Функции для работы со словарем
- •5.4 Функции ввода слов и букв
- •5.5 Функции искусственного интеллекта
- •5.6 Функции окончания игры
- •5.7 Вспомогательные функции
- •6. Интерфейс
- •7. Выводы
- •Приложение. Текст программы
Оглавление
Оглавление 1
1.Задание на курсовой проект 2
2.Правила игры «Балда» 2
3.Описание структур данных 3
4.Основной алгоритм игры 8
5.Описание функций 11
5.1 Функции начала игры 11
5.2 Функции для работы с консольной графикой 12
5.3 Функции для работы со словарем 13
5.4 Функции ввода слов и букв 15
5.5 Функции искусственного интеллекта 18
5.6 Функции окончания игры 22
5.7 Вспомогательные функции 22
6. Интерфейс 24
7. Выводы 25
Приложение. Текст программы 26
1.Задание на курсовой проект
Необходимо написать компьютерную игру.
В общем случае, игра должна быть пошаговой. Это означает, что компьютер не производит никаких действий со стороны противника, пока происходит ожидание хода игрока. Если студент реализует интерактивную игру, это оценивается дополнительно.
Возможность использования компьютерной графики не обязательно, вполне подойдёт текстовый режим. Можно использовать дополнительные библиотеки для работы в графическом режиме, например, Blitz3D, OpenGL и другие.
На оценку «отлично» необходимо запрограммировать логику компьютера в качестве противника.
Должна быть реализована функция оценки текущей позиции (ситуации) и применяться алгоритм альфа-бета отсечения для поиска наилучших ходов.
Программа должна вести счёт и записывать его в таблицу результатов.
2.Правила игры «Балда»
1)Игровое поле представляет собой квадрат 5*5 клеток. В начале игры в центральный горизонтальный ряд ставится слово из 5 букв.
2)Во время своего хода игрок должен поставить на игровое поле букву так, чтобы она располагалась в клетке, смежной уже заполненным по горизонтали или вертикали.
3)Слово должно составляться переходом по смежным клеткам, расположенным под прямым углом относительно друг друга.
4)Слово должно существовать в словаре. Если оно там отсутствует, игрок вправе добавить слово в словарь.
5)В слове должна использоваться поставленная на поле буква.
6)Количество букв в слове эквивалентно количеству начисляемых баллов.
7)Слова в одной игре повторяться не могут.
8)Игра идет до тех пор, пока на поле есть хоть одна свободная клетка.
3.Описание структур данных
В игре «Балда» были использованы следующие структуры:
struct GAME
{
char board[5][5];
INPUT_WORDS words[21];
PLAYER players[2];
int player_num;
intmove_num;
};
Данная структура хранит в себе основные настройки игры.
Первая переменная board– матрица символов, является игровым полем, на которое игроки добавляют буквы.
Вторая строка – зависимая структура, массив введенных слов. Так как на поле можно добавить не более 20 слов, а центральное слово также добавляется в этот массив, его размерность – 21.
Третья строка –структура, хранящая в себе информацию об игроках. В игре одновременно принимать участие могут 2 человека.
Четвертая переменная хранить номер текущего игрока.
Пятая строка говорит о номере хода игры.
struct PLAYER
{
unsigned int score;
boolis_human;
};
Информация об игроках, включающая в себя счет игрока и его состояние – человек или компьютер.
struct INPUT_WORDS
{
char input_word[25];
intplayer;
};
Данная структура перечисляет слова, которые были использованы во время игры. Также она хранит в себе номер игрока, которым было введено слово.
struct ARRAY
{
CELL location[25];
int size;
};
ARRAY– массив координат нового вводимого слова.Size– количество букв в слове
struct CELL
{
int x;
int y;
charinput_letter;
};
CELLхранит в себе координаты поляboard, и то, что хранится в ячейке с данными координатами.
Рассмотрим пример :
|
|
|
|
|
|
|
|
|
|
б |
а |
л |
д |
а |
|
|
|
|
|
|
|
|
|
|
В начале игры структура Gameбудет хранить в себе такие параметры
{ …
…
player_num=0;
move_num=1; }
рис.1 Board
С каждым новым добавляемым словом, move_numбудет единично возрастать, тогда какplayer_numменять свое значение с 0 на 1 и наоборот. Возьмем пример, когда играют 2 человека.
Допустим первый игрок (прим. – индекс первого игрока – 0) решает поставить на клетку с координатами (4,3) букву л.
|
|
|
|
|
|
|
|
|
|
б |
а |
л |
д |
а |
|
|
л |
|
|
|
|
|
|
|
Player_num=0
Move_num=1
Рис. 2.1 Board
Тогда ARRAYполучит параметры:
Size=4;
Location[4]:
Location[0].x=0
Location[0].y=2
Input_letter[0]=’б’
Location[1].x=1
Location[1].y=2
Input_letter[1]=’а’
Location[2].x=2
Location[2].y=2
Input_letter[2]=’л’
Location[3].x=2
Location[3].y=3
Input_letter[3]=’л’
INPUT_WORDS примет:
words[0]=”балда”
Player[0]=-1
words[0]=”балл”
Player[0]=0
PLAYER[0]:
Score=4
Is_human=true
PLAYER[1]:
Score=0
Is_human=true
Целочисленные константы :
const int TITLE_X_BEG_POS=1
const int TITLE_Y_BEG_POS=0
const int BOARD_X_BEG_POS=1
const int BOARD_Y_BEG_POS=2
const int WORDS_X_BEG_POS=1
const int WORDS_Y_BEG_POS=10
const int INF_X_BEG_POS=7
const int INF_Y_BEG_POS=2
const int WARN_MASS_X_BPOS=1
const int WARN_MASS_Y_BPOS=8
служат для формирования структуры вывода в консольном окне. Так первые две переменные задают начало заголовка, вторые две - начальную позицию игрового поля, далее – список использованных во врем игры слов, окно с информацией о счете игроков и окно с уведомительными сообщениями.
В начале игры, после заполнения центрального слова из текстового словаря будет сформирован словарь, представляющий собой массив векторов со строками, каждый вектор содержит в себе только слова одной длины.
struct WORD_LIST
{
vector<_WORD> groups[23];
};
зависимая структура:
struct _WORD
{
char word[25];
};
struct WORD_DFS_FIND_INF
{
CELL best_word[26];
int best_word_size;
char visited[26];
bool undef_char_founded;
int buf_size;
CELL buffer[26];
};
Данная структура хранит информацию, необходимую для генерации и проверки слов с помощью обхода графа в глубину. best_word это последовательность ячеек, содержащее лучшее слово, из числа сгенерированных.
visited хранит признак посещения вершин
undef_char_founded явялется признаком того, что наша последовательность содержит символ *.
buffer является аналогом стека обхода графа, из него формируется лучшее слово.