Konsolenbagel in C ++



Einführung


"Linux ist nichts für Spiele!" - veralteter Satz: Jetzt gibt es viele großartige Spiele speziell für dieses wunderbare System. Trotzdem möchte ich manchmal etwas Besonderes, das zu Ihnen passt ... Und ich habe beschlossen, dieses Besondere zu kreieren.

Basis


Ich werde nicht den gesamten Code zeigen und erzählen (das ist nicht sehr interessant) - nur die Hauptpunkte.

1.Charakter


Hier sind alle Parameter des Charakters (Gesundheit, Rüstung, Erfahrung usw.) aufgeführt, die für die Darstellung und Bewegungsrichtung von Interesse sind (was nicht vorhanden ist).

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


Wie man das Zeichen so deutlich bewegt (x - \ ++, y - \ ++). Die Tastaturverarbeitung ist jedoch unterhaltsamer:

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

Es bleiben nur die "Steuerzeichen" zu setzen. Es kann mit einem Schalter gemacht werden, aber ich hasse es.

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

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

Schönheit! Loop-Funktionen und laufen um den Bildschirm! Aber irgendwie hart ... Und der Cursor flackert und die Buchstaben ... Reparieren Sie es!

 //  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! Ein Prozent ist fertig!

3. Die Welt um uns herum


Hier machen wir Arrays für x, y Teile der Welt und die Teile selbst (char o[N]) , das gleiche gilt für Monster und Boni.

Wir erstellen die world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) in Analogie zu hero() , aber mit Parametern und einer zusätzlichen Schleife zur Ausgabe des Arrays ... aus interesse zeichnen wir nur im sichtfeld (vis) (if (ox[k] < vis && oy[k]....))

Jetzt füllen wir den Bildschirm mit Partikeln der Welt durch unkomplizierte und prozedural ausgehöhlte Räume und Passagen, betreten gleichzeitig Feinde und Objekte, für völlige Zufälligkeit vergessen Sie nicht 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. Interaktion


Jetzt müssen wir irgendwie nicht durch Mauern und Monster gehen, sondern Boni von Gegenständen erhalten.

Unser Favorit für und #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ü


Wir zeigen einfach das Menü auf dem Bildschirm an, nummerieren die Elemente und verarbeiten mit getkey () die Auswahl des Spielers. Wir schreiben die Statusleiste des Charakters, wir implementieren das Pumpmenü, wir schreiben den Hintergrund und wir bekommen das, was ich "Untergrund" nannte.

Fazit


Das ist etwas. Sie können es spielen, indem Sie es wie folgt herunterladen , entpacken und ausführen:

 $ sudo chmod +x Subsoil-1.0/Subsoil 

 $ Subsoil-1.0/Subsoil 

oder schließlich inspiriert, schreiben Sie sich ein Abenteuer nach Ihren Wünschen. Ich warne Sie im Voraus: Mein Spiel ist nicht einfach!

Links


Prozedurale Generierung , Inspirer .

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


All Articles