
Hyrje
«Linux nuk është për lojra!» — një shprehje e vjetruar: tani ka shumë lojra të mrekullueshme të krijuara posaçërisht për këtë sistem të mrekullueshëm. Por ndonjëherë, dëshiron diçka të veçantë, që do t'i përshtatej pikërisht ty… Kështu që vendosa të krijoj këtë të veçantë.
Themel
Nuk do të tregoj dhe të shpjegoj të gjithë kodin (nuk është shumë interesante) — vetëm elementet kryesore.
1. Personazhi
Këtu janë të gjithë parametrat e personazhit (shëndeti, mbrojtja, përvoja etj) interesante është përmirësimi dhe drejtimi (të cilat aktualisht nuk ekzistojnë).
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, // bonuse
ght = 0;
string color; // ngjyra do të përdoret si indikator i gjendjes së heroit
void hero() // këtu ndodh lëvizja e heroit në koordinatat (x ; y)
{
cout << "e[u " << "e[0;0H"; // rikuperimi i pozitës së 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 pozitës së kursorit
}
2. Kontrolli
Si të lëvizësh personazhin është e qartë (x—++, y—++). Por trajtimi i tastierës është më interesante:
char key;
char getkey()
{
system("stty raw");
key = getchar();
system("stty cooked");
return key;
}
Kështu që mbetet vetëm të caktosh «simbolet kontrolluese». Mund ta bësh me anë të switch-it, 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! Mbylle funksionet dhe vrapo mbi ekran! Por është disi e ashpër… Edhe kursorin po ndriçon, edhe 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");
Uf—h! Një përqind është gati!
3. Bota përreth
Këtu krijojmë array për x, y copat e botës dhe vetë copat (char o[N]), e njëjta për monstret dhe bonuset.
Krijojmë funksionin world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) sipër hero(), por me parametra dhe një cikël shtesë për daljen e array-it… për interes ne vizatojmë vetëm në fushën e shikimit (vis) (if (ox[k] < vis && oy[k]....))
Tani po mbushim ekranin me copa të botës nëpërmjet një for të thjeshtë dhe procedurorisht po krijojmë dhoma dhe kalime, po ashtu përfshijmë armiq dhe objekte, për të siguruar rastësirën nuk harrojmë për 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 interaccióni
Tani na nevojitet diçka për të mos kaluar përmes mureve dhe monsterëve, për të marrë bonuse nga objektet.
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. Menuja
Menuja thjesht e nxjerrim në ekran, numërojmë pikat, me anë të getkey() përpunojmë zgjedhjen e lojtarit. Shkruajmë status-bar të personazhit, realizojmë menu për përmirësim, shkruajmë historikun, dhe marrim atë që e quajta «Subsoil»(«Nën Tokë»).
Përfundimi
Kështu që është diçka. Mund të luani me të, , duke e zbuluar dhe duke e drejtuar kështu:
$ sudo chmod +x Subsoil-1.0/Subsoil$ Subsoil-1.0/Subsoil, ose me entuziazëm, të shkruani një aventurë sipas dëshirës tuaj. Paraprakisht paralajmëroj: loja ime nuk është e lehtë!
Lidhjet
, .
Burimi: habr.com
