Konsola e ngjashme me mashtruesit në C++

Konsola e ngjashme me mashtruesit në C++

Paraqitje

"Linux nuk është për lojëra!" është një shprehje e vjetëruar: tani ka shumë lojëra të mrekullueshme të projektuara posaçërisht për këtë sistem të mrekullueshëm. Por ndonjëherë, dëshiron diçka të veçantë, diçka që është tamam për ty... Dhe vendosa ta krijoj atë diçka të veçantë.

themel

Nuk do t'ju tregoj dhe tregoj të gjithë kodin (nuk është shumë interesant) - vetëm pikat kryesore.

1. Personazhi

Të gjithë parametrat e personazheve (shëndeti, forca të blinduara, përvoja, etj.) janë renditur këtu. Me interes janë vizatimi dhe drejtimi i lëvizjes (i cili aktualisht mungon).

int x = 5, y = 5;
    hp = 100,
    maxhp = 100,
    dm    = 20,
    armor = 0,
    xp    = 0,
    level = 0,
    diff  = 10, // сложность
    pos   = 0; // направление

bool reg = 0,
       Mdm = 0, // бонусы
       ght = 0;

string color; // цвет будет использован в качестве индикатора состаяния героя

void hero()  // здесь происходит перемещение героя на координаты (x ; y)
{
  cout << "e[u " << "e[0;0H"; // восстановление позиции курсора, затирание пробелом
  for (int i = 0; i <= x; i++)
    cout << RIGHT;              // макрос "e[1C"
  for (int i = 0; i <= y; i++)
    cout << DOWN;             // макрос "e[1B"
  cout << "e[s" << color << "╬"; // сохранение позиции курсора
}

2. Menaxhimi

Mënyra e zhvendosjes së një karakteri është tashmë e qartë (x-++, y-++). Por trajtimi i tastierës është më interesant:

char key;
char getkey()
{
  system("stty raw");
  key = getchar();
  system("stty cooked");
  return key;
}

E tëra çfarë mbetet është të caktohen "karakteret e kontrollit". Kjo mund të bëhet me çelësin, por unë e urrej.

switch(...) case .. : ... ; break Më mirë kështu

#define KEY if (key ==
#define I ){
#define J ;}else

void keys()
{
  getkey();
    KEY 'a' I x-- ; pos = 1 J
    KEY......
}

Bukur! Po i përsërisim funksionet dhe po lëvizim nëpër ekran! Por është paksa e çrregullt... Kursori vazhdon të dridhet, dhe kështu bëjnë edhe shkronjat... Do ta rregullojmë këtë!

//До цикла
  cout << "e[?25l"; //отключаем отображение курсора
  system("stty -echo"); //отключаем эхо-ввод
  system("xset r rate 120 10"); // изменяем задержку на более плавную
//После цикла
//-------Return_normal_system_settings--------
  cout << "e[00m";
  system("reset");
  system("xset r rate 200 20");

Uf! Një përqind gati!

3. Bota përreth nesh

Këtu krijojmë vargje për x, y pjesë të botës dhe vetë pjesët. (char o[N]), e njëjta gjë vlen edhe për përbindëshat dhe bonuset.

Krijo një funksion world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) në analogji me hero(), por me parametra dhe një lak shtesë për nxjerrjen e vargut... për argëtim, ne vizatojmë vetëm në fushën e pamjes (vis) (if (ox[k] < vis && oy[k]....))

Tani e mbushim ekranin me grimca të botës duke përdorur një mënyrë të thjeshtë për të zbrazët dhe procedurale dhoma dhe pasazhe, në të njëjtën kohë hyjmë në armiq dhe objekte, për rastësi të plotë nuk harrojmë srand(time(NULL));

//------------------GENERATION---------------
void rooms()
{
  for (int i = 0; i <= 50; i++)
  {
    px[i] = rand() % 115 + 2;
    py[i] = rand() % 34 + 2;
    pl[i] = rand() % 5 + 5;
    ph[i] = rand() % 5 +  5;

    if (px[i] + pl[i] > 117) px[i] = 50 - pl[i] / 2; else
    if (px[i] < 2)           px[i] = 50 - pl[i] / 2; else
    if (py[i] < 1)           py[i] = 15 - ph[i] / 2; else
    if (py[i] + ph[i] > 37)  py[i] = 15 - ph[i] / 2;

    for (int j = 0; j <= i; j++)
    {
      while (px[i] > px[j] && px[i] < px[j] + pl[j])
        (px[i]+pl[i]/2 >= 55) ? px[i]++ : px[i]-- ;

      while (py[i] > py[j] && py[i] < py[j] + ph[j])
        (py[i]+ph[i]/2 >= 18) ? py[i]++ : py[i]-- ;

      while (px[i]+pl[i] > px[j] && px[i]+pl[i] < px[j] + pl[j])
        (px[i]+pl[i]/2 >= 55) ? px[i]++ : px[i]-- ;

      while (py[i]+ph[i] > py[j] && py[i]+ph[i] < py[j] + ph[j])
        (py[i]+ph[i]/2 >= 18) ? py[i]++ : py[i]-- ;
    }

    for (int j = 0; j <= i; j++)
    {
      while (px[j] + pl[j] >= 116) px[j]-- ;
      while (px[j] < 2)            px[j]++ ;
      while (py[j] < 1)            py[j]++ ;
      while (py[j] + ph[j] >= 37)  py[j]-- ;
    }
    tx[i] = px[i]+10; ty[i] = py[i]-3;

    if (i <= diff)
    {
      ex[i]  = px[i];
      ey[i]  = py[i];
      while (ex[i] < 10){ ex[i]++ ; epos[i] = 3 ;}
      while (ey[i] < 10){ ey[i]++ ; epos[i] = 1 ;}
      e[i]   = evar[pl[i]];
      ecolor[i] = "e[00me[31m";

      edm[i] = edmvar[pl[i]];
      ehp[i] = ehpvar[pl[i]];
      exp[i] = expvar[pl[i]];
    }
    rect(px[i], py[i], pl[i], ph[i]);
  }
}

