I-Console roguelike ku-C++

I-Console roguelike ku-C++

Isingeniso

"I-Linux akuyona eyemidlalo!" - ibinzana eliphelelwe yisikhathi: manje kunemidlalo eminingi emangalisayo eqondiswe ngqo lolu hlelo oluhle. Kodwa noma kunjalo, ngezinye izikhathi ufuna okuthile okukhethekile okungakufanela ... Futhi nganquma ukudala le nto ekhethekile.

Isisekelo

Ngeke ngibonise futhi ngitshele yonke ikhodi (ayithakazelisi kakhulu) - amaphuzu abalulekile kuphela.

1.Umlingisi

Wonke amapharamitha omlingiswa abhalwe lapha (impilo, izikhali, isipiliyoni, njll.) Okuthakazelisa umdwebo kanye nesiqondiso sokunyakaza (okungatholakali okwamanje).

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

Indlela yokuhambisa uhlamvu isivele icacile (xβ€”++, yβ€”++). Kodwa ukucubungula ikhibhodi kuthakazelisa kakhulu:

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

Okusele nje ukusetha "izinhlamvu zokulawula". Ungakwenza usebenzisa ukushintsha, kodwa ngiyakuzonda.

switch(...) case .. : ... ; break kangcono kanje

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

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

Nobuhle! Imisebenzi ye-Loop bese ugijima esikrinini! Kodwa ngandlela-thile kulukhuni ... Futhi ikhesa ikhanya, nezinhlamvu ... Sizoyilungisa!

//Π”ΠΎ Ρ†ΠΈΠΊΠ»Π°
  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");

Hewu! Iphesenti elilodwa selilungile!

3.Izwe elisizungezile

Lapha senza amalungu afanayo ka-x, y izingcezu zomhlaba nezingcezu ngokwazo (char o[N]), okufanayo ezilo kanye namabhonasi.

Dala umsebenzi world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) ngokufanisa ne hero(), kodwa ngamapharamitha kanye neluphu eyengeziwe yokukhipha uhlu... ukuze sijabule, sidweba kuphela emkhakheni wokubuka (vis) (if (ox[k] < vis && oy[k]....))

Manje sigcwalisa isikrini ngezinhlayiya zomhlaba sisebenzisa amagumbi alula futhi angenalutho ngokwenqubo, ngesikhathi esifanayo sifaka izitha nezinto, ngokungahleliwe okuphelele esingakhohlwa ngakho. 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.Ukusebenzelana

Manje sidinga ngandlela thile ukugwema ukudlula ezindongeni nasezilo futhi sithole amabhonasi ezintweni.

Izintandokazi zethu ezethu futhi #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.Imenyu

Simane sibonise imenyu, sibale izinto, futhi sisebenzise i-getkey() ukucubungula ukukhetha komdlali. Sibhala umudwa wesimo somlingiswa, sebenzisa imenyu yokukala, sibhala i-backstory, futhi sithola lokho engikubiza ngokuthi β€œI-Subsoil”.

isiphetho

Lena into efana nale. Ungakwazi ukuyidlala ngemva kokulanda, ukuqaqa nokugijima kanje:

$ sudo chmod +x Subsoil-1.0/Subsoil

$ Subsoil-1.0/Subsoil

, noma, ekugcineni uphefumulelwe, zibhalele uhambo oluthandayo. Ngiyakuxwayisa kusengaphambili: umdlalo wami awulula!

Izixhumanisi

Ukukhiqizwa kwenqubo, Umkhuthazi.

Source: www.habr.com

Engeza amazwana