کنسول roguelike په C++ کې

کنسول roguelike په C++ کې

پېژندنه

"لینکس د لوبو لپاره نه دی!" - یو پخوانی جمله: اوس ډیری په زړه پوري لوبې شتون لري په ځانګړي توګه د دې عالي سیسټم لپاره. مګر بیا هم، ځینې وختونه تاسو یو څه ځانګړي غواړئ چې ستاسو سره مناسب وي ... او ما پریکړه وکړه چې دا ځانګړی شی جوړ کړم.

بیسس

زه به ټول کوډ ونه ښیم او ووایم (دا خورا په زړه پوري ندي) - یوازې اصلي ټکي.

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()، مګر د پیرامیټرو او د سرې د تولید لپاره اضافي لوپ سره ... د ساتیرۍ لپاره ، موږ یوازې د لید په ساحه کې رسم کوو ( لید) (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() کاروو. موږ د کرکټر حالت بار لیکو ، د لیول کولو مینو پلي کوو ، د شالید کیسه لیکو ، او موږ هغه څه ترلاسه کوو چې ما ورته "Subsoil" ویل.

پایلې

دا یو څه داسې دی. تاسو کولی شئ دا لوبه وکړئ کښته کولپیک کول او په دې ډول چلول:

$ sudo chmod +x Subsoil-1.0/Subsoil

$ Subsoil-1.0/Subsoil

، یا، په پای کې الهام شوی، خپل ځان د خپلې خوښې یو جرات ولیکئ. زه تاسو ته دمخه خبرداری ورکوم: زما لوبه اسانه نه ده!

لینکونه

طرزالعمل نسل, هڅوونکی.

سرچینه: www.habr.com

Add a comment