Console bagel in C ++





Introduction



β€œLinux is not for games!” Is an outdated phrase: now many wonderful games have appeared specifically for this wonderful system. But still, sometimes, I want something special that would suit you ... And I decided to create this special.



The basis



I will not show and tell all the code (this is not very interesting) - only the main points.



1.Character



Here are listed all the parameters of the character (health, armor, experience, etc.) of interest is the rendering and direction of movement (which is not present).



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



How to move the character so clearly (x - \ ++, y - \ ++). But keyboard processing is more entertaining:



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





It remains only to set the "control characters." It can be done with a switch, but I hate it.



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



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



better like this



 #define KEY if (key == #define I ){ #define J ;}else void keys() { getkey(); KEY 'a' I x-- ; pos = 1 J KEY...... }
      
      





Beauty! Loop functions and run around the screen! But somehow harsh ... And the cursor flickers, and the letters ... Fix it!



 //  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");
      
      





Wow! One percent is ready!



3. The world around



Here we make arrays for x, y pieces of the world and the pieces themselves (char o[N])



, the same for monsters and bonuses.



We create the world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N])



function world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N])



by analogy with hero()



, but with parameters and an additional loop to output the array ... for interest, we draw only in the field of view (vis) (if (ox[k] < vis && oy[k]....))







Now we fill the screen with particles of the world through an uncomplicated for and procedurally hollow out rooms and passages, at the same time enter enemies and objects, for complete randomness do not forget about 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[00m\e[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. Interaction



Now we need to somehow not pass through walls and monsters, receive bonuses from objects.



Our favorite for and #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.Menu



We simply display the menu on the screen, numbering the items, using getkey () we process the player’s choice. We write the status bar of the character, we implement the pumping menu, we write the background, and we get what I called "Subsoil" ("Subsoil").



Conclusion



This is something. You can play it by downloading , unpacking and running in this way:



 $ sudo chmod +x Subsoil-1.0/Subsoil
      
      





 $ Subsoil-1.0/Subsoil
      
      





, or, finally, inspired, write yourself an adventure to your liking. I warn you in advance: my game is not easy!



Links



Procedural Generation , Inspirer .



All Articles