C++ میں کنسول roguelike

C++ میں کنسول 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 ہیں۔

#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

نیا تبصرہ شامل کریں