Konsolë Rogalik në C++

Konsolë Rogalik në C++

Hyrje

„Linux nuk është për lojëra!” — një frazë e vjetruar: tani ka shumë lojëra të shkëlqyera të krijuara posaçërisht për këtë sistem të mahnitshëm. Por megjithatë, ndonjëherë, dëshiron diçka të veçantë, që do të përshtatej pikërisht për ty... Dhe vendosa ta krijoj këtë të veçantë.

Baza

Nuk do të tregoj dhe të shpjegoja të gjithë kodin (nuk është shumë interesante) — vetëm piketat kryesore.

1.Personazhi

Këtu janë të listuara të gjitha parametrat e personazhit (shëndeti, mbrojtja, përvoja etj.) që ka interes është përshkrimi dhe drejtimi i lëvizjes (të cilin nuk e kemi aktualisht).

int x = 5, y = 5;
    hp = 100,
    maxhp = 100,
    dm    = 20,
    armor = 0,
    xp    = 0,
    level = 0,
    diff  = 10, // vështirësia
    pos   = 0; // drejtimi

bool reg = 0,
       Mdm = 0, // bonuset
       ght = 0;

string color; // ngjyra do të përdoret si indikator i gjendjes së heroit

void hero() // këtu ndodhet lëvizja e heroit në koordinatat (x ; y)
{
  cout << "e[u " << "e[0;0H"; // rikthimi i pozicionit të kursorit, fshirja me hapësirë
  for (int i = 0; i <= x; i++)
    cout << RIGHT; // makro "e[1C"
  for (int i = 0; i <= y; i++)
    cout << DOWN; // makro "e[1B"
  cout << "e[s" << color << "╬"; // ruajtja e pozicionit të kursorit
}

2.Shtyrja

Si të lëvizni personazhin është e qartë (x—++, y—++). Por përpunimi i tastierës është më interesant:

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

Vetëm duhet të caktosh "simbolet e kontrollit". Mund ta bësh me switch, por unë e urrej atë.

switch(...) case .. : ... ; break më mirë kështu

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

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

Bukuri! Po i mbyllim funksionet dhe vrapojmë përmes ekranit! Por duket pak e papërshtatshme… Dhe kursori pulson, dhe shkronjat… Do ta rregullojmë!

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

Ahh! Një përqind është gati!

3.Bota përreth

Këtu krijojmë array për x, y copëza të botës dhe vetë copëzat (char o[N]), ashtu si për monstrujtë dhe bonuset.

Krijojmë funksionin world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) me analogji me hero(), por me parametra dhe ciklin shtesë për të renditur array… për interes, çizojmë vetëm në fushën e shikimit (vis) (if (ox[k] < vis && oy[k]....))

Tani po mbushim ekranin me copëza të botës nëpërmjet një for të thjeshtë dhe procedurës themelore për të nxjerrë dhoma dhe kalime, përveç kësaj përshtatëm armiqtë dhe sendet, dhe për të siguruar rastësinë e plotë mos e harro 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.Ndërveprimi

Tani na nevojitet ndonjë mënyrë për të mos kaluar përmes mureve dhe monstrujve, të marrim bonuse nga sendet.

Të preferuarat tona for dhe #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.Meni

Menun e shfaqim thjesht në ekran, duke numëruar pikët, me ndihmën e getkey() përpunojmë zgjedhjen e lojtarit. Shkruajmë status-barin e karakterit, realizojmë menunë e përmirësimeve, shkruajmë historinë e prapambetjes dhe marrim atë që e quajta «Subsoil» («Nëntokë»).

Përfundim

Kjo është një gjë e tillë. Mund të luani në të, duke e shkarkuar, duke e çarë dhe duke e nisur kështu:

$ sudo chmod +x Subsoil-1.0/Subsoil

$ Subsoil-1.0/Subsoil

, ose, përfundimisht, duke u frymëzuar, të shkruani një aventurë sipas dëshirës suaj. E paralajmëroj me kohë: loja ime nuk është e lehtë!

Lidhjet

Generimi procedurial, Frymëmarrësi.

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster