Introducció
"Linux no és per a jocs!" - una frase obsoleta: ara hi ha molts jocs meravellosos específics per a aquest meravellós sistema. Però tot i així, de vegades vols alguna cosa especial que et convingui... I vaig decidir crear aquesta cosa especial.
fundació
No mostraré ni explicaré tot el codi (no és gaire interessant), només els punts principals.
1.Personatge
Aquí s'enumeren tots els paràmetres del personatge (salut, armadura, experiència, etc.) És interessant el dibuix i la direcció del moviment (que actualment no està disponible).
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.Gestió
Com moure el personatge ja està clar (x—++, y—++). Però el processament del teclat és més interessant:
char key;
char getkey()
{
system("stty raw");
key = getchar();
system("stty cooked");
return key;
}
Només queda establir els "caràcters de control". Podeu fer-ho fent servir l'interruptor, però ho odio.
switch(...) case .. : ... ; break
millor així
#define KEY if (key ==
#define I ){
#define J ;}else
void keys()
{
getkey();
KEY 'a' I x-- ; pos = 1 J
KEY......
}
Bellesa! Funcions de bucle i córrer per la pantalla! Però d'alguna manera és una mica dur... I el cursor parpelleja, i les lletres... Ho arreglarem!
//До цикла
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");
Vaja! Un per cent està llest!
3.El món que ens envolta
Aquí fem matrius per a peces x, y del món i les peces mateixes (char o[N])
, el mateix per a monstres i bonificacions.
Crea una funció world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N])
per analogia amb hero()
, però amb paràmetres i un bucle addicional per a la sortida de la matriu... per diversió, dibuixem només al camp de visió (vis) (if (ox[k] < vis && oy[k]....))
Ara omplim la pantalla de partícules del món utilitzant un senzill i buit procedimentalment habitacions i passatges, alhora que entrem enemics i objectes, per a una aleatorietat total que no ens oblidem. 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.Interacció
Ara hem d'evitar d'alguna manera passar per parets i monstres i rebre bonificacions dels articles.
Els nostres preferits són per i #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ú
Simplement mostrem el menú, numeram els elements i fem servir getkey() per processar l'elecció del jugador. Escrivim la barra d'estat del personatge, implementem el menú d'anivellament, escrivim la història de fons i obtenim el que vaig anomenar "Subsòl".
Conclusió
Això és una cosa així. Podeu jugar-hi
$ sudo chmod +x Subsoil-1.0/Subsoil
$ Subsoil-1.0/Subsoil
, o, finalment, inspirat, escriu-te una aventura al teu gust. Us aviso per endavant: el meu joc no és fàcil!
Enllaços
Font: www.habr.com