Konzol roguelike C++ nyelven

Konzol roguelike C++ nyelven

Bevezetés

„A Linux nem játékra való!” – ez egy elavult mondás: ma már rengeteg csodálatos játék létezik, amelyeket kifejezetten erre a csodálatos rendszerre terveztek. De néha valami különlegesre vágysz, valamire, ami pont neked való... És én úgy döntöttem, hogy megalkotom ezt a különlegeset.

Основа

Nem fogom megmutatni és elmondani az összes kódot (nem túl érdekes) - csak a lényeget.

1. Karakter

Az összes karakterparaméter (életerő, páncél, tapasztalat stb.) itt van felsorolva. Érdekes a rajz és a mozgásirány (ami jelenleg hiányzik).

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

A karakterek mozgatása már világos (x-++, y-++). De a billentyűzet kezelése érdekesebb:

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

Már csak a „vezérlő karakterek” beállítása van hátra. Ezt meg lehet tenni a kapcsolóval, de utálom.

switch(...) case .. : ... ; break Jobb így

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

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

Gyönyörű! Függvényeket ismételgetünk és görgetünk a képernyőn! De kicsit rángatózik... A kurzor folyamatosan villog, és a betűk is... Megjavítjuk!

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

Fú! Egy százalék kész!

3. A körülöttünk lévő világ

Itt tömböket készítünk a világ x és y darabjaihoz, valamint magukhoz a darabokhoz. (char o[N]), ugyanez vonatkozik a szörnyekre és a bónuszokra.

Függvény létrehozása world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) -vel analógiával hero(), de paraméterekkel és egy további ciklussal a tömb kimenetéhez... szórakozásból csak a látómezőbe (vis) rajzolunk (if (ox[k] < vis && oy[k]....))

Most egy egyszerű módszerrel töltjük meg a képernyőt a világ részecskéivel, és eljárásilag üregesítjük ki a szobákat és átjárókat, ugyanakkor belépünk ellenségekbe és tárgyakba, a teljes véletlenszerűség kedvéért nem feledkezünk meg róla 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. Interakció

Most valahogy el kell kerülnünk a falakon és szörnyeken való áthaladást, és bónuszokat kell szereznünk a tárgyakért.

A kedvenceink a következők: és #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. Menü

Egyszerűen megjelenítjük a menüt a képernyőn, megszámozzuk az elemeket, és a getkey() segítségével feldolgozzuk a játékos kiválasztását. Írunk egy karakter állapotsort, megvalósítunk egy szintlépéses menüt, megírunk egy háttértörténetet, és végül megkapjuk azt, amit én "Altalajnak" neveztem el.

Következtetés

Ez valami ilyesmi. Játszhatsz vele, letöltött, kicsomagolás és futtatás így:

$ sudo chmod +x Subsoil-1.0/Subsoil

$ Subsoil-1.0/Subsoil

, vagy ha végre ihletet kapsz, írj magadnak egy kedvedre való kalandot. Vigyázat: a játékom nem könnyű!

Linkek

Eljárási generálás, Inspiráló.

Forrás: will.com

Hozzászólás