Разработка прикладного алгоритма детских развивающих игр и его реализация на языке С++

Автор работы: Пользователь скрыл имя, 26 Октября 2013 в 18:57, курсовая работа

Краткое описание

Описание игр:
"Выбери неправильное слово":
Есть несколько файлов со словами разных групп. Выпадает 3 слова из одного файла и одно из другого.
(Файлы выбираются случайно, как и слова)
У каждого слова есть номер. Пользователю предлагается выбрать номер слова, которое не соответствует тематике.
На угадывание даётся две попытки. Если слово было выбрано правильно с первого раза - 100 баллов, если со второго - 50 баллов. В одном туре 3 группы слов.

Содержимое работы - 1 файл

Курсовик по С++.docx

— 169.42 Кб (Скачать файл)

}

 

void SetColor(int text, int background) //Установка цвета символов, выводимых на консоль

{SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));}

 

struct Zapys_in_f

{ char *str;//строка

int chislo;//числовые данные

};

 

void main()

{

Set1(0,1);

Set1(0,2);

srand(time(NULL)); 

SetConsoleCP(1251); // меняю кодировку в консоли  для отображения русских букв

SetConsoleOutputCP(1251);

reg();

}

void reg() //регистрация

{

SetColor(0,11);

cout<<"ВВЕДИТЕ  ЛОГИН:\n\t(Логин не должен содержать  следующие символы:\

    \n\t\t < > : \" / \ | )\n\n";

cin>>login;

 for(int i=49;i<=54;i++)  //проверяем, чтобы название файла не совпало с файлами,

   {   //в кот. находятся слова для использования в проге

char l=i;             

if(strchr(login,l)) //49-54 - диапозон char-символов соотв  1-6(вкл)

{     

cout<<"\nЭтот  логин задать нельзя! ";

exit(0);

 }

   }

 

_strlwr(login);       //все буквы переводим в малый  регистр

strcat(login,".txt"); //добавили к логину расширение .txt

 

    _finddata_t *fileinfo=new _finddata_t; // Объявление ук-ля fileinfo на структуру

//_finddata_t и создание динамического  объекта

//структуры _finddata_t

 

long done = _findfirst(login,fileinfo);// Начинаем поиск

 

char otv;

if(done==-1)

{    // если done будет равняться -1,  то  поиск вести бесмысленно,такого  файла нет 

cout<<"Такой  файл не существует.Создать?(Y/N)";

 cin>>otv;

   if((otv=='Y') || (otv=='y'))

  (statist=fopen(login,"a+"))?cout<<"Файл создан.":cout<<"Произошла ошибка.\nЭтот логин

задать нельзя. Попробуйте ещё раз\n";

   else

  cout<<"До  свидания!";

}

 

else

{

cout<<"Такой  файл уже существует. Перезаписать  его?(Y/N)";

cin>>otv;

if((otv=='Y') || (otv=='y'))

(statist=fopen(login,"w+"))?cout<<"Готово.":cout<<"DПроизошла ошибка.\nЭтот логин задать нельзя! Попробуйте ещё раз\n";

else

(statist=fopen(login,"a+"))?cout<<"Готово.":cout<<"NПроизошла ошибка.\nЭтот логин задать нельзя! Попробуйте ещё раз\n";

}

 

if(_access(login,00))//проверка  на существование файла

exit(0);

fclose(statist);//закрываем файл

Sleep(2000);

menu(); //переходим в меню

}

 

void menu()

{

SetColor(0,7);

system("cls");

 

cout<<"\nВЫБЕРИТЕ  ИГРУ:\n\t\"Выбери лишнее слово\" - 1,\n\t\\

"Проверка  орфографии\" - 2,\n\t\"Математические  чудеса\" - 3,\n\t\\

"Просмотр  статистики\" - 4,\n\t Выход - 0\n->";

 

int otvet;

cin>>otvet;

 

switch(otvet)

   {

case 1: slova();      break;

case 2: orfograrphy();           break;

case 3:matem()         break;

case 4:stat("\nВсего:\t",bal); break;

case 0:exit(0);      break;

default:cout<<"Неправильный выбор. Введите число от 0 до 4\n";

   }

}

 

