C++ ನಲ್ಲಿ ರೋಗುಲೈಕ್ ಅನ್ನು ಕನ್ಸೋಲ್ ಮಾಡಿ

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(), ಆದರೆ ಶ್ರೇಣಿಯನ್ನು ಔಟ್‌ಪುಟ್ ಮಾಡಲು ನಿಯತಾಂಕಗಳು ಮತ್ತು ಹೆಚ್ಚುವರಿ ಲೂಪ್‌ನೊಂದಿಗೆ ... ವಿನೋದಕ್ಕಾಗಿ, ನಾವು ವೀಕ್ಷಣೆಯ ಕ್ಷೇತ್ರದಲ್ಲಿ ಮಾತ್ರ ಸೆಳೆಯುತ್ತೇವೆ (ವಿಸ್) (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.ಮೆನು

ನಾವು ಸರಳವಾಗಿ ಮೆನುವನ್ನು ಪ್ರದರ್ಶಿಸುತ್ತೇವೆ, ಐಟಂಗಳನ್ನು ಸಂಖ್ಯೆ ಮಾಡುತ್ತೇವೆ ಮತ್ತು ಆಟಗಾರನ ಆಯ್ಕೆಯನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು getkey() ಅನ್ನು ಬಳಸುತ್ತೇವೆ. ನಾವು ಪಾತ್ರದ ಸ್ಥಿತಿ ಪಟ್ಟಿಯನ್ನು ಬರೆಯುತ್ತೇವೆ, ಲೆವೆಲಿಂಗ್ ಮೆನುವನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುತ್ತೇವೆ, ಬ್ಯಾಕ್‌ಸ್ಟೋರಿ ಬರೆಯುತ್ತೇವೆ ಮತ್ತು ನಾನು "ಸಬ್‌ಸಾಯಿಲ್" ಎಂದು ಕರೆಯುವುದನ್ನು ನಾವು ಪಡೆಯುತ್ತೇವೆ.

ತೀರ್ಮಾನಕ್ಕೆ

ಇದು ಈ ರೀತಿಯದ್ದು. ನೀವು ಅದನ್ನು ಪ್ಲೇ ಮಾಡಬಹುದು ಡೌನ್ಲೋಡ್ ಮಾಡಿದ ನಂತರ, ಅನ್ಪ್ಯಾಕ್ ಮಾಡುವುದು ಮತ್ತು ಈ ರೀತಿ ಓಡುವುದು:

$ sudo chmod +x Subsoil-1.0/Subsoil

$ Subsoil-1.0/Subsoil

, ಅಥವಾ, ಅಂತಿಮವಾಗಿ ಸ್ಫೂರ್ತಿ, ನಿಮ್ಮ ಸ್ವಂತ ಇಚ್ಛೆಯ ಸಾಹಸವನ್ನು ಬರೆಯಿರಿ. ನಾನು ನಿಮಗೆ ಮುಂಚಿತವಾಗಿ ಎಚ್ಚರಿಸುತ್ತೇನೆ: ನನ್ನ ಆಟವು ಸುಲಭವಲ್ಲ!

ಲಿಂಕ್‌ಗಳು

ಕಾರ್ಯವಿಧಾನದ ಉತ್ಪಾದನೆ, ಪ್ರೋತ್ಸಾಹಕ.

ಮೂಲ: www.habr.com

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