Console roguelike muC ++

Console roguelike muC ++

Nhanganyaya

"Linux haisi yemitambo!" - mutsara wechinyakare: ikozvino kune yakawanda inoshamisa mitambo yakanangana neino inoshamisa sisitimu. Asi zvakadaro, dzimwe nguva unoda chimwe chinhu chakakosha chingakodzera iwe ... Uye ndakasarudza kugadzira chinhu chakakosha ichi.

Basis

Ini handisi kuzoratidza uye kuudza iyo kodhi yese (haisi kunyanya kunakidza) - chete mapoinzi makuru.

1.Unhu

Ese maparamendi ehunhu akanyorwa pano (hutano, nhumbi dzokurwa, ruzivo, zvichingodaro.) Inofarira kudhirowa uye gwara rekufamba (iyo isiri kuwanikwa parizvino).

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

Mafambisirwo akaitwa chimiro atove pachena (x—++, y—++). Asi iyo keyboard kugadzirisa inonyanya kufadza:

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

Chinosara ndechekuisa "control characters". Unogona kuzviita uchishandisa switch, asi ini ndinovenga.

switch(...) case .. : ... ; break zviri nani sezvizvi

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

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

Runako! Loop inoshanda uye inomhanya ichitenderedza skrini! Asi neimwe nzira inenge yakaoma ... Uye cursor inopenya, uye mavara ... Tichagadzirisa!

//До цикла
  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! Imwe muzana yakagadzirira!

3.Nyika yakatipoteredza

Pano tinoita mitsara ye x, y zvidimbu zvenyika uye zvidimbu pachazvo (char o[N]), zvakafanana kune zvikara uye mabhonasi.

Gadzira basa world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) nekuenzanisa ne hero(), asi nemaparameter uye imwe loop yekuburitsa iyo array ... yekunakidzwa, tinodhirowa chete mumunda wekuona (vis) (if (ox[k] < vis && oy[k]....))

Iye zvino tinozadza skrini nezvimedu zvepasi tichishandisa yakapfava uye nenzira isina kuvharwa kunze makamuri uye ndima, panguva imwe chete isu tinopinda vavengi uye zvinhu, nekusarongeka kwakazara isu hatikanganwe nezvazvo. 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.Kudyidzana

Zvino isu tinoda neimwe nzira kudzivirira kupfuura nemadziro uye zvikara uye kugamuchira mabhonasi kubva kuzvinhu.

Zvatinofarira ndezve uye #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

Isu tinongoratidza menyu, kuverenga zvinhu, uye kushandisa getkey () kugadzirisa sarudzo yemutambi. Isu tinonyora chimiro chechimiro chechimiro, shandisa iyo yekuyera menyu, nyora yekumashure, uye isu tinowana yandakadaidza kuti "Subsoil".

mhedziso

Ichi chinhu chakadai. Unogona kuiridza downloaded, kuburitsa nekumhanya seizvi:

$ sudo chmod +x Subsoil-1.0/Subsoil

$ Subsoil-1.0/Subsoil

, kana, pakupedzisira akafemerwa, zvinyore iwe chiitiko chaunofarira iwe pachako. Ndinokuyambira mberi: mutambo wangu hausi nyore!

Links

Procedural generation, Kukurudzira.

Source: www.habr.com

Voeg