Console roguelike í C++

Console roguelike í C++

Inngangur

"Linux er ekki fyrir leiki!" - gamaldags setning: nú eru margir dásamlegir leikir sérstaklega fyrir þetta frábæra kerfi. En samt, stundum langar manni í eitthvað sérstakt sem myndi henta manni... Og ég ákvað að búa til þennan sérstaka hlut.

Grundvöllur

Ég mun ekki sýna og segja allan kóðann (hann er ekki mjög áhugaverður) - bara aðalatriðin.

1.Persóna

Allar persónubreytur eru skráðar hér (heilsa, herklæði, reynsla osfrv.) Áhugavert er teikning og hreyfistefna (sem er ekki tiltækt eins og er).

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.Stjórn

Hvernig á að færa persónuna er þegar ljóst (x—++, y—++). En lyklaborðsvinnslan er áhugaverðari:

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

Allt sem er eftir er að stilla „stýringarstafina“. Þú getur gert það með því að nota rofa, en ég hata það.

switch(...) case .. : ... ; break betra svona

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

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

Fegurð! Lykkjuaðgerðir og hlaupið um skjáinn! En einhvern veginn er það svolítið harkalegt... Og bendillinn blikkar, og stafirnir... Við reddum því!

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

Vá! Eitt prósent er tilbúið!

3.Heimurinn í kringum okkur

Hér búum við til fylki fyrir x, y stykki af heiminum og stykkin sjálf (char o[N]), Sama fyrir skrímsli og bónusa.

Búðu til aðgerð world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) í líkingu við hero(), en með breytum og auka lykkju til að gefa út fylkið... til gamans teiknum við aðeins í sjónsviðinu (vis) (if (ox[k] < vis && oy[k]....))

Nú fyllum við skjáinn af ögnum heimsins með því að nota einfalt fyrir og málsmeðferð hol út herbergi og göngum, á sama tíma förum við inn í óvini og hluti, fyrir algjört tilviljun sem við gleymum ekki. 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.Samskipti

Nú þurfum við einhvern veginn að forðast að fara í gegnum veggi og skrímsli og fá bónusa frá hlutum.

Uppáhaldið okkar er fyrir og #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.Valmynd

Við birtum einfaldlega valmyndina, númerum atriðin og notum getkey() til að vinna úr vali leikmannsins. Við skrifum stöðustiku persónunnar, innleiðum jöfnunarvalmyndina, skrifum baksöguna og við fáum það sem ég kallaði „Unlag“.

Ályktun

Þetta er eitthvað svona. Þú getur spilað það að hafa hlaðið niður, pakka niður og keyra svona:

$ sudo chmod +x Subsoil-1.0/Subsoil

$ Subsoil-1.0/Subsoil

, eða, loksins innblástur, skrifaðu þér ævintýri sem þú vilt. Ég vara þig fyrirfram: leikurinn minn er ekki auðveldur!

Tenglar

Verklagskynslóð, Hvatningarmaður.

Heimild: www.habr.com

Bæta við athugasemd