Konsole roguelike nan C++

Konsole roguelike nan C++

Entwodiksyon

"Linux se pa pou jwèt!" - yon fraz demode: kounye a gen anpil jwèt bèl bagay espesyalman pou sistèm bèl bagay sa a. Men, toujou, pafwa ou vle yon bagay espesyal ki ta adapte ou ... E mwen deside kreye bagay espesyal sa a.

Baz

Mwen pa pral montre ak di tout kòd la (li pa trè enteresan) - jis pwen prensipal yo.

1.Character

Tout paramèt karaktè yo ki nan lis isit la (sante, zam, eksperyans, elatriye) Enterè se desen an ak direksyon mouvman (ki pa disponib kounye a).

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

Ki jan yo deplase karaktè a deja klè (x—++, y—++). Men, pwosesis klavye a pi enteresan:

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

Tout sa ki rete se mete "karaktè kontwòl yo". Ou ka fè li lè l sèvi avèk switch, men mwen rayi li.

switch(...) case .. : ... ; break pi bon tankou sa a

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

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

Bote! Loop fonksyon epi kouri nan ekran an! Men, yon jan kanmenm li se yon ti jan piman bouk ... Ak kurseur la flache, ak lèt ​​yo ... Nou pral ranje li!

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

Wow! Yon pousan pare!

3.Mond lan bò kote nou

Isit la nou fè etalaj pou x, y moso nan mond lan ak moso yo tèt yo (char o[N]), menm pou monstr ak bonis.

Kreye yon fonksyon world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) pa analoji ak hero(), men ak paramèt ak yon bouk adisyonèl pou pwodiksyon etalaj la ... pou plezi, nou trase sèlman nan jaden an de vi (vis) (if (ox[k] < vis && oy[k]....))

Koulye a, nou ranpli ekran an ak patikil nan mond lan lè l sèvi avèk yon senp pou ak pwosedi kre soti chanm ak pasaj, an menm tan an nou antre nan lènmi ak objè, pou owaza konplè nou pa bliye sou. 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.Entèaksyon

Koulye a, nou bezwen yon jan kanmenm evite pase nan mi yo ak monstr ak resevwa bonis nan atik yo.

Pi renmen nou yo se pou ak #defini

#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.Meni

Nou senpleman montre meni an, nimero atik yo, epi itilize getkey() pou trete chwa jwè a. Nou ekri estati karaktè a, aplike meni nivelman an, ekri istwa a, epi nou jwenn sa mwen rele "Sous-sol".

Konklizyon

Sa a se yon bagay tankou sa a. Ou ka jwe li li te telechaje, debalaj epi kouri tankou sa a:

$ sudo chmod +x Subsoil-1.0/Subsoil

$ Subsoil-1.0/Subsoil

, oswa, finalman enspire, ekri tèt ou yon avanti nan pwòp senpati ou. Mwen avèti ou davans: jwèt mwen an pa fasil!

Lyen

Pwosedi jenerasyon, Ankouraje.

Sous: www.habr.com

Add nouvo kòmantè