
Hyrje
„Linux nuk është për lojëra!” — një frazë e vjetruar: tani ka shumë lojëra të shkëlqyera të krijuara posaçërisht për këtë sistem të mahnitshëm. Por megjithatë, ndonjëherë, dëshiron diçka të veçantë, që do të përshtatej pikërisht për ty... Dhe vendosa ta krijoj këtë të veçantë.
Baza
Nuk do të tregoj dhe të shpjegoja të gjithë kodin (nuk është shumë interesante) — vetëm piketat kryesore.
1.Personazhi
Këtu janë të listuara të gjitha parametrat e personazhit (shëndeti, mbrojtja, përvoja etj.) që ka interes është përshkrimi dhe drejtimi i lëvizjes (të cilin nuk e kemi aktualisht).
int x = 5, y = 5;
hp = 100,
maxhp = 100,
dm = 20,
armor = 0,
xp = 0,
level = 0,
diff = 10, // vështirësia
pos = 0; // drejtimi
bool reg = 0,
Mdm = 0, // bonuset
ght = 0;
string color; // ngjyra do të përdoret si indikator i gjendjes së heroit
void hero() // këtu ndodhet lëvizja e heroit në koordinatat (x ; y)
{
cout << "e[u " << "e[0;0H"; // rikthimi i pozicionit të kursorit, fshirja me hapësirë
for (int i = 0; i <= x; i++)
cout << RIGHT; // makro "e[1C"
for (int i = 0; i <= y; i++)
cout << DOWN; // makro "e[1B"
cout << "e[s" << color << "╬"; // ruajtja e pozicionit të kursorit
}
2.Shtyrja
Si të lëvizni personazhin është e qartë (x—++, y—++). Por përpunimi i tastierës është më interesant:
char key;
char getkey()
{
system("stty raw");
key = getchar();
system("stty cooked");
return key;
}
Vetëm duhet të caktosh "simbolet e kontrollit". Mund ta bësh me switch, por unë e urrej atë.
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......
}
Bukuri! Po i mbyllim funksionet dhe vrapojmë përmes ekranit! Por duket pak e papërshtatshme… Dhe kursori pulson, dhe shkronjat… Do ta rregullojmë!
//До цикла
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");
Ahh! Një përqind është gati!
3.Bota përreth
Këtu krijojmë array për x, y copëza të botës dhe vetë copëzat (char o[N]), ashtu si për monstrujtë dhe bonuset.
Krijojmë funksionin world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) me analogji me hero(), por me parametra dhe ciklin shtesë për të renditur array… për interes, çizojmë vetëm në fushën e shikimit (vis) (if (ox[k] < vis && oy[k]....))
Tani po mbushim ekranin me copëza të botës nëpërmjet një for të thjeshtë dhe procedurës themelore për të nxjerrë dhoma dhe kalime, përveç kësaj përshtatëm armiqtë dhe sendet, dhe për të siguruar rastësinë e plotë mos e harro 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 na nevojitet ndonjë mënyrë për të mos kaluar përmes mureve dhe monstrujve, të marrim bonuse nga sendet.
Të preferuarat tona for 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.Meni
Menun e shfaqim thjesht në ekran, duke numëruar pikët, me ndihmën e getkey() përpunojmë zgjedhjen e lojtarit. Shkruajmë status-barin e karakterit, realizojmë menunë e përmirësimeve, shkruajmë historinë e prapambetjes dhe marrim atë që e quajta «Subsoil» («Nëntokë»).
Përfundim
Kjo është një gjë e tillë. Mund të luani në të, , duke e çarë dhe duke e nisur kështu:
$ sudo chmod +x Subsoil-1.0/Subsoil$ Subsoil-1.0/Subsoil, ose, përfundimisht, duke u frymëzuar, të shkruani një aventurë sipas dëshirës suaj. E paralajmëroj me kohë: loja ime nuk është e lehtë!
Lidhjet
, .
Burimi: habr.com