void slova()

{

char word[kol_vo_bukv]={0}; //массив для загрузки слов

FILE *f1,*f2;               //создаём указатели для открытия  файлов

int j=0,baly1=0;

 

while(j<3) //3 тура

  {                              

int f_otkr1=rand()%kol_vo_f+1,f_otkr2;//получаем номер файла,кот надо открыть

do{

f_otkr2=rand()%kol_vo_f+1;

  } while(f_otkr1==f_otkr2);//чтобы №№файлов не совпали

 

f1=fopen(masFile[f_otkr1],"r");       //открываем 1-й файл на чтение 3-х слов

f2=fopen(masFile[f_otkr2],"r");       //открываем 2-й файл на чтение  лишнего слова

 

    if(!f1||!f2)

cout<<"\nПроизошла  ошибка! Начните заново.\n";

Sleep(2000);

menu();

}

 

cout<<"\t\t\t\t"<<j+1<<"ТУР\n";

int m;

int no=rand()%4;     //определяем № лишнего слова,м  - переменная,для № слова

//в файле(в  неё возвращаем функцию)

int mr[3]={0},l,k=0; //массив для сохранения выпавших  №№ слов, во избежание

//их повтора  на экране

 

for(int i=0;i<4;i++) //цикл для вывода на экран  слов

{         

if(i==no)

    {

m=load_word(f2,word);  //лишнее слово из др файла

 fseek(f2, 0, 0);

}

else

  {

m=load_word(f1,word); //загружаем слово

fseek(f1, 0, 0);      //возвращаем файловый указатель  в //начало файла

mr[k]=m;

 

  for(l=0;l<3,mr[k]!=mr[l]&&k!=l;l++)//цикл  перебора //№№выпавших слов

  {         

   //if (l==3)l=0;   //обнуляем счётчик цикла,т  к в массиве //всего3 элемента

 

   if(mr[k]==mr[l]&&k!=l)

     {  //загружаем слово до тех пор,пока на экране будут //все слова разные

   do{

  mr[k]=load_word(f1,word);

  fseek(f1, 0, 0); //возвращаем файловый

 

//указатель в начало файла

 }while(mr[k]!=mr[l]);

  }

   } k++;

        } //end else

 

cout<<"\t\n\n"<<i+1<<"-е слово :\t"<<word;//<<"\n";

} //end for

 

int num=0,o=0;//о - счётчик попыток

cout<<"\nno="<<no<<"\n";

 

do{

   cout<<"Введите номер лишнего слова :\n";

    cin>>num;

cout<<"\n n="<<no+1;

 

if(num==no+1)//проверка  на правильность

{  

if(o==1)

  { system("cls");   //если это 2 попытка

baly1+=50;

bal+=50;

cout<<"Правильно! +5 баллов\t\t\t\t\tВсего : "<<baly1<<" баллов \n";

break;

  }

 

  else

  { system("cls");

bal+=10;

baly1+=10;

cout<<"Правильно! +10 баллов\t\t\t\t\tВсего : "<<baly1<<" баллов\n";

break;

  }

} //end if

 

else if(num>4||num<1)cout<<"Здесь всего 4 слова!\n";    //ошибка ввода

 else

  {    //проверка на неправильность

if(o==1)

{ system("cls");

bal-=100;

baly1-=100; 

cout<<"Неверно! -10 баллов\t\t\t\t\tВсего : "<<baly1<<" баллов\n";

break;

}

   else cout<<"Неверно! 2-ая попытка\n";

  }

o++;

}while(num==no||o!=2);//пока  не совпадёт № слова или  не кончится 2 //попытки

j++;

 

fclose(f1); //закрываем  файлы

fclose(f2);

   } //end while

 

