C++ में कंसोल रॉगुलाइक

C++ में कंसोल रॉगुलाइक

परिचय

"लिनक्स गेम के लिए नहीं है!" - एक पुराना वाक्यांश: अब विशेष रूप से इस अद्भुत प्रणाली के लिए कई अद्भुत गेम हैं। लेकिन फिर भी, कभी-कभी आप कुछ खास चाहते हैं जो आप पर सूट करे... और मैंने यह खास चीज बनाने का फैसला किया।

Основа

मैं पूरा कोड नहीं दिखाऊंगा और बताऊंगा (यह बहुत दिलचस्प नहीं है) - केवल मुख्य बिंदु।

1.Character

सभी चरित्र पैरामीटर यहां सूचीबद्ध हैं (स्वास्थ्य, कवच, अनुभव, आदि) रुचि का चित्रण और आंदोलन की दिशा है (जो वर्तमान में उपलब्ध नहीं है)।

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.बातचीत

अब हमें किसी तरह दीवारों और राक्षसों से गुजरने से बचना होगा और वस्तुओं से बोनस प्राप्त करना होगा।

हमारे पसंदीदा for और #define हैं

#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

एक टिप्पणी जोड़ें