C++ හි console roguelike

C++ හි console roguelike

හැඳින්වීම

"ලිනක්ස් ක්‍රීඩා සඳහා නොවේ!" - යල් පැන ගිය වාක්‍ය ඛණ්ඩයක්: දැන් මෙම අපූරු පද්ධතිය සඳහා විශේෂයෙන් අපූරු ක්‍රීඩා රාශියක් ඇත. නමුත් තවමත්, සමහර විට ඔබට ඔබට ගැලපෙන විශේෂ දෙයක් අවශ්‍ය වේ ... තවද මම මෙම විශේෂ දෙය නිර්මාණය කිරීමට තීරණය කළෙමි.

පදනම් වේ

මම සම්පූර්ණ කේතය පෙන්වන්නේ නැත (එය ඉතා රසවත් නොවේ) - ප්‍රධාන කරුණු පමණි.

1.චරිතය

සියලුම අක්ෂර පරාමිතීන් මෙහි ලැයිස්තුගත කර ඇත (සෞඛ්‍යය, සන්නාහය, අත්දැකීම්, ආදිය) සිත් ඇදගන්නාසුළු වන්නේ චලනයේ ඇඳීම සහ දිශාව (දැනට ලබා ගත නොහැක).

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.කළමනාකරණය

අක්ෂරය චලනය කරන්නේ කෙසේද යන්න දැනටමත් පැහැදිලිය (x—++, y—++). නමුත් යතුරුපුවරු සැකසීම වඩාත් සිත්ගන්නා සුළුය:

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

ඉතිරිව ඇත්තේ "පාලක අක්ෂර" සැකසීමයි. ඔබට එය ස්විචය භාවිතයෙන් කළ හැකිය, නමුත් මම එයට වෛර කරමි.

switch(...) case .. : ... ; break මේ වගේ වඩා හොඳයි

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

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

අලංකාරය! ලූප් ක්‍රියාකාරකම් සහ තිරය වටා ධාවනය කරන්න! නමුත් කෙසේ හෝ එය ටිකක් දරුණුයි ... සහ කර්සරය දැල්වෙයි, සහ අකුරු ... අපි එය නිවැරදි කරන්නෙමු!

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

වාව්! සියයට එකක් සූදානම්!

3. අප අවට ලෝකය

මෙන්න අපි ලෝකයේ x, y කෑලි සහ කෑලි සඳහා අරාවන් සාදන්නෙමු (char o[N]), රාක්ෂයන් සහ බෝනස් සඳහා සමාන වේ.

කාර්යයක් සාදන්න world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) සමග සාදෘශ්‍යයෙන් hero(), නමුත් පරාමිති සහ අරාව ප්‍රතිදානය සඳහා අමතර ලූපයක් සමඟින්... විනෝදය සඳහා, අපි දර්ශන ක්ෂේත්‍රයේ පමණක් අඳින්නෙමු (vis) (if (ox[k] < vis && oy[k]....))

දැන් අපි ලෝකයේ අංශු වලින් තිරය පුරවන්නේ සරල හා ක්‍රමානුකූලව හිස් වූ කාමර සහ ඡේද භාවිතා කරමින්, ඒ සමඟම අපි සතුරන් සහ වස්තූන් ඇතුළු කරන්න, සම්පූර්ණ අහඹු බව සඳහා අපි අමතක නොකරමු. 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. අන්තර්ක්‍රියා

දැන් අපි කෙසේ හෝ බිත්ති සහ රාක්ෂයන් හරහා ගමන් කිරීමෙන් වැළකී භාණ්ඩ වලින් බෝනස් ලබා ගත යුතුය.

අපගේ ප්‍රියතමයන් සඳහා සහ # නිර්වචනය කරන්න

#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.මෙනුව

අපි සරලව මෙනුව ප්‍රදර්ශනය කරන්නෙමු, අයිතම අංකනය කරන්නෙමු, සහ ක්‍රීඩකයාගේ තේරීම සැකසීමට getkey() භාවිතා කරන්නෙමු. අපි චරිතයේ තත්ත්‍ව තීරුව ලියන්නෙමු, මට්ටම් කිරීමේ මෙනුව ක්‍රියාත්මක කරන්නෙමු, පසුපෙළ ලියන්නෙමු, සහ මම "උප පස" ලෙස හැඳින්වූ දේ අපට ලැබේ.

නිගමනය

මේක මේ වගේ දෙයක්. ඔබට එය සෙල්ලම් කළ හැකිය බාගත කර ඇත, ඇසිරීම සහ ධාවනය කිරීම මේ ආකාරයට:

$ sudo chmod +x Subsoil-1.0/Subsoil

$ Subsoil-1.0/Subsoil

, හෝ, අවසානයේ දේවානුභාවයෙන්, ඔබේම රුචිකත්වයේ වික්‍රමය ලියන්න. මම ඔබට කල්තියා අනතුරු අඟවන්නෙමි: මගේ ක්රීඩාව පහසු නැත!

සබැඳි

පටිපාටි උත්පාදනය, දිරිගන්වන්නෙක්.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න