Console Roguelike በC++ ውስጥ

Console Roguelike በC++ ውስጥ

መግቢያ

"ሊኑክስ ለጨዋታዎች አይደለም!" - ጊዜው ያለፈበት ሐረግ-አሁን ለዚህ አስደናቂ ስርዓት ብዙ አስደናቂ ጨዋታዎች አሉ። ግን አሁንም ፣ አንዳንድ ጊዜ ለእርስዎ የሚስማማ ልዩ ነገር ይፈልጋሉ ... እና ይህን ልዩ ነገር ለመፍጠር ወሰንኩ ።

መሠረታዊ

ሙሉውን ኮድ አላሳይም እና አልነግርም (በጣም አስደሳች አይደለም) - ዋና ዋና ነጥቦችን ብቻ።

1.ቁምፊ

ሁሉም የቁምፊዎች መመዘኛዎች እዚህ ተዘርዝረዋል (ጤና, የጦር ትጥቅ, ልምድ, ወዘተ.) ትኩረት የሚስበው የእንቅስቃሴው ስዕል እና አቅጣጫ ነው (በአሁኑ ጊዜ የማይገኝ).

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. አስተዳደር

ቁምፊውን እንዴት ማንቀሳቀስ እንደሚቻል አስቀድሞ ግልጽ ነው (x—++፣ y—++)። ግን የቁልፍ ሰሌዳው ሂደት የበለጠ አስደሳች ነው-

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

የቀረው "የቁጥጥር ቁምፊዎችን" ማዘጋጀት ብቻ ነው. ማብሪያ / ማጥፊያን በመጠቀም ማድረግ ይችላሉ ፣ ግን ጠላሁት።

switch(...) case .. : ... ; break እንደዚህ ይሻላል

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

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

ውበት! የሉፕ ተግባራት እና በማያ ገጹ ዙሪያ አሂድ! ግን በሆነ መልኩ ትንሽ ከባድ ነው ... እና ጠቋሚው ብልጭ ድርግም ይላል, እና ፊደሎቹ ... እናስተካክለዋለን!

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

ዋዉ! አንድ መቶኛ ዝግጁ ነው!

በዙሪያችን ያለው ዓለም 3

እዚህ ለ x ፣ y የዓለም ክፍሎች እና ለራሳቸው ቁርጥራጮች ድርድሮችን እንሰራለን። (char o[N]), ጭራቆች እና ጉርሻ ተመሳሳይ.

ተግባር ፍጠር world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) ጋር በማመሳሰል hero()ነገር ግን በመለኪያዎች እና ድርድርን ለማውጣት ተጨማሪ ምልልስ... ለመዝናናት፣ በእይታ መስክ ላይ ብቻ እንሳልለን (vis) (if (ox[k] < vis && oy[k]....))

አሁን ክፍሎቹን እና ምንባቦችን ቀለል ባለ እና በሂደት ክፍት በማድረግ ስክሪኑን በዓለም ቅንጣቶች እንሞላለን ፣ በተመሳሳይ ጊዜ ወደ ጠላቶች እና ዕቃዎች እንገባለን ፣ ለተሟላ የዘፈቀደነት እኛ አንረሳውም ። 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. መስተጋብር

አሁን እንደምንም ግድግዳዎችን እና ጭራቆችን እንዳናልፍ እና ከእቃዎች ጉርሻ መቀበል አለብን።

የእኛ ተወዳጆች ለ እና # መግለጽ ናቸው።

#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.ምናሌ

በቀላሉ ምናሌውን እናሳያለን፣ እቃዎቹን ቁጥር እየሰጠን እና የተጫዋቹን ምርጫ ለማስኬድ ጌትኪ()ን እንጠቀማለን። የቁምፊውን ሁኔታ ባር እንጽፋለን, ደረጃውን የጠበቀ ምናሌን እንተገብራለን, የኋላ ታሪክን እንጽፋለን እና "የከርሰ ምድር" ያልኩትን እናገኛለን.

መደምደሚያ

ይህ እንደዚህ ያለ ነገር ነው. መጫወት ትችላለህ በማውረድ, ማሸግ እና በዚህ መንገድ መሮጥ:

$ sudo chmod +x Subsoil-1.0/Subsoil

$ Subsoil-1.0/Subsoil

, ወይም በመጨረሻ ተመስጦ, እራስዎን የሚወዱትን ጀብዱ ይጻፉ. አስቀድሜ አስጠንቅቄሃለሁ፡ ጨዋታዬ ቀላል አይደለም!

አገናኞች

የሂደት ማመንጨት, አበረታች.

ምንጭ: hab.com

አስተያየት ያክሉ