Paraqitje
"Linux nuk është për lojëra!" - një frazë e vjetëruar: tani ka shumë lojëra të mrekullueshme posaçërisht për këtë sistem të mrekullueshëm. Por megjithatë, ndonjëherë ju dëshironi diçka të veçantë që do t'ju përshtatej... Dhe vendosa të krijoj këtë gjë të veçantë.
themel
Unë nuk do të tregoj dhe tregoj të gjithë kodin (nuk është shumë interesant) - vetëm pikat kryesore.
1.Karakteri
Të gjithë parametrat e karakterit janë renditur këtu (shëndeti, forca të blinduara, përvoja, etj.) Me interes është vizatimi dhe drejtimi i lëvizjes (i cili aktualisht nuk disponohet).
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
Si të lëvizni karakterin tashmë ë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;
}
E tëra që mbetet është të vendosni "karakteret e kontrollit". Mund ta bësh duke përdorur çelësin, por e urrej.
switch(...) case .. : ... ; break
më mirë si kjo
#define KEY if (key ==
#define I ){
#define J ;}else
void keys()
{
getkey();
KEY 'a' I x-- ; pos = 1 J
KEY......
}
Bukuroshja! Loop funksionet dhe vraponi rreth ekranit! Por disi është pak e ashpër... 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");
Uau! Një për qind është gati!
3. Bota rreth nesh
Këtu bëjmë vargje për x, y pjesë të botës dhe vetë pjesët (char o[N])
, e njëjta gjë për përbindëshat dhe shpërblimet.
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 daljen e grupit... për argëtim, vizatojmë vetëm në fushën e shikimit (vis) (if (ox[k] < vis && oy[k]....))
Tani e mbushim ekranin me grimca të botës duke përdorur dhoma dhe pasazhe të thjeshta dhe procedurale të zbrazëta, në të njëjtën kohë futemi në armiq dhe objekte, për një rastësi të plotë që 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 monstra dhe të marrim shpërblime nga artikujt.
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.Menyja
Ne thjesht shfaqim menunë, duke numëruar artikujt dhe përdorim getkey() për të përpunuar zgjedhjen e lojtarit. Ne shkruajmë shiritin e statusit të personazhit, zbatojmë menunë e nivelimit, shkruajmë prapaskenat dhe marrim atë që unë e quajta "Subtoil".
Përfundim
Kjo është diçka e tillë. Mund ta luani
$ sudo chmod +x Subsoil-1.0/Subsoil
$ Subsoil-1.0/Subsoil
, ose, në fund të frymëzuar, shkruani vetes një aventurë sipas dëshirës tuaj. Ju paralajmëroj paraprakisht: loja ime nuk është e lehtë!
Lidhjet
Burimi: www.habr.com