
Introductie
"Linux is niet voor games!" - een ouderwetse uitdrukking: tegenwoordig zijn er zoveel geweldige spellen speciaal voor dit geweldige systeem. Maar soms wil je toch iets speciaals dat bij je past... En ik besloot om dat speciale ding te creëren.
Основа
Ik zal je niet de hele code laten zien en vertellen (het is niet erg interessant), maar alleen de belangrijkste punten.
1. Karakter
Alle parameters van het personage worden hier vermeld (gezondheid, pantser, ervaring, etc.). De tekening en de bewegingsrichting (die momenteel ontbreekt) zijn van belang.
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. Beheer
Hoe het karakter verplaatst moet worden is al duidelijk (x—++, y—++). Maar de toetsenbordverwerking is interessanter:
char key;
char getkey()
{
system("stty raw");
key = getchar();
system("stty cooked");
return key;
}
Het enige dat nog rest is het instellen van de "controlekarakters". Het kan met een schakelaar, maar ik haat het.
switch(...) case .. : ... ; break beter zo
#define KEY if (key ==
#define I ){
#define J ;}else
void keys()
{
getkey();
KEY 'a' I x-- ; pos = 1 J
KEY......
}
Schoonheid! We herhalen functies en rennen rond op het scherm! Maar het is een beetje abrupt… De cursor knippert, en de letters… We gaan het oplossen!
//До цикла
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");
Oei! Eén procent is klaar!
3. De wereld om ons heen
Hier maken we arrays voor x, y stukken van de wereld en de stukken zelf (char o[N]), hetzelfde geldt voor monsters en bonussen.
Een functie maken world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) naar analogie met hero(), maar met parameters en een extra lus voor het uitgeven van de array... voor de lol tekenen we alleen in het gezichtsveld (vis) (if (ox[k] < vis && oy[k]....))
Nu vullen we het scherm met deeltjes van de wereld met behulp van een eenvoudige voor en hollen procedureel kamers en doorgangen uit, tegelijkertijd voeren we vijanden en objecten in, voor volledige willekeur vergeten we niet 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. Interactie
Nu moeten we op een of andere manier voorkomen dat we door muren en monsters heen gaan, en bonussen van voorwerpen krijgen.
Onze favoriet voor 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
We tonen simpelweg het menu op het scherm, nummeren de items en gebruiken getkey() om de keuze van de speler te verwerken. We schrijven een karakterstatusbalk, implementeren een levelmenu, schrijven een achtergrondverhaal en krijgen wat ik "Ondergrond" noem.
Conclusie
Zoiets. Je kunt het spelen, , uitpakken en uitvoeren als volgt:
$ sudo chmod +x Subsoil-1.0/Subsoil$ Subsoil-1.0/Subsoilof, als u eindelijk geïnspireerd bent, schrijf dan zelf een avontuur naar uw eigen smaak. Ik waarschuw je alvast: mijn spel is niet gemakkelijk!
Koppelingen
, .
Bron: www.habr.com
