Konsolė nesąžininga C++ kalba

Konsolė nesąžininga C++ kalba

įvedimas

„Linux nėra skirtas žaidimams! - pasenusi frazė: dabar yra daug nuostabių žaidimų specialiai šiai nuostabiai sistemai. Bet vis tiek kartais norisi kažko ypatingo, kas tiktų... Ir aš nusprendžiau sukurti šį ypatingą dalyką.

Основа

Nerodysiu ir nepasakysiu viso kodo (tai nėra labai įdomu) - tik pagrindiniai dalykai.

1.Personažas

Čia surašyti visi charakterio parametrai (sveikata, šarvai, patirtis ir kt.) Įdomus piešinys ir judėjimo kryptis (kurios šiuo metu nėra).

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

Jau aišku, kaip perkelti simbolį (x—++, y—++). Tačiau klaviatūros apdorojimas yra įdomesnis:

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

Belieka nustatyti „valdymo simbolius“. Galite tai padaryti naudodami jungiklį, bet aš to nekenčiu.

switch(...) case .. : ... ; break geriau taip

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

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

Grožis! Sujunkite funkcijas ir bėkite aplink ekraną! Bet kažkaip žiauriai... Ir žymeklis mirksi, ir raidės... Pataisysime!

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

Oho! Vienas procentas yra paruoštas!

3.Mus supantis pasaulis

Čia sudarome masyvus x, y pasaulio gabalams ir pačioms dalelėms (char o[N]), tas pats ir monstrams bei premijoms.

Sukurkite funkciją world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) pagal analogiją su hero(), bet su parametrais ir papildoma kilpa masyvo išvedimui... dėl smagumo piešiame tik matymo lauke (vis) (if (ox[k] < vis && oy[k]....))

Dabar mes užpildome ekraną pasaulio dalelėmis, naudodami paprastus ir procedūriškai tuščius kambarius ir praėjimus, tuo pat metu patenkame į priešus ir objektus, dėl visiško atsitiktinumo nepamirštame apie 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.Sąveika

Dabar turime kažkaip vengti praeiti per sienas ir monstrus ir gauti premijas už daiktus.

Mūsų mėgstamiausi yra ir #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.Meniu

Tiesiog parodome meniu, sunumeruojame elementus ir naudojame getkey(), kad apdorotume žaidėjo pasirinkimą. Rašome veikėjo būsenos juostą, įgyvendiname niveliavimo meniu, parašome istoriją ir gauname tai, ką aš pavadinau „podirviu“.

išvada

Tai kažkas tokio. Galite žaisti atsisiuntę, išpakuokite ir paleiskite taip:

$ sudo chmod +x Subsoil-1.0/Subsoil

$ Subsoil-1.0/Subsoil

, arba, pagaliau įkvėptas, parašykite sau patinkantį nuotykį. Iš anksto įspėju: mano žaidimas nėra lengvas!

Nuorodos

Procedūrinė generacija, Skatintuvas.

Šaltinis: www.habr.com

Добавить комментарий