Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Лабиринт на с++  (Прочитано 3434 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Лабиринт на с++
« Ответ #60 : 14 Января 2015, 20:14:39 »
Гриб_под_зонтом, пока нет, но у тебя есть предыдущие проекты, можно их посмотреть(напомни какие, скинешь ссылки), если будешь что-то ещё делать, то тоже появятся.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Лабиринт на с++
« Ответ #61 : 14 Января 2015, 20:18:21 »
alsoijw,
С крестиками-ноликами вроде всё в порядке:
Код: (cpp) [Выделить]
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <fstream>
#include "universal.h"

 int k;
 char f[]="Статистика.txt";
 char a [3] [3] = {{' ',' ',' '},
                   {' ',' ',' '},
                   {' ',' ',' '}};
   
   void print_a()
     {
cout<<"\033[H\033[J \t \tВАС ПРИВЕТСТВУЕТ ИГРА КРЕСТИКИ-НОЛИКИ\t \t"<<endl;
for (int i=0; i<3; i++)
  {
              cout<<a[i][0]<<" | "<<a[i][1]<<" | "<<a[i][2];
              if (i<2) {cout<<endl<<"----------";}
              cout<<endl;
           }
     }
   bool who_win(int x, int y)
   {
   ofstream my_statistics(f, ios::app);
   if (a[x][y]=='X'){cout<<"Поздравляю! Ты выиграл!"<<endl;
   my_statistics<<"Выиграл игрок."<<endl; return true;}
   if (a[x][y]=='O'){cout<<"Ты проиграл :("<<endl;
   my_statistics<<"Выиграл Бот."<<endl; return true;}
   return false;
   }
   int comp_a(char pole)
   {
   for (int m=0; m<3; m++)
   {
   if (a[m][0]==pole && a[m][1]==pole && a[m][2]==' '){
                                                       if (m==0) k=3;
                                                       if (m==1) k=6;
                                                       if (m==2) k=9; return 0;}   
   if (a[m][0]==pole && a[m][2]==pole && a[m][1]==' '){
                                                       if (m==0) k=2;
                                                       if (m==1) k=5;
                                                       if (m==2) k=8; return 0;}
   if (a[m][2]==pole && a[m][1]==pole && a[m][0]==' '){
                                                       if (m==0) k=1;
                                                       if (m==1) k=4;
                                                       if (m==2) k=7; return 0;}
   if (a[0][m]==pole && a[1][m]==pole && a[2][m]==' '){
                                                       if (m==0) k=7;
                                                       if (m==1) k=8;
                                                       if (m==2) k=9; return 0;}   
   if (a[0][m]==pole && a[2][m]==pole && a[1][m]==' '){
                                                       if (m==0) k=4;
                                                       if (m==1) k=5;
                                                       if (m==2) k=6; return 0;}
   if (a[2][m]==pole && a[1][m]==pole && a[0][m]==' '){
                                                       if (m==0) k=1;
                                                       if (m==1) k=2;
                                                       if (m==2) k=3; return 0;}
   }
   if (a[0][0]==pole && a[1][1]==pole && a[2][2]==' '){k=9; return 0;}   
   if (a[0][0]==pole && a[2][2]==pole && a[1][1]==' '){k=5; return 0;}
   if (a[2][2]==pole && a[1][1]==pole && a[0][0]==' '){k=1; return 0;}
   if (a[0][2]==pole && a[1][1]==pole && a[2][0]==' '){k=7; return 0;}   
   if (a[0][2]==pole && a[2][0]==pole && a[1][1]==' '){k=5; return 0;}
   if (a[1][1]==pole && a[2][0]==pole && a[0][2]==' '){k=3; return 0;}
   return 0;
   }
   void igrok_1()
   {
  int l, eror;
  cout<<endl<<"Твой ход: ";
  do{
  eror = 0;
  l = getch();
  l = l-48;
  cout<<endl;
  int y = (l-1) - 3*((l-1)/3);
      int x = (l-1)/3;
      if (l>9 || l<1)
        {
              cout << "Ошибка: нет такого поля. Попробуйте ещё раз: ";
              eror = 1;
        }
     else
      {
        if (a[x][y]==' ') a[x][y]='X';
        else
       {
           cout << "Ошибка: поле занято. Поробуйте ещё раз:";
           eror = 1;
        }
       }
      }
      while (eror==1) ;
   }
   void comp()
   { 
   int eror;
  srand(time(0));
  cout<<endl<<"Дай мне подумать.."<<flush;
  time_s(2);  
  comp_a('X');
  if (comp_a('X')==0) {goto B;}
  comp_a('O');
  if (comp_a('O')==0) {goto B;} 
  do{
  eror = 0;
  k = rand ()%(9)+1;
  B:
  int y = (k-1) - 3*((k-1)/3);
      int x = (k-1)/3;
      if (k>9 || k<1)
        {
              eror = 1;
        }
     else
      {
        if (a[x][y]==' ') a[x][y]='O';
        else
       {
           eror = 1;
        }
       }
      }
      while (eror==1) ;
   }
   bool win()
   {
   for (int x=0; x<3; x++)
          {
           if (a[x][0]!=' ' && a[x][0]==a[x][1] && a[x][1]==a[x][2])
              {
  if(who_win(x, 0)==true) return true;
  }
           if (a[0][x]!=' ' && a[0][x]==a[1][x] && a[1][x]==a[2][x])
              {
  if(who_win(0, x)==true) return true;
  }
          }
           if (a[0][0]!=' ' && a[0][0]==a[1][1] && a[1][1]==a[2][2])
              {
  if(who_win(0, 0)==true) return true;
  }
           if (a[0][2]!=' ' && a[0][2]==a[1][1] && a[1][1]==a[2][0])
              {
  if(who_win(0, 2)==true) return true;
  }
           return false;
   }
   int main()
     {
nonblock(1);
     ofstream my_statistics(f, ios::app);
print_a();

for (int f=0; f<4; f++)

{
igrok_1();
     clear_scr();
     print_a();
     if (win()==true) return 0;
     comp();
     clear_scr();
     print_a();
     if (win()==true) return 0;
         }
             igrok_1();
     clear_scr();
     print_a();
     if (win()==true) return 0;
         
cout<<"Ничья!"<<endl;
my_statistics<<"Ничья."<<endl;
return 0;
}]
Было ещё "угадай число" но там вообще всё просто:
Код: (cpp) [Выделить]
#include <iostream>
 #include <cstdlib>
 #include <ctime>
 using namespace std;
 
 void game(int x, int k, int p);
 
 int main ()
 {
cout<<"\t \tВАС ПРИВЕТСТВУЕТ ИГРА УГАДАЙ ЧИСЛО!\t \t"<<endl<<endl;
    int l;
    cout<<"Выберите уровень сложности (Easy-1; Medium-2; Hard-3;): ";
    cin>>l;
    if (l==1)
    {
        game(rand()%(101), 7, 100);
        return 0;
    }
    if (l==2)
    {
game(rand()%(501), 10, 500);
return 0;
    }
    if (l==3)
    {
game(rand()%(1001), 11, 1000);
return 0;
    }
}
void game(int x, int k, int p)
   {
  cout<<"Начнём: я загадал число от 0 до "<<p<<". Твоя задача угадать его: ";
      srand( time(0) );
      for (int i=0; i<k; i++) {

  cin>>k;
 
         if (k>x) {cout<<"Ты не угадал! Твое число больше загаданого!";cout<<endl;}
   
         if (k<x) {cout<<"Ты не угадал! Твое число меньше загаданого!";cout<<endl;}
   
         if (k==x) {cout<<"Молодец! Ты угадал! Поэтому ты получаешь конфетку:"; cout<<endl;
         
         cout<<"0                                       0"; cout<<endl;
         cout<<"0 0                                   0 0"; cout<<endl;
         cout<<"0  0   0 0 0 0 0 0 0 0 0 0 0 0 0 0   0  0"; cout<<endl;
         cout<<"0   0  0                         0  0   0"; cout<<endl;
         cout<<"0    0 0                         0 0    0"; cout<<endl;
         cout<<"0     00                         00     0"; cout<<endl;
         cout<<"0    0 0                         0 0    0"; cout<<endl;
         cout<<"0   0  0                         0  0   0"; cout<<endl;
         cout<<"0  0   0 0 0 0 0 0 0 0 0 0 0 0 0 0   0  0"; cout<<endl;
         cout<<"0 0                                   0 0"; cout<<endl;
         cout<<"0                                       0"; cout<<endl;
         return;
         }
     }
cout<<endl;
cout<<"  000       00     0      0   00000         000   0       0  00000   0000";
cout<<endl;
cout<<" 0         0  0    0 0  0 0   0            0   0   0     0   0       0  0";
cout<<endl;
cout<<" 0        0    0   0  00  0   00000        0   0    0   0    00000   000";
cout<<endl;
cout<<" 0  00    000000   0      0   0            0   0     0 0     0       0  0";
cout<<endl;
cout<<"  000     0    0   0      0   00000         000       0      00000   0    0";
cout<<endl;
cout<<endl;
return;
   }
