Konsola e ngjashme me mashtruesit në C++

Konsola e ngjashme me mashtruesit në C++

Paraqitje

"Linux nuk është për lojëra!" - një frazë e vjetëruar: tani ka shumë lojëra të mrekullueshme posaçërisht për këtë sistem të mrekullueshëm. Por megjithatë, ndonjëherë ju dëshironi diçka të veçantë që do t'ju përshtatej... Dhe vendosa të krijoj këtë gjë të veçantë.

themel

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

1.Karakteri

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

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

Si të lëvizni karakterin tashmë është e qartë (x—++, y—++). Por përpunimi i tastierës është më interesant:

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

E tëra që mbetet është të vendosni "karakteret e kontrollit". Mund ta bësh duke përdorur çelësin, por e urrej.

switch(...) case .. : ... ; break më mirë si kjo

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

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

Bukuroshja! Loop funksionet dhe vraponi rreth ekranit! Por disi është pak e ashpër... Dhe kursori pulson, dhe shkronjat... Do ta rregullojmë!

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

Uau! Një për qind është gati!

3. Bota rreth nesh

Këtu bëjmë vargje për x, y pjesë të botës dhe vetë pjesët (char o[N]), e njëjta gjë për përbindëshat dhe shpërblimet.

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 daljen e grupit... për argëtim, vizatojmë vetëm në fushën e shikimit (vis) (if (ox[k] < vis && oy[k]....))

Tani e mbushim ekranin me grimca të botës duke përdorur dhoma dhe pasazhe të thjeshta dhe procedurale të zbrazëta, në të njëjtën kohë futemi në armiq dhe objekte, për një rastësi të plotë që 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 monstra dhe të marrim shpërblime nga artikujt.

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.Menyja

Ne thjesht shfaqim menunë, duke numëruar artikujt dhe përdorim getkey() për të përpunuar zgjedhjen e lojtarit. Ne shkruajmë shiritin e statusit të personazhit, zbatojmë menunë e nivelimit, shkruajmë prapaskenat dhe marrim atë që unë e quajta "Subtoil".

Përfundim

Kjo është diçka e tillë. Mund ta luani pasi të keni shkarkuar, duke e shpaketuar dhe duke ecur si kjo:

$ sudo chmod +x Subsoil-1.0/Subsoil

$ Subsoil-1.0/Subsoil

, ose, në fund të frymëzuar, shkruani vetes një aventurë sipas dëshirës tuaj. Ju paralajmëroj paraprakisht: loja ime nuk është e lehtë!

Lidhjet

Gjenerimi procedural, Inkurajues.

Burimi: www.habr.com

Shto një koment