char Str[]="ИГРА :   Выбери неправильное слово\n\t\tКоличество  баллов - ";

    j=baly1;

stat(Str,j);

}

 

int load_word(FILE *file,char *word)//функция для загрузки слова

{        

int kolWord=20;

char masBukv[kol_vo_bukv]={0};

int i=0;     

   int w = rand() % kolWord; // Случайное слово

  

   while(i <= w)             // Поиск слова

   {

     fgets(masBukv, kol_vo_bukv, file);

     i++;

   }

  

   int wordlen = strlen(masBukv+1); // Определяем длину слова

   if(masBukv[wordlen - 1] == 10)    // Убираем Enter (в DOS'е 2 байта 13 10)

      masBukv[wordlen - 2] = 0;

   else if(masBukv[wordlen - 1] == 13)

      masBukv[wordlen - 1] = 0;

  

   strcpy(word, masBukv);   // Копируем слово

   return w;

}

 

void orfograrphy() //проверка орфографии

{

int baly1=0;

char alf[]={"аяуюэеоёыи"};//буквы,кот будут заменяться "?"

char word[kol_vo_bukv]={0};//масс для загрузки слова из файла

int yes,m;

FILE *f;

 

do{

  int f_otkr=rand()%5;    //№ файла, кот. надо открыть

  f=fopen(masFile[f_otkr],"r"); //открываем файл на чтение  слова

  if(!f)

{

cout<<"\nПроизошла ошибка!\n";

 return;

    }

 

m=load_word(f,word);  //ф-я загрузки слова

fseek(f, 0, 0);       //возвращаем файловый указатель  в начало файл

 

int kl=strlen(word-1);//счёт  кол букв в слове

//cout<<word<<kl;

char*boof=new char[kl];

 

strcpy(boof,word);  //записываем в буфер слово  и меняем гласные на "?"

 

for(int i=0;i<kl;i++)

for(int j=0;j<10;j++)

if(boof[i]==alf[j])

boof[i]='?';

cout<<"\n"<<boof<<"\nЧто  это за слово? Напишите его!\n\n";

 

char *boof1=new char[kl];//массив для ввода слова  пользователем

cin>>boof1;

_strupr(word);

_strlwr(boof1);

//cout<<word<<boof1;

 

 if(boof1[kl-2]!=0)//если пользователь ввёл больше или меньше        //букв,чем в слове

{  cout<<"\nВ  этом слове меньше букв!\n"; }

 else

{

  for(int i=0; i<(kl-2); i++)//kl-2-убираем "\0"

  { 

if(boof[i]=='?'&&word[i]!=boof1[i])

{  //если "?" не заменяются правильными  буквами

bal-=10;

baly1-=10;

cout<<"\nНеправильно!  \"- 10 баллов\"\t\tВсего: "<<baly1<<"\n";

break;

}

 

if(word[i]==boof1[i]&&i==kl-3)

{ bal+=10;

baly1+=10;

cout<<"\nПравильно! +10 баллов\t\tВсего:"<<baly1<<"\n"

        }

  }//end for

}//end else

 

delete[]boof1;

delete[]boof;

 

cout<<"\nПродолжить игру? Да - нажмите \'1\',  Нет - нажмите \'0\'\n";

cin>>yes;

 

}while(yes);

 

fclose(f);  //закрываем файл,из кот брали  слово

char Str[]="ИГРА :  Проверка орфографии\n\t\tКоличество  баллов - ";

int a=baly1;

stat(Str,a);   

}

 

void stat(char* st,int a) //Статистика

