Игра "Акинатор". Язык программирования: С++. Среда разработки: Microsoft Visual Studio 2010
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
Московский государственный университет экономики, статистики и информатики
Институт Компьютерных Технологий
Кафедра Математического обеспечения информационных систем и инноватики (МОИСиИ)
Курсовая работа
по курсу "Объектно-ориентированное программирование (ООП (2))"
на тему
"Игра Акинатор. Язык программирования: С++. Среда разработки: Microsoft Visual Studio 2010
Выполнил студент группы ДКО-201:
Наразин И.В.
ДКО-10161
Руководитель Переверзев И.Ю.
Москва, 2012 г.
Содержание
Задание
Структура программы
Исходный код
Литература
Задание
Разработка игры Угадай персонажа. Суть игры: пользователь загадывает персонажа, затем отвечает на предлагаемые программой вопросы. В итоге программа угадывает загаданного персонажа.
В программе учесть:
)Допустить некоторый процент ошибочных ответов. Т.е. если пользователь может ошибиться в своем ответе, но программа все равно должна дать верный ответ.
2)Обучаемость. Программа должна запоминать новых персонажей и новые вопросы, корректировать свою базу данных.
)Каждый вопрос должен дать программе как можно больше информации. Т.е. вопрос не должны выбираться случайно.
1.Алгоритмы и методы
База данных программы состоит из двух файлов:
Responses. txt - все возможные ответы программы
Questions. txt - все возможные вопросы.
Вид записи в responses. Txt
Каждый раз список возможных вариантов ответов сортируется по вероятностям. Новый вопрос берется из списка вопросов самого, на данный момент, вероятного ответа. Первые несколько вопросов - самые наиболее встречающиеся в векторах ответов персонажей. Они нужны для первоначального отсева персонажей.
При положительном ответе на вопрос, вероятность всех ответов, содержащий данный вопрос увеличивается. А вероятность ответов, не содержащих данный вопрос уменьшается. При отрицательном ответе наоборот: вероятность ответов, не содержащих данный вопрос повышается, а содержащих - уменьшается. Все положительные вопросы запоминаются в рамках одной игры, на случай добавления нового персонажа. Неточные ответы: скорее да и скорее нет влияют на то, на сколько вероятность увеличится или уменьшится. При ответе не знаю, данный вопрос просто удаляется.
Ответ считается найденным, если разность между двумя, на данный момент самыми вероятными ответами, будет больше заранее заданной константы. Если пользователь загадал персонажа, которого нет в базе, то программа выдаст текущего наиболее вероятного (подходящего для данной базы) персонажа. А пользователь может скорректировать ответ программы.
Для добавления нового персонажа, пользователю предлагается ввести имя. Если его нет в базе (если есть, программа выдала неверный результат из-за небольшой базы), то он добавляется в базу ответов, а вектор его вопросов будет равен вектору положительных ответов в рамках данной игры.
Дальше пользователю предлагается ввести вопросов, который позволит отличить персонажа пользователя от персонажа, выданного программой. Этот вопрос запоминается в базе и заносится в вектор ответов для нового персонажа. Сам персонаж так же заносится в базу.
игра программа алгоритм
Структура программы
Основной алгоритм заключен в класс toguess. Методы:() - конструктор. Считывание базы из файлов.
void save () - сохранение измененной базы
void newgame () - новая игра, сброс вектора положительных ответов, загрузка скорректированной базы
int getQuestion () - выдает новый вопрос
void setQuestion (int id, bool q); - корректирует вероятности ответов в соответствии с ответом пользователя на вопрос с id.
int getResponse (int id=0); - попытка получить ответ
char* getfResponse (int id); - возвращает ответ с данным id в векторе
void setResponse (int id, bool flag); - корректирует базу, если программа угадала правильно. Не нужен, пока база мала. Имеет смысл, когда база больше нескольких тысяч вариантов
void newResponse (char* response); - добавляет в базу нового персонажа
void newQuestion (char* q); - добавляет в базу новый вопросdellQuestion (int id); - удаляет вопрос из векторов ответов персонажей.
Приватные методы:
bool findInVector (std:: vector v, int id); - ищет id в векторе. Если находит, возвращает true
bool findInVector (std:: vector v, int id); - ищет id в векторе. Если находит, возвращает true
int maxid (std:: vector _questions); - возвращает максимальный id в векторе
char* addspaces (char* str); - заменяет нижниче пдчеркивания на пробелы
char* toniceview (char* str); - переводит из транслита в кириллицу
bool havequestions (); - true, если есть вопросы, на которые пользователь не ответил
int populatQuestion (); - возваращет id самого популярного вопроса в векторах ответов персонажей
Исходный код
Класс toguess
Toguess. h
#include toguess
{: s_question // структура вопросов
{
char* question;
int id;
};
struct s_response // структура ответов
{
char* response;
std:: vector idQuest;
double probability;
};
// Постоянаая база для всей игры
std:: vector responses;
// Временная база для одной игры:: vector donequest;
std:: vector _questions);* addspaces (char* str);* toniceview (char* str);havequestions ();populatQuestion ();:();save ();newgame ();getQuestion ();setQuestion (int id, int q);getResponse (int id=0);* getfResponse (int id);setResponse (int id, bool flag);newResponse (char* response);newQue