Bagel de console em C ++



1. Introdução


"Linux não é para jogos!" - frase obsoleta: agora existem muitos jogos excelentes especificamente para esse maravilhoso sistema. Mas ainda assim, às vezes, quero algo especial que combina com você ... E decidi criar esse especial.

Base


Não vou mostrar e contar todo o código (isso não é muito interessante) - apenas os pontos principais.

1.Personagem


Aqui estão listados todos os parâmetros do personagem (saúde, armadura, experiência, etc.) de interesse: a representação e a direção do movimento (que não está presente).

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


Como mover o personagem tão claramente (x - \ ++, y - \ ++). Mas o processamento do teclado é mais divertido:

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

Resta apenas definir os "caracteres de controle". Isso pode ser feito com um interruptor, mas eu odeio isso.

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

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

Beleza! Loop funções e correr ao redor da tela! Mas de alguma forma dura ... E o cursor pisca, e as letras ... Conserte!

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

Uau! Um por cento está pronto!

3. O mundo ao redor


Aqui criamos matrizes para x, y pedaços do mundo e as próprias peças (char o[N]) , o mesmo para monstros e bônus.

Criamos a função world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) por analogia com hero() , mas com parâmetros e um loop adicional para gerar a matriz ... por interesse, traçamos apenas no campo de visão (vis) (if (ox[k] < vis && oy[k]....))

Agora enchemos a tela com partículas do mundo através de salas e passagens descomplicadas e processuais, ao mesmo tempo em que entram inimigos e objetos, para que a aleatoriedade completa não se esqueça 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. Interação


Agora precisamos de alguma forma não atravessar paredes e monstros, receber bônus de objetos.

O nosso favorito e #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


Simplesmente exibimos o menu na tela, numerando os itens, usando getkey () e processamos a escolha do jogador. Nós escrevemos a barra de status do personagem, implementamos o menu de atualização, escrevemos o plano de fundo e obtemos o que eu chamei de "Subsolo".

Conclusão


Isso é alguma coisa. Você pode jogá-lo baixando , descompactando e executando da seguinte maneira:

 $ sudo chmod +x Subsoil-1.0/Subsoil 

 $ Subsoil-1.0/Subsoil 

, ou, finalmente, inspirado, escreva para si mesmo uma aventura ao seu gosto. Eu te aviso com antecedência: meu jogo não é fácil!

Ligações


Geração procedural , Inspirador .

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


All Articles