P. S. как всё таки сделать нормальное подключение к файлу в зависимости от уровня?
« Последнее редактирование: 14 Января 2015, 20:21:47 от Гриб_под_зонтом »
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 18.04 LTS with GNOME 3.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Лабиринт на с++
« Ответ #62 : 14 Января 2015, 20:22:48 »
Гриб_под_зонтом, перейдём к крестикам ноликам. Потом напишу подробнее.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Лабиринт на с++
« Ответ #63 : 14 Января 2015, 20:23:14 »
alsoijw,
Хорошо. С чего начнём?
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 18.04 LTS with GNOME 3.

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Лабиринт на с++
« Ответ #64 : 20 Февраля 2015, 22:52:40 »
Переделал лаб, доделал автопрохождение:
Код: (cpp) [Выделить]
#include <iostream>
#include <fstream> 
#include <cstdio> 
#include "/home/user/Исходники/C++/universal.h"
#include <unistd.h>
#include <termios.h>
#include <sys/select.h>
using namespace std;
     
     const int nado_sobrat=4; // всего вишней в лабиринте
     int sobrano_vishney;
     int sobrano[nado_sobrat]; // какие вишни собраны
     int vishnia_x[4] = {4,10,14,22};
     int vishnia_y[4] = {10,1,11,18};
     int x = 1, y = 1; // начальная позиция в лабиринте
     int d = 22, s = 1; // координаты двери
     
     enum direction {Left, Up, Right, Down};
     
     direction w = Down;
     
     int a[25][20] =   {{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,},
                        {1,2,1,0,0,1,0,1,0,0,0,1,1,1,1,0,0,0,0,1,},
                        {1,0,1,1,0,1,0,1,0,1,0,0,0,0,1,0,1,1,0,1,},
                        {1,0,0,0,0,0,0,1,0,1,1,1,1,0,1,0,0,1,0,1,},
                        {1,1,1,1,1,1,0,1,0,1,4,0,1,0,1,1,0,1,0,1,},
                        {1,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,1,},
                        {1,0,1,1,0,1,1,1,1,1,0,0,1,0,1,1,1,1,0,1,},
                        {1,0,0,0,0,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,},
                        {1,1,1,1,1,1,0,1,1,1,0,0,0,0,1,0,1,1,1,1,},
                        {1,1,0,0,0,1,0,0,1,1,0,1,1,1,1,0,0,0,0,1,},
                        {1,4,0,1,0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,1,},
                        {1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,1,},
                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,},
                        {1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,},
                        {1,0,1,0,0,0,0,0,0,0,1,4,0,0,0,0,1,1,0,1,},
                        {1,0,1,1,1,1,1,0,1,0,1,1,1,0,1,0,0,0,0,1,},
                        {1,0,1,0,0,0,1,0,1,0,0,0,1,1,1,1,1,1,1,1,},
                        {1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,},
                        {1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,0,1,},
                        {1,1,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,},
                        {1,0,1,0,1,0,0,0,1,0,1,1,1,1,1,1,0,1,0,1,},
                        {1,0,0,0,1,1,1,1,1,0,0,0,1,0,1,0,0,1,0,1,},
                        {1,1,1,0,0,0,0,0,1,1,1,0,0,0,1,0,1,1,4,1,},
                        {1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,},
                        {1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,}}; //игровое поле
   
    void print_a() // выводим полезную информацию и лабиринт на экран
    {
for (int i=0; i<24; i++)
{
    for (int m=0; m<20; m++)
    {
if (i==22 && m==1 && a[i][m] != 0) cout<<"--";
else
{
        if (a[i][m]==1) cout<<"░░";
    }
    if (a[i][m]==0 || a[i][m]==3) cout<<"  ";
    if (a[i][m]==2) cout<<"╠╣";
    if (a[i][m]==4) cout<<"••";    
    if (a[i][m]==6) cout<<"::";
    }
    cout<<endl;
    }
    cout<<"Собрано вишен: "<<sobrano_vishney<<"/4"<<endl;
    if (sobrano_vishney==nado_sobrat) cout<<"Дверь открыта"<<endl;
    // если собрали все вишни сообщаем, что дверь открыта
    }
    bool try_left()
    {
     switch (w)
     {
      case Left : if (a[x+1][y] != 1) { x++; w = Down; return true; } break;
      case Up : if (a[x][y-1] != 1) { y--; w = Left; return true; } break;
      case Right : if (a[x-1][y] != 1) { x--; w = Up; return true; } break;
      case Down : if (a[x][y+1] != 1) { y++; w = Right; return true; } break;
}
return false;
    }
    bool try_forward()
    {
     switch (w)
     {
      case Left : if (a[x][y-1] != 1) { y--; w = Left; return true; } break;
      case Up : if (a[x-1][y] != 1) { x--; w = Up; return true; } break;
      case Right : if (a[x][y+1] != 1) { y++; w = Right; return true; } break;
      case Down : if (a[x+1][y] != 1) { x++; w = Down; return true; } break;
}
return false;
}
bool try_right()
{
     switch (w)
     {
      case Left : if (a[x-1][y] != 1) { x--; w = Up; return true; } break;
      case Up : if (a[x][y+1] != 1) { y++; w = Right; return true; } break;
      case Right : if (a[x+1][y] != 1) { x++; w = Down; return true; } break;
      case Down : if (a[x][y-1] != 1) { y--; w = Left; return true; } break;
}
return false;
}
bool try_back()
{
switch (w)
     {
      case Left : if (a[x][y+1] != 1) { y++; w = Right; return true; } break;
      case Up : if (a[x+1][y] != 1) { x++; w = Down; return true; } break;
      case Right : if (a[x][y-1] != 1) { y--; w = Left; return true; } break;
      case Down : if (a[x-1][y] != 1) { x--; w = Up; return true; } break;
}
return false;
}
    bool motion_auto()
    {

a[x][y] = 6;

     if (try_left()==false)
     {
      if (try_forward()==false)
      {
       if (try_right()==false) 
       {
    try_back();   
   }
  }
     }
     
     if (a[x][y]==3) return true;
     
     a[x][y] = 2;
     
     return false;
    }
