Konsole negodīgi C++ valodā

Konsole negodīgi C++ valodā

Ievads

“Linux nav paredzēts spēlēm!” - novecojusi frāze: tagad ir daudz brīnišķīgu spēļu, kas īpaši paredzētas šai brīnišķīgajai sistēmai. Bet tomēr dažreiz gribas kaut ko īpašu, kas tev piestāvētu... Un es nolēmu izveidot šo īpašo lietu.

Основа

Es nerādīšu un nepateikšu visu kodu (tas nav īpaši interesanti) - tikai galvenie punkti.

1. Raksturs

Šeit ir uzskaitīti visi rakstura parametri (veselība, bruņas, pieredze utt.) Interesanti ir zīmējums un kustības virziens (kas šobrīd nav pieejams).

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.Vadība

Kā pārvietot rakstzīmi, jau ir skaidrs (x—++, y—++). Bet tastatūras apstrāde ir interesantāka:

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

Atliek tikai iestatīt “vadības rakstzīmes”. Jūs varat to izdarīt, izmantojot slēdzi, bet es to ienīstu.

switch(...) case .. : ... ; break labāk šādi

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

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

Skaistums! Cilpa funkcijas un skrien pa ekrānu! Bet kaut kā tas ir mazliet skarbi... Un kursors mirgo, un burti... Mēs to izlabosim!

//До цикла
  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");

Oho! Viens procents ir gatavs!

3.Pasaule ap mums

Šeit mēs veidojam masīvus x, y pasaules gabaliem un pašiem gabaliem (char o[N]), tas pats par monstriem un prēmijām.

Izveidojiet funkciju world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) pēc analoģijas ar hero(), bet ar parametriem un papildus cilpu masīva izvadīšanai... prieka pēc zīmējam tikai redzes laukā (vis) (if (ox[k] < vis && oy[k]....))

Tagad mēs aizpildām ekrānu ar pasaules daļiņām, izmantojot vienkāršas un procedurāli dobas telpas un ejas, tajā pašā laikā ievadām ienaidniekus un objektus, pilnīgai nejaušībai neaizmirstam par 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.Mijiedarbība

Tagad mums kaut kā jāizvairās no šķērsošanas sienām un monstriem un jāsaņem bonusi no priekšmetiem.

Mūsu favorīti ir par un #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.Izvēlne

Mēs vienkārši parādām izvēlni, numurējot vienumus un izmantojam getkey(), lai apstrādātu spēlētāja izvēli. Mēs rakstām varoņa statusa joslu, ieviešam izlīdzināšanas izvēlni, uzrakstām aizmugures stāstu un iegūstam to, ko es saucu par “Apakšaugsni”.

Secinājums

Tas ir kaut kas līdzīgs šim. Jūs varat to spēlēt lejupielādējot, izpakojot un palaist šādi:

$ sudo chmod +x Subsoil-1.0/Subsoil

$ Subsoil-1.0/Subsoil

, vai, visbeidzot, iedvesmojoties, uzrakstiet sev piedzīvojumu, kas jums patīk. Jau iepriekš brīdinu: mana spēle nav viegla!

Saites

Procedūru ģenerēšana, Uzmundrinātājs.

Avots: www.habr.com

Pievieno komentāru