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

Илова Эзоҳ