Esittely
"Linux ei ole peleihin!" - vanhentunut lause: nyt on monia upeita pelejä erityisesti tätä upeaa järjestelmää varten. Mutta silti, joskus haluat jotain erityistä, joka sopisi sinulle... Ja päätin luoda tämän erikoisen.
Основа
En näytä ja kerro koko koodia (se ei ole kovin mielenkiintoista) - vain pääkohdat.
1.Hahmo
Kaikki hahmoparametrit on lueteltu tässä (terveys, panssari, kokemus jne.) Kiinnostava on piirustus ja liikesuunta (joita ei ole tällä hetkellä saatavilla).
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. Hallinto
Hahmon siirtäminen on jo selvä (x—++, y—++). Mutta näppäimistön käsittely on mielenkiintoisempaa:
char key;
char getkey()
{
system("stty raw");
key = getchar();
system("stty cooked");
return key;
}
Jäljelle jää vain "ohjausmerkit" asettaminen. Voit tehdä sen kytkimellä, mutta vihaan sitä.
switch(...) case .. : ... ; break
parempi näin
#define KEY if (key ==
#define I ){
#define J ;}else
void keys()
{
getkey();
KEY 'a' I x-- ; pos = 1 J
KEY......
}
Kauneus! Tee silmukkatoimintoja ja juokse näytön ympäri! Mutta jotenkin se on vähän ankara... Ja kohdistin vilkkuu, ja kirjaimet... Korjaamme sen!
//До цикла
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");
Vau! Yksi prosentti on valmis!
3. Maailma ympärillämme
Täällä teemme taulukoita x, y maailman palasille ja itse kappaleille (char o[N])
, sama koskee hirviöitä ja bonuksia.
Luo funktio world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N])
analogisesti kanssa hero()
, mutta parametreilla ja lisäsilmukalla taulukon tulostamista varten... huvin vuoksi piirrämme vain näkökentässä (vis) (if (ox[k] < vis && oy[k]....))
Nyt täytämme näytön maailman hiukkasilla käyttämällä yksinkertaisia ja menettelyllisesti onttoja huoneita ja käytäviä, samalla syötämme vihollisia ja esineitä, täydellisen satunnaisuuden vuoksi emme unohda 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. Vuorovaikutus
Nyt meidän on jotenkin vältettävä seinien ja hirviöiden läpikulkua ja saatava bonuksia esineistä.
Suosikkimme ovat for and #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.Valikko
Näytämme vain valikon numeroimalla kohteet ja käsittelemme pelaajan valinnan käyttämällä getkey()-komentoa. Kirjoitamme hahmon tilapalkkiin, toteutamme tasoitusvalikon, kirjoitamme taustatarinoita ja saamme sen, mitä minä kutsuin "Subsoil".
Johtopäätös
Tämä on jotain tämän kaltaista. Voit pelata sitä
$ sudo chmod +x Subsoil-1.0/Subsoil
$ Subsoil-1.0/Subsoil
, tai vihdoin inspiroituneena kirjoita itsellesi mieleisesi seikkailu. Varoitan sinua etukäteen: pelini ei ole helppoa!
Linkit
Lähde: will.com