Konsol roguelike an C++

Konsol roguelike an C++

Aféierung

"Linux ass net fir Spiller!" - en alen Ausdrock: elo ginn et vill wonnerbar Spiller speziell fir dëse wonnerschéine System. Awer trotzdem, heiansdo wëllt Dir eppes Besonnesches wat Iech passt ... An ech hunn decidéiert dës speziell Saach ze kreéieren.

Basis

Ech wäert de ganze Code net weisen an soen (et ass net ganz interessant) - just d'Haaptpunkte.

1. Charakter

All Charakter Parameteren sinn hei opgezielt (Gesondheet, Rüstung, Erfahrung, etc.) Interessi ass d'Zeechnen an Richtung vun Bewegung (déi am Moment net disponibel ass).

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

Wéi een de Charakter beweegt ass scho kloer (x—++, y—++). Awer d'Tastaturveraarbechtung ass méi interessant:

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

Alles wat bleift ass d'"Kontrollfiguren" ze setzen. Dir kënnt et mat Schalter maachen, awer ech haassen et.

switch(...) case .. : ... ; break besser esou

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

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

Schéinheet! Loop Funktiounen a lafen ronderëm den Ecran! Awer iergendwéi ass et e bëssen haart ... An de Cursor blénkt, an d'Bréiwer ... Mir fixéieren et!

//До цикла
  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! Ee Prozent ass prett!

3.D'Welt ronderëm eis

Hei maache mir Arrays fir x, y Stécker vun der Welt an d'Stécker selwer (char o[N]), selwecht fir Monsteren an Bonus.

Schafen eng Funktioun world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) duerch Analogie mat hero(), awer mat Parameteren an eng zousätzlech Loop fir d'Array auszeginn ... fir Spaass zeechnen mir nëmmen am Gesiichtsfeld (vis) (if (ox[k] < vis && oy[k]....))

Elo fëllen mir den Écran mat Partikelen vun der Welt mat engem einfache fir a prozedural huel Zëmmeren a Passagen, gläichzäiteg gi mir Feinden an Objeten, fir komplett Zoufällegkeet vergiessen mir net 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.Interaktioun

Elo musse mir iergendwéi vermeiden duerch Maueren a Monsteren ze passéieren a Bonus vu Saachen ze kréien.

Eis Favoritten si fir an #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. Menu

Mir weisen einfach de Menü, nummeréieren d'Elementer a benotzen getkey () fir de Choix vum Spiller ze veraarbecht. Mir schreiwen d'Statusbar vum Charakter, implementéieren den Niveaumenü, schreiwen d'Backstory, a mir kréien wat ech "Subsoil" genannt hunn.

Konklusioun

Dëst ass eppes wéi dëst. Dir kënnt et spillen eroflueden, auspacken a lafen esou:

$ sudo chmod +x Subsoil-1.0/Subsoil

$ Subsoil-1.0/Subsoil

, oder, schlussendlech inspiréiert, schreift Iech selwer eng Aventure vun Ärem Wënsch. Ech warnen Iech am Viraus: mäi Spill ass net einfach!

Linken

Prozedural Generatioun, Encouragéieren.

Source: will.com

Setzt e Commentaire