Игра "Акинатор". Язык программирования: С++. Среда разработки: Microsoft Visual Studio 2010
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
stion (char* q);dellQuestion (int id);
};. cpp
#include "StdAfx. h"
#include
#include "toguess. h"
#include
#include
#include namespace std;:: toguess ()
{ // конструктор* db_q_filename = "questions. txt";* db_r_filename = "responses. txt";
// Загружаем базу данных
// База вопросов*file = fopen (db_q_filename,"r");(! file)
{;
}(! feof (file)) {word [1025];id;(file,"/%s /%i ",&word,&id);*question = new char [strlen (word)];(question,word);
// toniceview (question);_question _Q;
_Q. id = id;
_Q. question = question;. push_back (_Q);
}(file);
// База ответов (персонажей)
file = fopen (db_r_filename,"r");(! file)
{;
}(! feof (file)) {resp [1025];countq;pro;(file,"%s /%i",&resp,&countq);*response= new char [strlen (resp)];(response,resp); quests;(int i=1; i<=countq; i++)
{temp;(file, "%i ",&temp);. push_back (temp);
}(file, "%f/ ",&pro);_response thisResponse;. idQuest = quests;. probability = pro;. response = response;. push_back (thisResponse);
}(file);
}toguess:: newgame () {
// Старт новой игры. clear ();. clear ();. clear ();= responses;= questions;(int i=0; i<Tresponses. size (); i++)
{(Tresponses [i]. idQuest. begin (),Tresponses [i]. idQuest. end ());
}= 0;
}toguess:: getQuestion () {
// новый вопрос
// Каждый новый вопрос берется у самого подходяешго на данный момент персонажа,
// Таким образом, либо повысится вероятность того, что он и есть персонаж
// либо полностью исключится (или понизится?)
int id;
while (Tresponses [Tresponses. size () - 1]. idQuest. size () >0&&Tresponses [Tresponses. size () - 1]. idQuest [Tresponses [Tresponses. size () - 1]. idQuest. size () - 1] ==-1) Tresponses [Tresponses. size () - 1]. idQuest. pop_back ();
while (Tresponses [Tresponses. size () - 2]. idQuest. size () >0&&Tresponses [Tresponses. size () - 2]. idQuest [Tresponses [Tresponses. size () - 2]. idQuest. size () - 1] ==-1) Tresponses [Tresponses. size () - 2]. idQuest. pop_back ();
if (step>3)
{(Tresponses [Tresponses. size () - 1]. idQuest. size () ==0)
{(Tresponses [Tresponses. size () - 2]. idQuest. size ()! =0)
{
id=Tresponses [Tresponses. size () - 2]. idQuest [Tresponses [Tresponses. size () - 2]. idQuest. size () - 1];
}
{ // если о обоих на данный момент самых вероятных ответов больше не осталось вопросов, и их вероятности раны, лбио почти одинаковы,
// то понимажем их вероятность и переходи к другим вопросам.
if (Tresponses [Tresponses. size () - 1]. probability-Tresponses [Tresponses. size () - 2]. probability<0.01 && havequestions ())
{[Tresponses. size () - 1]. probability/=1.5;[Tresponses. size () - 2]. probability/=1.5;(int i = Tresponses. size () - 1; i > 0; i--)
{(int j = 0; j < i; j++)
{(Tresponses [j]. probability > Tresponses [j + 1]. probability)(Tresponses [j], Tresponses [j + 1]);
}
}getQuestion (); // Отсортировав в соотв. с новыми вероятностями, берем вопрос.
}- 1; // ответ - на данный момент самый вероянтый. Ответ не точный, но система делает вывод, что дальше спрашивать смысла нет
}
}
else
{
id=Tresponses [Tresponses. size () - 1]. idQuest [Tresponses [Tresponses. size () - 1]. idQuest. size () - 1];
}
}// первые три (?) вопроса берем для первоначальной сортировки воросов, самые общие вопросы, по мнению системы
{= populatQuestion ();
}++;(int i=0; i<Tquestions. size (); i++)
{(Tquestions [i]. id == id)
{:: cout<<toniceview (Tquestions [i]. question) <<" [0/1/2/3/4] ";id;
}
}
}toguess:: setQuestion (int id, int q) // корректируем текущую базу в соответсвии с овтетом на вопрос
{(q==1)
{
// У всех вариантов ответа, у которых есть даннный вопрос, повышаем вероятность
int k = 0; int ii=0;(int i=0; i<Tresponses. size (); i++)
{(findInVector (Tresponses [i]. idQuest, id))
{++;=i;[i]. probability*=4;(int j=0; j<Tresponses [i]. idQuest. size (); j++)
{(Tresponses [i]. idQuest [j] ==id) Tresponses [i]. idQuest [j] =-1;
}
}
{
// если вопроса нет, понижаем вероятность[i]. probability/=1.5;
}
}(k==1) Tresponses [ii]. probability+=0.2; // если персонаж с даным ответом тоько один, то его вероятность резко повышается
// сортируем все ответы в соответствии их вероятности
for (int i = Tresponses. size () - 1; i > 0; i--)
{(int j = 0; j < i; j++)
{(Tresponses [j]. probability > Tresponses [j + 1]. probability)(Tresponses [j], Tresponses [j + 1]);
}
}. push_back (id);
}
else if (! q)
{ // ЕСЛИ ОТВЕТ ЛОЖЬ
// У всех вариантов ответа, у которых есть даннный вопрос, понижаем вероятность
for (int i=0; i<Tresponses. size (); i++)
{(findInVector (Tresponses [i]. idQuest, id))
{[i]. probability/=4;
// if (Tresponses [i]. probability<0) {Tresponses [i]. probability*=0.001; Tresponses [i]. probability=abs (Tresponses [i]. probability); }(int j=0; j<Tresponses [i]. idQuest. size (); j++)
{(Tresponses [i]. idQuest [j] ==id) Tresponses [i]. idQuest [j] =-1;
}
}
{
// а у кого нет, повышаем[i]. probability+=0.05;
}
}
// сортируем все ответы в соответствии их вероятности
for (int i = Tresponses. size () - 1; i > 0; i--)
{(int j = 0; j < i; j++)
{(Tresponses [j]. probability > Tresponses [j + 1]. probability)(Tresponses [j], Tresponses [j + 1]);
}
}
}if (q==3)
{ // Ответ Скорее да
int k = 0; int ii=0;
for (int i=0; i<Tresponses. size (); i++)
{(findInVector (Tresponses [i]. idQuest, id))
{++;=i;[i]. probability*=3;(int j=0; j<Tresponses [i]. idQuest. size (); j++)
{(Tresponses [i]. idQuest [j] ==id) Tresponses [i]. idQuest [j] =-1;
}
}
{
// если вопроса нет, понижаем вероятность[i]. probability-=0.01;
}
}(k==1) Tresponses [ii]. probability+=0.15; // если персонаж с даным ответом тоько один, то его вероятность резко повышается
// сортируем все ответы в соответствии их вероятности
for (int i = Tresponses. size () - 1; i > 0; i--)
{(int j = 0; j < i; j++)
{(Tresponses [j]. probability > Tresponses [j + 1]. probability)(Tresponses [j], Tresponses [j + 1]);
}
}. push_back (id);
}if (q==4)
{(int i=0; i<Tresponses. size (); i++)
{(findInVector (Tresponses [i]. idQuest, id))
{[i]. probability-=0.15;(Tresponses [i]. probability<0) { Tresponses [i]. probability*=0.001; Tresponses [i]. probability=abs (Tresponses [i]. probability); }(int j=0; j<Tresponses [i]. idQuest. size (); j++)
{(Tresponses [i]. idQuest [j] ==id) Tresponses [i]. idQuest [j] =-1;
}
}
{
// а у кого нет, повышаем[i]. probability+=0.045;
}
}
// сортируем все ответы в соответствии их вероятности
for (int i = Tresponses. size () - 1; i > 0; i--)
{(int j = 0; j < i; j++)
{(Tresponses [j]. probability > Tresponses [j + 1]. probability)(Tresponses [j], Tresponses [j + 1]);
}
}
}
}toguess:: findInVector (std:: vector v, int id)
{(int i=0; i<v. size (); i++)
{(v [i] ==id) return true;
}false;
}toguess:: findInVector (std:: vector v, int id)
{(int i=0; i<v. size (); i++)
{(v [i]. id==id) return true;
}false;
}toguess:: getResponse (int id)
{
// попытка получить ответ
// Ответ есть, если разница между вероятностью двух, на данный
// момент самых подходящих, ответов больше какой-то константы
if (Tresponses [Tresponses. size () - 1]. probability-Tresponses [Tresponses. size () - 2]. probability >= 0.05 || id<0)
{ // ответ естьTresponses.