کنسول 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()، اما با پارامترها و یک حلقه اضافی برای خروجی آرایه ... برای سرگرمی، فقط در میدان دید (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() برای پردازش انتخاب بازیکن استفاده می کنیم. نوار وضعیت کاراکتر را می نویسیم، منوی سطح بندی را پیاده سازی می کنیم، داستان پس زمینه را می نویسیم و چیزی را که من «Subsoil» نامیده ام دریافت می کنیم.

نتیجه

این چیزی شبیه به این است. می توانید آن را بازی کنید بارگیری، بسته بندی را باز کنید و به این ترتیب اجرا کنید:

$ sudo chmod +x Subsoil-1.0/Subsoil

$ Subsoil-1.0/Subsoil

، یا در نهایت الهام گرفته شده، برای خود یک ماجراجویی بنویسید که دوست دارید. من از قبل به شما هشدار می دهم: بازی من آسان نیست!

پیوندها

تولید رویه ای, تشویق کننده.

منبع: www.habr.com

اضافه کردن نظر