Console roguelike a cikin C++

Console roguelike a cikin C++

Gabatarwar

"Linux ba na wasanni bane!" - tsohuwar magana: yanzu akwai wasanni masu ban mamaki da yawa musamman don wannan tsarin ban mamaki. Amma duk da haka, wani lokacin kuna son wani abu na musamman wanda zai dace da ku ... Kuma na yanke shawarar ƙirƙirar wannan abu na musamman.

Basis

Ba zan nuna ba kuma in gaya duk lambar (ba shi da ban sha'awa sosai) - kawai mahimman abubuwan.

1. Hali

An jera duk sigogin halayen a nan (lafiya, makamai, kwarewa, da dai sauransu) Abin sha'awa shine zane da jagorancin motsi (wanda ba a samuwa a halin yanzu).

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

Yadda za a motsa harafin ya riga ya bayyana (x—++, y—++). Amma sarrafa madannai yana da ban sha'awa:

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

Abin da ya rage shi ne saita “harrufan sarrafawa”. Kuna iya yin shi ta amfani da switch, amma na ƙi shi.

switch(...) case .. : ... ; break yafi haka

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

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

Kyakkyawan! Ayyukan madauki kuma kunna kewaye allon! Amma ko ta yaya yana da ɗan tsauri ... Kuma siginan kwamfuta yana walƙiya, da haruffa ... Za mu gyara shi!

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

Kai! Kashi ɗaya ya shirya!

3.Duniya kewaye da mu

Anan muna yin tsararru don x, y guda na duniya da guntuwar kansu (char o[N]), iri daya ga dodanni da kari.

Ƙirƙiri aiki world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) ta misali da hero(), amma tare da sigogi da ƙarin madauki don fitar da tsararru ... don jin daɗi, muna zana kawai a fagen kallo (vis) (if (ox[k] < vis && oy[k]....))

Yanzu mun cika allon tare da barbashi na duniya ta amfani da sauƙi don da tsari na ɓoye ɗakuna da sassa, a lokaci guda muna shigar da abokan gaba da abubuwa, don cikakken bazuwar ba mu manta da su. 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.Mu'amala

Yanzu muna buƙatar ko ta yaya mu guji wucewa ta bango da dodanni kuma mu sami kari daga abubuwa.

Abubuwan da muka fi so sune don kuma # ayyana

#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

Muna kawai nuna menu, ƙididdige abubuwan, kuma muna amfani da getkey() don aiwatar da zaɓin mai kunnawa. Muna rubuta ma'aunin matsayi, aiwatar da menu na daidaitawa, rubuta tarihin baya, kuma muna samun abin da na kira "Ƙasashen Ƙasa".

ƙarshe

Wannan wani abu ne kamar wannan. Kuna iya kunna shi zazzagewa, kwashe kaya da gudu kamar haka:

$ sudo chmod +x Subsoil-1.0/Subsoil

$ Subsoil-1.0/Subsoil

, ko, a ƙarshe wahayi, rubuta kanka wani kasada na son ku. Ina yi muku gargaɗi a gaba: wasana ba shi da sauƙi!

Hanyoyin haɗi

Tsarin tsari, Mai ƙarfafawa.

source: www.habr.com

Add a comment