Inngangur
"Linux er ekki fyrir leiki!" - gamaldags setning: nú eru margir dásamlegir leikir sérstaklega fyrir þetta frábæra kerfi. En samt, stundum langar manni í eitthvað sérstakt sem myndi henta manni... Og ég ákvað að búa til þennan sérstaka hlut.
Grundvöllur
Ég mun ekki sýna og segja allan kóðann (hann er ekki mjög áhugaverður) - bara aðalatriðin.
1.Persóna
Allar persónubreytur eru skráðar hér (heilsa, herklæði, reynsla osfrv.) Áhugavert er teikning og hreyfistefna (sem er ekki tiltækt eins og er).
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.Stjórn
Hvernig á að færa persónuna er þegar ljóst (x—++, y—++). En lyklaborðsvinnslan er áhugaverðari:
char key;
char getkey()
{
system("stty raw");
key = getchar();
system("stty cooked");
return key;
}
Allt sem er eftir er að stilla „stýringarstafina“. Þú getur gert það með því að nota rofa, en ég hata það.
switch(...) case .. : ... ; break
betra svona
#define KEY if (key ==
#define I ){
#define J ;}else
void keys()
{
getkey();
KEY 'a' I x-- ; pos = 1 J
KEY......
}
Fegurð! Lykkjuaðgerðir og hlaupið um skjáinn! En einhvern veginn er það svolítið harkalegt... Og bendillinn blikkar, og stafirnir... Við reddum því!
//До цикла
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");
Vá! Eitt prósent er tilbúið!
3.Heimurinn í kringum okkur
Hér búum við til fylki fyrir x, y stykki af heiminum og stykkin sjálf (char o[N])
, Sama fyrir skrímsli og bónusa.
Búðu til aðgerð world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N])
í líkingu við hero()
, en með breytum og auka lykkju til að gefa út fylkið... til gamans teiknum við aðeins í sjónsviðinu (vis) (if (ox[k] < vis && oy[k]....))
Nú fyllum við skjáinn af ögnum heimsins með því að nota einfalt fyrir og málsmeðferð hol út herbergi og göngum, á sama tíma förum við inn í óvini og hluti, fyrir algjört tilviljun sem við gleymum ekki. 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.Samskipti
Nú þurfum við einhvern veginn að forðast að fara í gegnum veggi og skrímsli og fá bónusa frá hlutum.
Uppáhaldið okkar er fyrir og #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.Valmynd
Við birtum einfaldlega valmyndina, númerum atriðin og notum getkey() til að vinna úr vali leikmannsins. Við skrifum stöðustiku persónunnar, innleiðum jöfnunarvalmyndina, skrifum baksöguna og við fáum það sem ég kallaði „Unlag“.
Ályktun
Þetta er eitthvað svona. Þú getur spilað það
$ sudo chmod +x Subsoil-1.0/Subsoil
$ Subsoil-1.0/Subsoil
, eða, loksins innblástur, skrifaðu þér ævintýri sem þú vilt. Ég vara þig fyrirfram: leikurinn minn er ekki auðveldur!
Tenglar
Heimild: www.habr.com