Console roguelike amin'ny C ++

Console roguelike amin'ny C ++

fampidirana

"Tsy natao ho an'ny lalao ny Linux!" - fehezanteny efa lany andro: ankehitriny dia misy lalao mahafinaritra maro manokana ho an'ity rafitra mahafinaritra ity. Na izany aza, indraindray ianao maniry zavatra manokana izay mety aminao... Ary nanapa-kevitra ny hamorona ity zavatra manokana ity aho.

fototra

Tsy hasehoko sy holazaiko ny kaody manontolo (tsy dia mahaliana loatra) - ireo hevi-dehibe ihany.

1. Toetra

Ny mari-pamantarana rehetra momba ny toetra dia voatanisa eto (fahasalamana, fiadiana, traikefa, sns.) Ny mahaliana dia ny sary sy ny fitarihana ny hetsika (izay tsy misy amin'izao fotoana izao).

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

Ny fomba famindra ny toetra dia efa mazava (x—++, y—++). Saingy mahaliana kokoa ny fanodinana kitendry:

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

Ny hany sisa tavela dia ny mametraka ny "karazana fanaraha-maso". Azonao atao izany amin'ny fampiasana switch, saingy halako izany.

switch(...) case .. : ... ; break tsara kokoa ny toy izao

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

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

Beauty! Loop miasa ary mihazakazaka manodidina ny efijery! Saingy somary masiaka ihany izany... Ary mitselatra ny cursor, ary ny litera... Hamboarinay izany!

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

Oay! Efa vonona ny iray isan-jato!

3. Ny tontolo manodidina antsika

Eto isika dia manao array ho an'ny x, y ampahany amin'izao tontolo izao ary ny ampahany (char o[N]), mitovy amin'ny monsters sy bonus.

Mamorona fiasa world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) amin'ny analogy amin'ny hero(), fa miaraka amin'ny mari-pamantarana sy loop fanampiny amin'ny famoahana ny array... ho an'ny fialamboly, dia eo amin'ny sehatry ny fijery ihany no ataontsika (vis) (if (ox[k] < vis && oy[k]....))

Ankehitriny dia mameno ny efijery amin'ny ampahany amin'izao tontolo izao isika amin'ny alàlan'ny efitrano sy andalana tsotra sy amin'ny fomba tsotra, miaraka amin'izay koa dia miditra amin'ny fahavalo sy zavatra isika, ho an'ny kisendrasendra tanteraka tsy adinontsika. 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. Fifandraisana

Ankehitriny dia mila miala amin'ny rindrina sy ny biby goavam-be isika ary mahazo tombony amin'ny entana.

Ny ankafizinay dia ho an'ny ary #famaritana

#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

Asehoy fotsiny ny menio, manisa isa ireo entana, ary mampiasa getkey() hanomanana ny safidin'ny mpilalao. Manoratra ny sata mifehy ny toetra izahay, mampihatra ny menu leveling, manoratra ny backstory, ary mahazo ilay antsoina hoe "Subsoil".

famaranana

Ity dia zavatra tahaka izao. Afaka milalao izany ianao rehefa télécharger, mamoha ary mihazakazaka toy izao:

$ sudo chmod +x Subsoil-1.0/Subsoil

$ Subsoil-1.0/Subsoil

, na, rehefa nahazo aingam-panahy, manoratra ho an'ny tenanao manokana izay tianao. Mampitandrina anao mialoha aho: tsy mora ny lalaoko!

rohy

Generation procédure, Mpampahery.

Source: www.habr.com

Add a comment