{

SetColor(0,6);

Zapys_in_f ORF,ORF1;//создаём  объекты типа структура для  работы с файлом статистики

 

ORF.str=st;

//strcpy(ORF.str,st);

//ORF.str="ИГРА :    Проверка орфографии\n\t\tКоличество  баллов - ";//заполняем поля объекта

ORF.chislo=a;

//ORF.chislo=baly;

statist=fopen(login,"w+b");        //открываем файл на запись

fwrite(&ORF,sizeof(Zapys_in_f),1,statist);//записываем  в файл статистику

fclose(statist);                   //закрываем файл и следом открываем  его на чтение

 

statist=fopen(login,"r+");

fseek(statist, 0, 0);              //возвращаем файловый указатель  в начало файл

fread(&ORF1,sizeof(Zapys_in_f),1,statist); //считываем данные из ф в  др  объект структуры

fclose(statist);                   //закр файл статистики

 

system("cls");

cout<<"\n\n\t\t"<<ORF1.str<<ORF1.chislo; //выводим на экран данные

int otv;

cout<<"\n\n\n\nВернуться в меню - нажмите 1\nВыход - нажмите 0\n";

cin>>otv;

if(otv)

menu();

else exit(0);

}

 

void matem()

{

cout<<"\n\n\tКакой  уровень сложности выбираете?\n\"1\" - с 2-мя переменными\t\t\"2\" - c 3-мя 

 

переменными\n";

int ur,ch,is=0;

double isd=1.1;

cin>>ur;

cout<<"С  какими числами вы будете считать:\n\"1\" - с целыми\

  (1, 2, 3...)\t\"2\" - с дробными(1.1, 2.2, 3.3...)\n";

cin>>ch;

//ch==1?is:isd;

if(ur==1&&ch==1)

min_uravn(is);

if(ur==1&&ch==2)

min_uravn(isd);

if(ur==2&&ch==1)

max_uravn();

}

 

inline int schet()

{

cout<<"\nДо  скольки вы будете считать?\n";

int o;

cin>>o;

return o;

}

 

void min_uravn(int t)

{

int q,a1=0,a2=0,baly1=0;

q=schet();  //ввод пользователем диапaзона  значений

 

do{

int a=0,b=0,c=0;

int znak=rand()%4;//определяем  знак действия

char zn=mr_znak[znak];

if(zn=='*'||zn=='/'){q/=3;}//если  действие"*"или"/"- уменьшаем  диапозон в 2 раза

int isk=rand()%2;//определяем,что  требуется вычислить

 

switch(isk)

{

case 0:

b=rand()%q+1; //определяем 2 операнд

c=rand()%q+1; //определяем 3 операнд

break;

case 1:

a=rand()%q+1; //определяем 1 операнд

b=rand()%q+1; //определяем 3 операнд

break;

case 2:

a=rand()%q+1; //определяем 1 операнд

c=rand()%q+1; //определяем 3 операнд

break;

default:

cout<<"\nПроизошла  ошибка!\n";

}

if(a&&b)//если  ищем *с*

{      

  if(zn=='/')//для  "/" подбираем числа, чтобы  "нацело"

{a=delen(b); }

 

if(a<b) //для  всех ост. меняем местами а  и б

{a2=a;a=b;b=a2;}

 

  system("cls");

  cout<<"\n"<<a<<zn<<b<<"="<<"?\n";

  a2=reshen(a,b,zn);     //правильный ответ в перем а2

}

 

if(a&&c)//если  искомое *b* повторяем условия

{      

if(zn=='/')

{ a=delen(c); }

 

if(zn=='*')

{ c=delen(a); }

 

if(a<c&&zn=='-'||a>c&&zn=='+')

{ a2=a;a=c;c=a2;}

 

system("cls");

cout<<"\n"<<a<<zn<<"?"<<"="<<c<<"\n";

 

switch(zn)

{

case'+':

  zn='-';

  a2=reshen(c,a,zn); break;

case'-':

case '/':

  a2=reshen(a,c,zn); break;

case'*':

  zn='/';

  a2=reshen(c,a,zn);break;

}

} //end if

 

if(b&&c)//если искомое *а*

  if(zn=='*')

  { c=delen(b); }

 

if((c<b&&zn=='+'))

{a2=c;c=b;b=a2;}

 

system("cls");

cout<<"\n"<<'?'<<zn<<b<<"="<<c<<"\n";

 

switch(zn)

{

  case'+':

zn='-';

a2=reshen(c,b,zn);break;

  case'-':

zn='+';

a2=reshen(b,c,zn);break;

  case'*':

zn='/';

a2=reshen(c,b,zn);break;

  case '/':

zn='*';

a2=reshen(b,c,zn);break;

}

} // end if

 

//cout<<"\nX="<<a2;

cout<<"\nНапишите  число, которое должно быть  вместо знака вопроса\'?\'\n";

cin>>a1;

 

if(a1==a2)

{

baly1+=10;

bal+=10;

cout<<"Правильно!  Вы получаете +10 баллов\t\t\t\tВсего:"<<baly1<<"\n";

}

 

else

{

baly1-=10;

bal-=10;

cout<<"Неправильный  ответ! У тебя  -10 баллов\tВсего:"<<baly1<<"\n";

}

 

if(zn=='*'||zn=='/')q*=3;

cout<<"Продолжаем? \'1\' - Да\t\'0\' - Нет\n";

cin>>a1;

}while(a1);

 