void motion()
{


    char m;
    m = getch();
   
a[x][y] = 0;
       
    switch (m)
    {
case  65 :
    case 'w' :  x--;  break;
    case  66 :
    case 's' :  x++; break;    // обрабатываем ход
    case  68 :
    case 'a' :  y--; break;
    case  67 :
    case 'd' :  y++; break;
}
if (a[x][y]==0 || a[x][y]==3 || a[x][y]==4 || a[x][y]==6) a[x][y] = 2;
else   // а если стенка ?
{
switch (m)
    {
case  65 :
    case 'w' : x++; break;
    case  66 :
    case 's' : x--; break;   // возвращаем всё как было
    case  68 :    
    case 'a' : y++; break;
    case  67 :
    case 'd' : y--; break;
}
a[x][y] = 2;
   }
     }
    int main()
    {
int re;   
cout<<"Выберите режим (1-прохождение, 2-играть) ";
cin>>re;
clear_scr();

for (;;)   // основной цикл игры
{
     if (sobrano_vishney==nado_sobrat) a[d][s] = 0;
     // собрали все вишни? откроем дверь
     
   for (int i=0; i<nado_sobrat; i++)
   {
   if (sobrano[i]!=1)   // что бы 1 вишню не брали 2 раза
   
   if (x==vishnia_x[i] && y==vishnia_y[i]) 
   {
   sobrano_vishney++; sobrano[i]=1; // подобрали вишню
  } 
   }     
   
   
   if (re==2)
   {
   if (a[x][y]==3) break;
   
   print_a();
   
   motion();
   
   clear_scr();
   }
   
   if (re==1)
   {
   print_a();
     
      if (motion_auto()==true) { cout << "Ready" << endl; break; }
     
      getch();
     
      clear_scr();          
   }    
    }
       print_a();
   
   if (re==2) cout << endl << "Ты выиграл!" << endl;
   
   return 0;
   
  }
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 18.04 LTS with GNOME 3.

 

Страница сгенерирована за 0.056 секунд. Запросов: 25.