Ynlieding
"Linux is net foar spultsjes!" - in ferâldere sin: no binne d'r in protte prachtige spultsjes spesifyk foar dit prachtige systeem. Mar dochs, soms wolle jo wat bysûnders dat by jo past ... En ik besleat dit bysûndere ding te meitsjen.
Basis
Ik sil de hiele koade net sjen litte en fertelle (it is net heul ynteressant) - allinich de haadpunten.
1. Karakter
Alle karakter parameters wurde neamd hjir (sûnens, harnas, ûnderfining, ensfh) Fan belang is de tekening en rjochting fan beweging (dat is op it stuit net beskikber).
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.Bestjoer
Hoe it karakter te ferpleatsen is al dúdlik (x—++, y—++). Mar de toetseboerdferwurking is ynteressanter:
char key;
char getkey()
{
system("stty raw");
key = getchar();
system("stty cooked");
return key;
}
Alles wat oerbliuwt is de "kontrôlekarakters" yn te stellen. Jo kinne it dwaan mei help fan switch, mar ik haatsje it.
switch(...) case .. : ... ; break
better sa
#define KEY if (key ==
#define I ){
#define J ;}else
void keys()
{
getkey();
KEY 'a' I x-- ; pos = 1 J
KEY......
}
Skientme! Loop funksjes en rinne om it skerm! Mar op ien of oare manier is it in bytsje hurd ... En de rinnerke flitst, en de letters ... Wy sille it reparearje!
//До цикла
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! Ien persint is klear!
3.De wrâld om ús hinne
Hjir meitsje wy arrays foar x, y stikken fan 'e wrâld en de stikken sels (char o[N])
, itselde foar meunsters en bonussen.
Meitsje in funksje world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N])
troch analogy mei hero()
, mar mei parameters en in ekstra lus foar it útfieren fan 'e array ... foar wille tekenje wy allinich yn it sichtfjild (vis) (if (ox[k] < vis && oy[k]....))
No folje wy it skerm mei dieltsjes fan 'e wrâld mei help fan in ienfâldige foar en prosedureel hol út keamers en passaazjes, tagelyk wy ynfiere fijannen en objekten, foar folsleine willekeurigens wy net ferjitte oer 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.Ynteraksje
No moatte wy op ien of oare manier foarkomme troch muorren en meunsters te gean en bonussen te ûntfangen fan items.
Us favoriten binne foar en #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
Wy litte gewoan it menu werjaan, de items nûmere, en brûke getkey () om de kar fan de spiler te ferwurkjen. Wy skriuwe de statusbalke fan it karakter, ymplementearje it nivelleringsmenu, skriuwe it efterferhaal, en wy krije wat ik "Subsoil" neamde.
konklúzje
Dit is sa'n ding. Do kinst spylje it
$ sudo chmod +x Subsoil-1.0/Subsoil
$ Subsoil-1.0/Subsoil
, of, úteinlik ynspirearre, skriuw josels in aventoer fan jo eigen smaak. Ik warskôgje jo foarôf: myn spultsje is net maklik!
Links
Boarne: www.habr.com