Ievads
“Linux nav paredzēts spēlēm!” - novecojusi frāze: tagad ir daudz brīnišķīgu spēļu, kas īpaši paredzētas šai brīnišķīgajai sistēmai. Bet tomēr dažreiz gribas kaut ko īpašu, kas tev piestāvētu... Un es nolēmu izveidot šo īpašo lietu.
Основа
Es nerādīšu un nepateikšu visu kodu (tas nav īpaši interesanti) - tikai galvenie punkti.
1. Raksturs
Šeit ir uzskaitīti visi rakstura parametri (veselība, bruņas, pieredze utt.) Interesanti ir zīmējums un kustības virziens (kas šobrīd nav pieejams).
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.Vadība
Kā pārvietot rakstzīmi, jau ir skaidrs (x—++, y—++). Bet tastatūras apstrāde ir interesantāka:
char key;
char getkey()
{
system("stty raw");
key = getchar();
system("stty cooked");
return key;
}
Atliek tikai iestatīt “vadības rakstzīmes”. Jūs varat to izdarīt, izmantojot slēdzi, bet es to ienīstu.
switch(...) case .. : ... ; break
labāk šādi
#define KEY if (key ==
#define I ){
#define J ;}else
void keys()
{
getkey();
KEY 'a' I x-- ; pos = 1 J
KEY......
}
Skaistums! Cilpa funkcijas un skrien pa ekrānu! Bet kaut kā tas ir mazliet skarbi... Un kursors mirgo, un burti... Mēs to izlabosim!
//До цикла
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");
Oho! Viens procents ir gatavs!
3.Pasaule ap mums
Šeit mēs veidojam masīvus x, y pasaules gabaliem un pašiem gabaliem (char o[N])
, tas pats par monstriem un prēmijām.
Izveidojiet funkciju world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N])
pēc analoģijas ar hero()
, bet ar parametriem un papildus cilpu masīva izvadīšanai... prieka pēc zīmējam tikai redzes laukā (vis) (if (ox[k] < vis && oy[k]....))
Tagad mēs aizpildām ekrānu ar pasaules daļiņām, izmantojot vienkāršas un procedurāli dobas telpas un ejas, tajā pašā laikā ievadām ienaidniekus un objektus, pilnīgai nejaušībai neaizmirstam par 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.Mijiedarbība
Tagad mums kaut kā jāizvairās no šķērsošanas sienām un monstriem un jāsaņem bonusi no priekšmetiem.
Mūsu favorīti ir par un #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.Izvēlne
Mēs vienkārši parādām izvēlni, numurējot vienumus un izmantojam getkey(), lai apstrādātu spēlētāja izvēli. Mēs rakstām varoņa statusa joslu, ieviešam izlīdzināšanas izvēlni, uzrakstām aizmugures stāstu un iegūstam to, ko es saucu par “Apakšaugsni”.
Secinājums
Tas ir kaut kas līdzīgs šim. Jūs varat to spēlēt
$ sudo chmod +x Subsoil-1.0/Subsoil
$ Subsoil-1.0/Subsoil
, vai, visbeidzot, iedvesmojoties, uzrakstiet sev piedzīvojumu, kas jums patīk. Jau iepriekš brīdinu: mana spēle nav viegla!