קאַנסאָול ראָגועליקע אין 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

לייגן אַ באַמערקונג