Bagel de consola en C ++



Introduccion


"¡Linux no es para juegos!" - Frase obsoleta: ahora hay muchos juegos geniales específicamente para este maravilloso sistema. Pero aún así, a veces, quiero algo especial que se adapte a usted ... Y decidí crear este especial.

Base


No mostraré y diré todo el código (esto no es muy interesante), solo los puntos principales.

1 personaje


Aquí se enumeran todos los parámetros del personaje (salud, armadura, experiencia, etc.) de interés es la representación y la dirección del movimiento (que no está disponible ahora).

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. Gestión


Cómo mover el personaje con tanta claridad (x - \ ++, y - \ ++). Pero el procesamiento del teclado es más entretenido:

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

Solo queda establecer los "caracteres de control". Se puede hacer con un interruptor, pero lo odio.

switch(...) case .. : ... ; break switch(...) case .. : ... ; break mejor así

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

Belleza! Funciones de bucle y correr por la pantalla! Pero de alguna manera dura ... Y el cursor parpadea, y las letras ... ¡Arreglalo!

 //  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! ¡El uno por ciento está listo!

3. El mundo alrededor


Aquí hacemos matrices para x, y piezas del mundo y las piezas en sí (char o[N]) , lo mismo para monstruos y bonificaciones.

Creamos la función world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) por analogía con hero() , pero con parámetros y un bucle adicional para generar la matriz ... por interés, dibujamos solo en el campo de visión (vis) (if (ox[k] < vis && oy[k]....))

Ahora llenamos la pantalla con partículas del mundo a través de habitaciones y pasajes sin complicaciones y huecos, al mismo tiempo que ingresamos enemigos y objetos, para una aleatoriedad completa no se olvide de 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. Interacción


Ahora, de alguna manera, no debemos atravesar paredes y monstruos, recibir bonificaciones de los objetos.

Nuestro favorito para y #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 menú


Simplemente mostramos el menú en la pantalla, numeramos los elementos, usando getkey () procesamos la elección del jugador. Escribimos la barra de estado del personaje, implementamos el menú de bombeo, escribimos el fondo y obtenemos lo que llamé "Subsuelo".

Conclusión


Esto es algo Puedes jugar descargando , desempacando y ejecutando de esta manera:

 $ sudo chmod +x Subsoil-1.0/Subsoil 

 $ Subsoil-1.0/Subsoil 

o, finalmente, inspirado, escríbete una aventura a tu gusto. Te advierto de antemano: ¡mi juego no es fácil!

Enlaces


Generación procesal , inspiradora .

Source: https://habr.com/ru/post/465625/


All Articles