
Sissejuhatus
„Linux ei ole mängude jaoks!“ — vananenud väljend: nüüd on olemas palju imelikke mänge, mis on loodud just selle suurepärase süsteemi jaoks. Kuid vahel on ikka hea saada midagi erilist, mis sobib just sulle... Ja ma otsustasin luua selle erilise.
Põhi
Ma ei kavatse näidata ja rääkida kogu koodist (see ei ole väga huvitav) — ainult peamised punktid.
1. Isikustatud tegelane
Siin on loetletud kõik tegelase parameetrid (tervis, kaitse, kogemus jne), huvi keskpunktiks on joonistamine ja liikumise suund (mida praegu ei ole).
int x = 5, y = 5;
hp = 100,
maxhp = 100,
dm = 20,
armor = 0,
xp = 0,
level = 0,
diff = 10, // raskus
pos = 0; // suund
bool reg = 0,
Mdm = 0, // boonus
ght = 0;
string color; // värv kasutatakse kangelase seisundi indikaatorina
void hero() // siin toimub kangelase liikumine koordinaatidele (x ; y)
{
cout << "e[u " << "e[0;0H"; // kursoriseisu taastamine, tühikutega katmine
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 << "╬"; // kursoriseisu salvestamine
}
2. Juhtimine
Kuidas tegelast liikuda, on selge (x—++, y—++). Kuid klaviatuuri töötlemine on huvitavam:
char key;
char getkey()
{
system("stty raw");
key = getchar();
system("stty cooked");
return key;
}
Jäänud on ainult määrata "juhtivate sümbolite" väärtused. Seda saab teha switch’i abil, kuid ma ei salli seda.
switch(...) case .. : ... ; break parem on nii
#define KEY if (key ==
#define I ){
#define J ;}else
void keys()
{
getkey();
KEY 'a' I x-- ; pos = 1 J
KEY......
}
Ilus! Tsüklime funktsioone ja jookseme ekraanil! Kuid see on veidi äkiline… Ja kursor vilgub ja tähed… Parandame selle!
//До цикла
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");
Oh-oh-oh! Üks protsent valmis!
3. Ümbritsev maailm
Siin teeme massiivid x, y maailma tükkide ja nende tükkide jaoks. (char o[N]), sama ka koletiste ja boonuste jaoks.
Loome funktsiooni world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) sarnasel põhjusel hero(), kuid parameetritega ja täiendava tsükliga massiivi väljatrükiks... huvi pärast joonistame ainult nähtavuses (vis) (if (ox[k] < vis && oy[k]....))
Nüüd täidame ekraani maailma tükkidega lihtsa for’i kaudu ja protseduuriliselt kujuvad toad ja korridore, samas kirjutame sisse vaenlased ja esemed, et täielikuks juhuslikkuseks ei unustaks 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. Koostöö
Nüüd peame kuidagi vältima seinte ja koletiste kaudu läbimist, saama boonuseid esemetelt.
Meie lemmikud for ja #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. Menüüd
Menüü kuvame lihtsalt ekraanile, nummerdades punkte, töötleme mängija valikut getkey() abil. Kirjutame tegelase staatuse, rakendame arendusmenüü, kirjutame tausta ning saame selle, mida nimetasin „Subsoil“ („Alusmuld“).
Kokkuvõte
Selline asi. Sa saad selles mängida, , dekomprimeerides ja käivitades nii:
$ sudo chmod +x Subsoil-1.0/Subsoil$ Subsoil-1.0/Subsoil, või siis, lõpuks, innustunud, kirjutata endale seiklus vastavalt oma maitsele. Eelmärkus: minu mäng pole kergest otsast!
Lingid
, .
Allikas: habr.com