void corrs()
{
  int pc, px, py;
  for (int i = 0; i <= 4; i++)
  {
    if (i < 2){
      px = 3;
      py = rand() % 33 + 3;
      pc = 110;
      line(px, py, pc, true);
      line(px, py+1, pc, true);
    } else {
      px = rand() % 100 + 3;
      py = 3;
      pc = 33;
      line(px, py, pc, false);
      line(px+1, py, pc, false);
    }
  }
}

4. Ndërveprimi

Tani duhet të shmangim disi kalimin nëpër mure dhe përbindësha dhe të marrim bonuse nga sendet.

Të preferuarat tona janë për dhe #define

#define TOUCH if (x == ox[i] && y == oy[i] && pos ==
#define HIT   x == ex[i] && y == ey[i] && pos ==
 for (int i = 0; i <= n; i++)
  {
    if (i <= diff)
    {
     if (Mdm) ehp[i]-=2 ; // если бонус "массовый урон" включен
     epos[i] = 0;

     if (ex[i] < x+5 && ex[i] > x-5 &&
         ey[i] < y+5 && ey[i] > y-5  )
     {
       edel(i); // функция переписывающая предыдущее положение противника
       if (ex[i] < x I ex[i]++ ; epos[i] = 1 J
       if (ex[i] > x I ex[i]-- ; epos[i] = 2 J
       if (ey[i] < y I ey[i]++ ; epos[i] = 3 J
       if (ey[i] > y I ey[i]-- ; epos[i] = 4 ;}
     }
   for (int j = 0; j <= n; j++) // столкновение моба со стенками
       while (ex[i] == ox[j] && ey[i] == oy[j] || ex[i] == ex[j] && ey[i] == ey[j] && j != i)
       {
         if (epos[i] == 1) ex[i]-- ; else
         if (epos[i] == 2) ex[i]++ ; else
         if (epos[i] == 3) ey[i]-- ; else
         if (epos[i] == 4) ey[i]++ ;
       }

     if (x == ex[i] && y == ey[i]) //  "битва"
      {
       if (ehp[i] > 1)
       {
         ehp[i] -= dm;
         (edm[i] < armor) ?
         hp -= 0 :
         hp -= edm[i]-armor;
       } else {
         ex[i] = ey[i] = -1;
         xp += exp[i];
         ehp[i] = 12;
       }
     }
     if (!ght) // если не призрак проверять столкновение игрока с врагами
     {
       if (HIT 1) y++ ;else
       if (HIT 2) x-- ;else
       if (HIT 3) y-- ;else
       if (HIT 4) x++ ;
     }
    }
    if (!ght) // то же, но со стенами
    {
      TOUCH 1 I y++ J
      TOUCH 2 I x-- J
      TOUCH 3 I y-- J
      TOUCH 4 ) x++ ;
    }
  }

5. Menuja

Ne thjesht shfaqim menunë në ekran, duke numëruar artikujt dhe përpunojmë përzgjedhjen e lojtarit duke përdorur getkey(). Shkruajmë një shirit statusi të personazhit, zbatojmë një menu për nivelim, shkruajmë një histori prapaskene dhe përfundojmë me atë që e kam quajtur "Nëntokë".

Përfundim

Kjo është diçka e tillë. Mund ta luash, pasi të keni shkarkuar, duke e çpaketuar dhe duke e ekzekutuar si kjo:

$ sudo chmod +x Subsoil-1.0/Subsoil

$ Subsoil-1.0/Subsoil

, ose, më në fund i frymëzuar, shkruajini vetes një aventurë sipas dëshirës tuaj. Kini kujdes: loja ime nuk është e lehtë!

Lidhje

Gjenerimi procedural, Frymëzues.

Burimi: www.habr.com

Shto një koment