char Str[]="ИГРА :   Математические чудеса\n\t\tКоличество  баллов - ";

    a1=baly1;

stat(Str,a1);

//menu();

}

 

template<typename T>

T delen(T b)

{

T a=rand()%11+1;

return (T)a*b;

}

 

template<typename T>

T reshen(T a,T b,char znak)

{

switch(znak)

{

case '+':

return (T)a+b;break;

case'-':

return (T)a-b;break;

case '*':

return (T)a*b;break;

case'/':

if(b==0)

{

cout<<"На  ноль делить нельзя!\n";

return 1111111;

}

//if(a%b!=0)cout<<a<<"/"<<b;

return (T)a/b;break;

} //end switch

}

 

void min_uravn(double t) //перегружаем для double

{            

double a1=0,a2=0;

int q=schet(),baly1=0;  //ввод пользователем диапaзона значений

 

do{

double a=0,b=0,c=0;

int znak=rand()%4; //определяем знак действия

char zn=mr_znak[znak];

 

if(zn=='*'||zn=='/')

{q/=3;}//если  действие"*"или"/"- уменьшаем  диапозон в 2 раза

 

int isk=rand()%2;//определяем, что требуется вычислить

switch(isk)

{

  case 0:

b=Dab(q); //определяем 2 операнд

c=Dab(q); //определяем 3 операнд

break;

  case 1:

a=Dab(q); //определяем 1 операнд

b=Dab(q); //определяем 3 операнд

break;

  case 2:

a=Dab(q); //определяем 1 операнд

c=Dab(q); //определяем 3 операнд

break;

  default:

cout<<"\nПроизошла ошибка!\n";

} // end switch

 

//cout<<a<<b<<c;

if(a&&b)//если ищем *с*

{    

if(zn=='/')

{a=delen(b); }

 

if(a<b) 

{a2=a;a=b;b=a2;}

 

system("cls");

cout<<"\n"<<a<<zn<<b<<"="<<"?\n";

t=reshen(a,b,zn);

}// end if

 

if(a&&c)//если искомое *b*

{      

if(zn=='/')

{ a=delen(c);  }

if(zn=='*')

{ c=delen(a);  }

if(a<c&&zn=='-'||a>c&&zn=='+')

{ a2=a;a=c;c=a2;}

 

system("cls");

cout<<"\n"<<a<<zn<<"?"<<"="<<c<<"\n";

 

switch(zn)

{

case'+':

zn='-';

t=reshen(c,a,zn);break;

case'-':

Информация о работе Разработка прикладного алгоритма детских развивающих игр и его реализация на языке С++