
Paraqitje
"Linux nuk është për lojëra!" është një shprehje e vjetëruar: tani ka shumë lojëra të mrekullueshme të projektuara posaçërisht për këtë sistem të mrekullueshëm. Por ndonjëherë, dëshiron diçka të veçantë, diçka që është tamam për ty... Dhe vendosa ta krijoj atë diçka të veçantë.
themel
Nuk do t'ju tregoj dhe tregoj të gjithë kodin (nuk është shumë interesant) - vetëm pikat kryesore.
1. Personazhi
Të gjithë parametrat e personazheve (shëndeti, forca të blinduara, përvoja, etj.) janë renditur këtu. Me interes janë vizatimi dhe drejtimi i lëvizjes (i cili aktualisht mungon).
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. Menaxhimi
Mënyra e zhvendosjes së një karakteri është tashmë e qartë (x-++, y-++). Por trajtimi i tastierës është më interesant:
char key;
char getkey()
{
system("stty raw");
key = getchar();
system("stty cooked");
return key;
}
E tëra çfarë mbetet është të caktohen "karakteret e kontrollit". Kjo mund të bëhet me çelësin, por unë e urrej.
switch(...) case .. : ... ; break Më mirë kështu
#define KEY if (key ==
#define I ){
#define J ;}else
void keys()
{
getkey();
KEY 'a' I x-- ; pos = 1 J
KEY......
}
Bukur! Po i përsërisim funksionet dhe po lëvizim nëpër ekran! Por është paksa e çrregullt... Kursori vazhdon të dridhet, dhe kështu bëjnë edhe shkronjat... Do ta rregullojmë këtë!
//До цикла
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");
Uf! Një përqind gati!
3. Bota përreth nesh
Këtu krijojmë vargje për x, y pjesë të botës dhe vetë pjesët. (char o[N]), e njëjta gjë vlen edhe për përbindëshat dhe bonuset.
Krijo një funksion world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) në analogji me hero(), por me parametra dhe një lak shtesë për nxjerrjen e vargut... për argëtim, ne vizatojmë vetëm në fushën e pamjes (vis) (if (ox[k] < vis && oy[k]....))
Tani e mbushim ekranin me grimca të botës duke përdorur një mënyrë të thjeshtë për të zbrazët dhe procedurale dhoma dhe pasazhe, në të njëjtën kohë hyjmë në armiq dhe objekte, për rastësi të plotë nuk harrojmë 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[00me[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. Ndërveprimi
Tani duhet të shmangim disi kalimin nëpër mure dhe përbindësha dhe të marrim bonuse nga sendet.
Të preferuarat tona janë për dhe #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. Menuja
Ne thjesht shfaqim menunë në ekran, duke numëruar artikujt dhe përpunojmë përzgjedhjen e lojtarit duke përdorur getkey(). Shkruajmë një shirit statusi të personazhit, zbatojmë një menu për nivelim, shkruajmë një histori prapaskene dhe përfundojmë me atë që e kam quajtur "Nëntokë".
Përfundim
Kjo është diçka e tillë. Mund ta luash, , duke e çpaketuar dhe duke e ekzekutuar si kjo:
$ sudo chmod +x Subsoil-1.0/Subsoil$ Subsoil-1.0/Subsoil, ose, më në fund i frymëzuar, shkruajini vetes një aventurë sipas dëshirës tuaj. Kini kujdes: loja ime nuk është e lehtë!
Lidhje
, .
Burimi: www.habr.com
