Roguelike kontsola C++-n

Roguelike kontsola C++-n

Sarrera

"Linux ez da jokoetarako!" - esaldi zaharkitua: orain joko zoragarri asko daude sistema zoragarri honetarako bereziki. Baina, hala ere, batzuetan nahi duzu komeni zaizun zerbait berezia... Eta gauza berezi hau sortzea erabaki nuen.

fundazioa

Ez dut kode osoa erakutsi eta esango (ez da oso interesgarria) - puntu nagusiak besterik ez.

1.Pertsonaia

Pertsonaien parametro guztiak zerrendatzen dira hemen (osasuna, armadura, esperientzia, etab.) Interesgarria da mugimenduaren marrazkia eta norabidea (une honetan eskuragarri ez dagoena).

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

Pertsonaia nola mugitu argi dago jada (x—++, y—++). Baina teklatuaren prozesamendua interesgarriagoa da:

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

"Kontrol karaktereak" ezartzea besterik ez da geratzen. Switch erabiliz egin dezakezu, baina gorroto dut.

switch(...) case .. : ... ; break hobe hau horrela

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

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

Edertasuna! Begizta funtzioak eta korrika pantailan zehar! Baina nolabait gogorra da... Eta kurtsorea keinu egiten du, eta hizkiak... Konpondu egingo dugu!

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

Aupa! Ehuneko bat prest dago!

3.Inguratzen gaituen mundua

Hemen matrizeak egiten ditugu x, y munduko piezak eta piezak beraiek (char o[N]), berdin munstro eta hobariak.

Sortu funtzio bat world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) -rekin analogia eginez hero(), baina parametroekin eta array-a ateratzeko begizta gehigarri batekin... dibertitzeko, ikus-eremuan soilik marrazten dugu (vis) (if (ox[k] < vis && oy[k]....))

Orain munduaren partikulaz beteko dugu pantaila gela eta pasabide sinple bat erabiliz eta prozeduraz zulotuz, aldi berean etsaiak eta objektuak sartzen ditugu, ahazten ez garen ausazkotasun osoa lortzeko. 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.Interakzioa

Orain, nolabait, hormak eta munstroak igarotzea saihestu eta elementuetatik hobariak jaso behar ditugu.

Gure gogokoenak eta #definitzen dira

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

Menua bistaratzen dugu, elementuak zenbakituz eta getkey() erabiltzen dugu jokalariaren aukera prozesatzeko. Pertsonaiaren egoera-barra idazten dugu, mailaketa menua inplementatzen dugu, atzealdea idazten dugu eta "Subsoil" deitu nuena lortzen dugu.

Ondorioa

Hau horrelako zerbait da. Joka dezakezu deskargatu izana, deskonprimitu eta honela exekutatzen:

$ sudo chmod +x Subsoil-1.0/Subsoil

$ Subsoil-1.0/Subsoil

, edo, azkenean, inspiratuta, idatzi zeure burua gustuko abentura bat. Aldez aurretik abisatzen dizut: nire jokoa ez da erraza!

Estekak

Prozedurazko sorkuntza, Animatzailea.

Iturria: www.habr.com

Gehitu iruzkin berria