Bagel konsol dalam C ++



Pendahuluan


"Linux bukan untuk game!" - Ungkapan usang: sekarang ada banyak permainan hebat khusus untuk sistem yang luar biasa ini. Tapi tetap saja, kadang-kadang, aku menginginkan sesuatu yang istimewa yang cocok untukmu ... Dan aku memutuskan untuk membuat ini istimewa.

Base


Saya tidak akan menunjukkan dan memberi tahu semua kode (ini tidak terlalu menarik) - hanya poin utama.

1. Karakter


Di sini tercantum semua parameter karakter (kesehatan, baju besi, pengalaman, dll.) Yang menarik adalah render dan arah gerakan (yang tidak tersedia sekarang).

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


Cara memindahkan karakter dengan sangat jelas (x - \ ++, y - \ ++). Tetapi pemrosesan keyboard lebih menghibur:

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

Tetap hanya untuk mengatur "karakter kontrol." Itu bisa dilakukan dengan saklar, tapi aku benci itu.

switch(...) case .. : ... ; break switch(...) case .. : ... ; break lebih baik seperti ini

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

Cantik! Fungsi lingkaran dan jalankan di sekitar layar! Tapi entah bagaimana kasar ... Dan kursor berkedip, dan surat-surat ... Perbaiki!

 //  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! Satu persen sudah siap!

3. Dunia sekitar


Di sini kita membuat array untuk x, y keping dunia dan keping itu sendiri (char o[N]) , sama untuk monster dan bonus.

Kami membuat fungsi world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) dengan analogi dengan hero() , tetapi dengan parameter dan loop tambahan untuk menampilkan array ... untuk kepentingan, kami menggambar hanya di bidang pandang (vis) (if (ox[k] < vis && oy[k]....))

Sekarang kita mengisi layar dengan partikel-partikel dunia melalui tanpa rumit untuk dan secara prosedural melubangi kamar dan lorong, pada saat yang sama memasukkan musuh dan benda, untuk keacakan lengkap jangan lupa tentang 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. Interaksi


Sekarang kita perlu entah bagaimana tidak melewati dinding dan monster, menerima bonus dari objek.

Favorit kami untuk dan #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


Kami cukup menampilkan menu di layar, menomori item, menggunakan getkey (), kami memproses pilihan pemain. Kami menulis bilah status karakter, kami menerapkan menu pemompaan, kami menulis latar belakang, dan kami mendapatkan apa yang saya sebut "Subsoil" ("Subsoil").

Kesimpulan


Ini sesuatu. Anda dapat memainkannya dengan mengunduh , membongkar dan menjalankan dengan cara ini:

 $ sudo chmod +x Subsoil-1.0/Subsoil 

 $ Subsoil-1.0/Subsoil 

, atau, akhirnya, mengilhami, menulis sendiri petualangan sesuai keinginan Anda. Saya memperingatkan Anda sebelumnya: permainan saya tidak mudah!

Tautan


Generasi Prosedural , Inspirer .

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


All Articles