Rogalik konsolë në C++

Rogalik konsolë në C++

Hyrje

«Linux nuk është për lojra!» — një shprehje e vjetruar: tani ka shumë lojra të mrekullueshme të krijuara posaçërisht për këtë sistem të mrekullueshëm. Por ndonjëherë, dëshiron diçka të veçantë, që do t'i përshtatej pikërisht ty… Kështu që vendosa të krijoj këtë të veçantë.

Themel

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

1. Personazhi

Këtu janë të gjithë parametrat e personazhit (shëndeti, mbrojtja, përvoja etj) interesante është përmirësimi dhe drejtimi (të cilat aktualisht nuk ekzistojnë).

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, // bonuse
       ght = 0;

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

void hero() // këtu ndodh lëvizja e heroit në koordinatat (x ; y)
{
  cout << "e[u " << "e[0;0H"; // rikuperimi i pozitës së 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 pozitës së kursorit
}

2. Kontrolli

Si të lëvizësh personazhin është e qartë (x—++, y—++). Por trajtimi i tastierës është më interesante:

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

Kështu që mbetet vetëm të caktosh «simbolet kontrolluese». Mund ta bësh me anë të switch-it, 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! Mbylle funksionet dhe vrapo mbi ekran! Por është disi e ashpër… Edhe kursorin po ndriçon, edhe 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");

Uf—h! Një përqind është gati!

3. Bota përreth

Këtu krijojmë array për x, y copat e botës dhe vetë copat (char o[N]), e njëjta për monstret dhe bonuset.

Krijojmë funksionin world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) sipër hero(), por me parametra dhe një cikël shtesë për daljen e array-it… për interes ne vizatojmë vetëm në fushën e shikimit (vis) (if (ox[k] < vis && oy[k]....))

Tani po mbushim ekranin me copa të botës nëpërmjet një for të thjeshtë dhe procedurorisht po krijojmë dhoma dhe kalime, po ashtu përfshijmë armiq dhe objekte, për të siguruar rastësirën nuk harrojmë për 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 interaccióni

Tani na nevojitet diçka për të mos kaluar përmes mureve dhe monsterëve, për të marrë bonuse nga objektet.

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

Menuja thjesht e nxjerrim në ekran, numërojmë pikat, me anë të getkey() përpunojmë zgjedhjen e lojtarit. Shkruajmë status-bar të personazhit, realizojmë menu për përmirësim, shkruajmë historikun, dhe marrim atë që e quajta «Subsoil»(«Nën Tokë»).

Përfundimi

Kështu që është diçka. Mund të luani me të, duke e shkarkuar, duke e zbuluar dhe duke e drejtuar kështu:

$ sudo chmod +x Subsoil-1.0/Subsoil

$ Subsoil-1.0/Subsoil

, ose me entuziazëm, të shkruani një aventurë sipas dëshirës tuaj. Paraprakisht paralajmëroj: loja ime nuk është e lehtë!

Lidhjet

Generimi proceduror, Inspirtatori.

Burimi: habr.com

Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS 🔥 Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS | ProHoster