Console roguelike ni C ++

Console roguelike ni C ++

Ifihan

"Linux kii ṣe fun awọn ere!" - gbolohun ọrọ igba atijọ: ni bayi ọpọlọpọ awọn ere iyalẹnu wa pataki fun eto iyalẹnu yii. Ṣugbọn sibẹ, nigbami o fẹ nkan pataki ti yoo ba ọ... Mo si pinnu lati ṣẹda nkan pataki yii.

Ipilẹ

Emi kii yoo ṣafihan ati sọ fun gbogbo koodu naa (kii ṣe igbadun pupọ) - awọn aaye akọkọ nikan.

1.Ohun kikọ

Gbogbo ohun kikọ sile ti wa ni akojọ si nibi (ilera, ihamọra, iriri, ati be be lo) Ti awọn anfani ni yiya ati itọsọna ti ronu (eyi ti o jẹ ko Lọwọlọwọ wa).

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.Management

Bii o ṣe le gbe ohun kikọ silẹ ti han tẹlẹ (x—++, y—++). Ṣugbọn sisẹ keyboard jẹ igbadun diẹ sii:

char key;
char getkey()
{
  system("stty raw");
  key = getchar();
  system("stty cooked");
  return key;
}

Gbogbo ohun ti o ku ni lati ṣeto “awọn ohun kikọ iṣakoso”. O le ṣe ni lilo iyipada, ṣugbọn Mo korira rẹ.

switch(...) case .. : ... ; break dara julọ bi eleyi

#define KEY if (key ==
#define I ){
#define J ;}else

void keys()
{
  getkey();
    KEY 'a' I x-- ; pos = 1 J
    KEY......
}

Ẹwa! Awọn iṣẹ yipo ati ṣiṣe ni ayika iboju! Ṣugbọn bakan o jẹ lile diẹ ... Ati kọsọ n tan, ati awọn lẹta ... A yoo ṣe atunṣe!

//До цикла
  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");

Iro ohun! Ọkan ninu ogorun ti šetan!

3.Aye ni ayika wa

Nibi a ṣe awọn akojọpọ fun x, y awọn ege ti agbaye ati awọn ege funrara wọn (char o[N]), kanna fun awọn ohun ibanilẹru ati awọn imoriri.

Ṣẹda iṣẹ kan world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) nipa afiwe pẹlu hero(), ṣugbọn pẹlu awọn paramita ati afikun lupu fun ṣiṣejade titobi… fun igbadun, a fa nikan ni aaye wiwo (vis) (if (ox[k] < vis && oy[k]....))

Bayi a kun iboju pẹlu awọn patikulu ti agbaye ni lilo irọrun fun ati ṣofo awọn yara ati awọn ọna, ni akoko kanna a tẹ awọn ọta ati awọn nkan, fun aileto pipe a ko gbagbe nipa rẹ. 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.Interaction

Bayi a nilo lati yago fun gbigbe nipasẹ awọn odi ati awọn ohun ibanilẹru ati gba awọn ẹbun lati awọn ohun kan.

Awọn ayanfẹ wa fun ati #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.Akojọ aṣyn

A nfi akojọ aṣayan han, nọmba awọn ohun kan, ati lo getkey () lati ṣe ilana yiyan ẹrọ orin. A kọ ọpa ipo ohun kikọ, ṣe akojọ aṣayan ipele, kọ itan ẹhin, ati pe a gba ohun ti Mo pe ni “Iha ilẹ”.

ipari

Eyi jẹ nkan bi eleyi. O le mu ṣiṣẹ ntẹriba gbaa lati ayelujara, ṣiṣi silẹ ati ṣiṣe bii eyi:

$ sudo chmod +x Subsoil-1.0/Subsoil

$ Subsoil-1.0/Subsoil

, tabi, nipari atilẹyin, kọ ara rẹ ohun ìrìn ti ara rẹ fẹran. Mo kilọ fun ọ ni ilosiwaju: ere mi ko rọrun!

Awọn ọna asopọ

iran ilana, Oluyanju.

orisun: www.habr.com

Fi ọrọìwòye kun