Console roguelike дар C++

Console roguelike дар C++

Муқаддима

"Linux барои бозӣ нест!" ибораи кӯҳна аст: ҳоло бисёр бозиҳои аҷибе ҳастанд, ки махсус барои ин системаи олиҷаноб тарҳрезӣ шудаанд. Аммо баъзан, шумо чизи махсус мехоҳед, чизе, ки барои шумо дуруст аст... Ва ман қарор додам, ки он чизи махсусро эҷод кунам.

Асосӣ

Ман ҳамаи рамзҳоро нишон намедиҳам ва ба шумо мегӯям (ин чандон ҷолиб нест) - танҳо нуктаҳои асосӣ.

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]), ҳамон барои monsters ва мукофотпулӣ.

Функсия эҷод кунед 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 мебошанд

#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

, ё, дар ниҳоят илҳом гирифта, ба худ як саёҳати дилхоҳатонро нависед. Огоҳ бошед: бозии ман осон нест!

Пайвандҳо

Насли мурофиавӣ, Илҳомбахш.

Манбаъ: will.com

Илова Эзоҳ