Inleiding
"Linux is nie vir speletjies nie!" - 'n verouderde frase: nou is daar baie wonderlike speletjies spesifiek vir hierdie wonderlike stelsel. Maar tog, soms wil jy iets spesiaals hΓͺ wat by jou sal pas... En ek het besluit om hierdie spesiale ding te skep.
fondament
Ek sal nie die hele kode wys en vertel nie (dit is nie baie interessant nie) - net die hoofpunte.
1.Karakter
Alle karakterparameters word hier gelys (gesondheid, wapenrusting, ervaring, ens.) Van belang is die tekening en rigting van beweging (wat nie tans beskikbaar is nie).
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.Bestuur
Hoe om die karakter te skuif, is reeds duidelik (xβ++, yβ++). Maar die sleutelbordverwerking is interessanter:
char key;
char getkey()
{
system("stty raw");
key = getchar();
system("stty cooked");
return key;
}
Al wat oorbly is om die "kontrole karakters" te stel. Jy kan dit doen met skakelaar, maar ek haat dit.
switch(...) case .. : ... ; break
beter so
#define KEY if (key ==
#define I ){
#define J ;}else
void keys()
{
getkey();
KEY 'a' I x-- ; pos = 1 J
KEY......
}
Skoonheid! Loop funksies en hardloop om die skerm! Maar op een of ander manier is dit 'n bietjie hard ... En die wyser flits, en die letters ... Ons sal dit regmaak!
//ΠΠΎ ΡΠΈΠΊΠ»Π°
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");
Sjoe! Een persent is gereed!
3.Die wΓͺreld om ons
Hier maak ons ββskikkings vir x, y stukke van die wΓͺreld en die stukke self (char o[N])
, dieselfde vir monsters en bonusse.
Skep 'n funksie world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N])
na analogie met hero()
, maar met parameters en 'n bykomende lus vir die uitvoer van die skikking ... vir die pret, teken ons slegs in die gesigsveld (vis) (if (ox[k] < vis && oy[k]....))
Nou vul ons die skerm met deeltjies van die wΓͺreld deur gebruik te maak van 'n eenvoudige vir en prosedureel uithol kamers en gange, terselfdertyd betree ons vyande en voorwerpe, vir volledige willekeurigheid waarvan ons nie vergeet nie 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.Interaksie
Nou moet ons op een of ander manier vermy om deur mure en monsters te gaan en bonusse van items te ontvang.
Ons gunstelinge is vir en #definieer
#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. Kieslys
Ons vertoon eenvoudig die spyskaart, nommer die items, en gebruik getkey() om die speler se keuse te verwerk. Ons skryf die karakter se statusbalk, implementeer die nivelleringskieslys, skryf die agtergrond, en ons kry wat ek "Subsoil" genoem het.
Gevolgtrekking
Dit is so iets. Jy kan dit speel
$ sudo chmod +x Subsoil-1.0/Subsoil
$ Subsoil-1.0/Subsoil
, of, uiteindelik geΓ―nspireer, skryf vir jou 'n avontuur van jou eie smaak. Ek waarsku jou vooraf: my spel is nie maklik nie!
Skakels
Bron: will.com