Einführung
„Linux ist nichts für Spiele!“ - ein veralteter Satz: Mittlerweile gibt es viele wunderbare Spiele speziell für dieses wunderbare System. Aber trotzdem möchte man manchmal etwas Besonderes, das zu einem passt ... Und ich habe beschlossen, dieses besondere Ding zu kreieren.
Основа
Ich werde nicht den gesamten Code zeigen und erzählen (er ist nicht sehr interessant), sondern nur die Hauptpunkte.
1.Charakter
Hier werden alle Charakterparameter aufgelistet (Gesundheit, Rüstung, Erfahrung usw.). Interessant ist die Zeichnung und Bewegungsrichtung (die derzeit nicht verfügbar ist).
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.Management
Wie das Zeichen verschoben wird, ist bereits klar (x—++, y—++). Interessanter ist aber die Tastaturverarbeitung:
char key;
char getkey()
{
system("stty raw");
key = getchar();
system("stty cooked");
return key;
}
Jetzt müssen nur noch die „Steuerzeichen“ eingestellt werden. Sie können es mit dem Schalter tun, aber ich hasse es.
switch(...) case .. : ... ; break
besser so
#define KEY if (key ==
#define I ){
#define J ;}else
void keys()
{
getkey();
KEY 'a' I x-- ; pos = 1 J
KEY......
}
Schönheit! Schleifen Sie Funktionen und laufen Sie über den Bildschirm! Aber irgendwie ist es etwas hart... Und der Cursor blinkt und die Buchstaben... Wir werden es reparieren!
//До цикла
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");
Wow! Ein Prozent ist fertig!
3. Die Welt um uns herum
Hier erstellen wir Arrays für x- und y-Teile der Welt und die Teile selbst (char o[N])
, das Gleiche gilt für Monster und Boni.
Erstellen Sie eine Funktion world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N])
in Analogie zu hero()
, aber mit Parametern und einer zusätzlichen Schleife zur Ausgabe des Arrays ... aus Spaß zeichnen wir nur im Sichtfeld (vis) (if (ox[k] < vis && oy[k]....))
Jetzt füllen wir mit einem einfachen Mittel den Bildschirm mit Partikeln der Welt und höhlen prozedural Räume und Gänge aus, gleichzeitig betreten wir Feinde und Objekte, um völlige Zufälligkeit zu gewährleisten, die wir nicht vergessen 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.Interaktion
Jetzt müssen wir es irgendwie vermeiden, durch Wände und Monster zu gehen und Boni von Gegenständen zu erhalten.
Unsere Favoriten sind for und #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ü
Wir zeigen einfach das Menü an, nummerieren die Elemente und verwenden getkey(), um die Auswahl des Spielers zu verarbeiten. Wir schreiben die Statusleiste des Charakters, implementieren das Levelmenü, schreiben die Hintergrundgeschichte und erhalten das, was ich „Subsoil“ genannt habe.
Abschluss
Das ist so etwas. Du kannst es spielen
$ sudo chmod +x Subsoil-1.0/Subsoil
$ Subsoil-1.0/Subsoil
Oder schreiben Sie sich, endlich inspiriert, ein Abenteuer ganz nach Ihrem Geschmack. Ich warne Sie im Voraus: Mein Spiel ist nicht einfach!
Links
Source: habr.com