Konsoli roguelike C++:ssa

Konsoli roguelike C++:ssa

Esittely

"Linux ei ole peleihin!" - vanhentunut lause: nyt on monia upeita pelejä erityisesti tätä upeaa järjestelmää varten. Mutta silti, joskus haluat jotain erityistä, joka sopisi sinulle... Ja päätin luoda tämän erikoisen.

Основа

En näytä ja kerro koko koodia (se ei ole kovin mielenkiintoista) - vain pääkohdat.

1.Hahmo

Kaikki hahmoparametrit on lueteltu tässä (terveys, panssari, kokemus jne.) Kiinnostava on piirustus ja liikesuunta (joita ei ole tällä hetkellä saatavilla).

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

Hahmon siirtäminen on jo selvä (x—++, y—++). Mutta näppäimistön käsittely on mielenkiintoisempaa:

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

Jäljelle jää vain "ohjausmerkit" asettaminen. Voit tehdä sen kytkimellä, mutta vihaan sitä.

switch(...) case .. : ... ; break parempi näin

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

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

Kauneus! Tee silmukkatoimintoja ja juokse näytön ympäri! Mutta jotenkin se on vähän ankara... Ja kohdistin vilkkuu, ja kirjaimet... Korjaamme sen!

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

Vau! Yksi prosentti on valmis!

3. Maailma ympärillämme

Täällä teemme taulukoita x, y maailman palasille ja itse kappaleille (char o[N]), sama koskee hirviöitä ja bonuksia.

Luo funktio world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) analogisesti kanssa hero(), mutta parametreilla ja lisäsilmukalla taulukon tulostamista varten... huvin vuoksi piirrämme vain näkökentässä (vis) (if (ox[k] < vis && oy[k]....))

Nyt täytämme näytön maailman hiukkasilla käyttämällä yksinkertaisia ​​ja menettelyllisesti onttoja huoneita ja käytäviä, samalla syötämme vihollisia ja esineitä, täydellisen satunnaisuuden vuoksi emme unohda 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. Vuorovaikutus

Nyt meidän on jotenkin vältettävä seinien ja hirviöiden läpikulkua ja saatava bonuksia esineistä.

Suosikkimme ovat for and #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.Valikko

Näytämme vain valikon numeroimalla kohteet ja käsittelemme pelaajan valinnan käyttämällä getkey()-komentoa. Kirjoitamme hahmon tilapalkkiin, toteutamme tasoitusvalikon, kirjoitamme taustatarinoita ja saamme sen, mitä minä kutsuin "Subsoil".

Johtopäätös

Tämä on jotain tämän kaltaista. Voit pelata sitä ladattuaan, purkaa pakkauksesta ja ajaa näin:

$ sudo chmod +x Subsoil-1.0/Subsoil

$ Subsoil-1.0/Subsoil

, tai vihdoin inspiroituneena kirjoita itsellesi mieleisesi seikkailu. Varoitan sinua etukäteen: pelini ei ole helppoa!

Linkit

Proseduurin luominen, Kannustaja.

Lähde: will.com

Lisää kommentti