Игра "Акинатор". Язык программирования: С++. Среда разработки: 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.