Console roguelike hauv C ++

Console roguelike hauv C ++

Taw qhia

"Linux tsis yog rau kev ua si!" - cov kab lus tsis tu ncua: tam sim no muaj ntau yam kev ua si zoo tshwj xeeb rau cov kab ke zoo no. Tab sis tseem, qee zaum koj xav tau qee yam tshwj xeeb uas yuav haum rau koj ... Thiab kuv tau txiav txim siab los tsim qhov tshwj xeeb no.

Hauv paus

Kuv yuav tsis qhia thiab qhia tag nrho cov cai (nws tsis nthuav heev) - tsuas yog cov ntsiab lus tseem ceeb.

1. Cim

Tag nrho cov cim tsis tau teev nyob ntawm no (kev noj qab haus huv, armor, kev paub, thiab lwm yam) Ntawm kev txaus siab yog kev kos duab thiab kev taw qhia ntawm kev txav mus los (uas tsis muaj tam sim no).

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. Kev tswj hwm

Yuav ua li cas txav tus cwj pwm yog qhov tseeb (x-++, y-++). Tab sis kev ua cov keyboard yog qhov nthuav ntxiv:

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

Txhua yam uas tseem tshuav yog teeb tsa "tswj cim". Koj tuaj yeem ua nws siv qhov hloov pauv, tab sis kuv ntxub nws.

switch(...) case .. : ... ; break zoo li no

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

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

Kev zoo nkauj! Loop ua haujlwm thiab khiav ncig ntawm qhov screen! Tab sis qee qhov nws hnyav me ntsis ... Thiab tus cursor flashes, thiab cov ntawv ... Peb mam li kho nws!

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

Wow! Ib feem pua ​​yog npaj txhij!

3.Lub ntiaj teb nyob ib ncig ntawm peb

Ntawm no peb ua arrays rau x, y daim ntawm lub ntiaj teb thiab cov khoom lawv tus kheej (char o[N]), tib yam rau monsters thiab nyiaj tshwj xeeb.

Tsim ib txoj haujlwm world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) los ntawm kev sib piv nrog hero(), tab sis nrog tsis muaj thiab ib lub voj ntxiv rau outputting array ... rau kev lom zem, peb kos tsuas yog nyob rau hauv lub teb ntawm saib (vis) (if (ox[k] < vis && oy[k]....))

Tam sim no peb sau lub vijtsam nrog cov khoom ntawm lub ntiaj teb siv qhov yooj yim rau thiab txheej txheem hollow tawm chav thiab cov nqe lus, tib lub sijhawm peb nkag mus rau cov yeeb ncuab thiab cov khoom, kom ua tiav randomness peb tsis nco qab txog. 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. Kev sib tham

Tam sim no peb yuav tsum ua li cas zam dhau ntawm phab ntsa thiab monsters thiab tau txais nyiaj tshwj xeeb los ntawm cov khoom.

Peb cov kev nyiam yog rau thiab #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.Menu

Peb tsuas tso saib cov ntawv qhia zaub mov, suav cov khoom, thiab siv getkey() los ua cov neeg ua si xaiv. Peb sau tus cwj pwm cov xwm txheej bar, siv cov ntawv qhia qib siab, sau cov keeb kwm yav dhau los, thiab peb tau txais qhov kuv hu ua "Subsoil".

xaus

Qhov no yog ib yam zoo li no. Koj tuaj yeem ua si muaj downloaded, unpacking thiab khiav zoo li no:

$ sudo chmod +x Subsoil-1.0/Subsoil

$ Subsoil-1.0/Subsoil

, los yog, thaum kawg tshoov siab, sau koj tus kheej ib qho kev lom zem ntawm koj tus kheej nyiam. Kuv ceeb toom koj ua ntej: kuv qhov kev ua si tsis yooj yim!

Txuas

Cov txheej txheem tiam, Txhawb nqa.

Tau qhov twg los: www.hab.com

Ntxiv ib saib