
מבוא
"לינוקס זה לא למשחקים!" זה ביטוי מיושן: כיום ישנם משחקים רבים ונהדרים במיוחד עבור המערכת הנפלאה הזו. אבל עדיין, לפעמים אתה רוצה משהו מיוחד שיתאים לך... והחלטתי ליצור את המשחק המיוחד הזה.
Основа
אני לא אראה ואספר לכם את כל הקוד (זה לא ממש מעניין) - רק את הנקודות העיקריות.
1. דמות
כל הפרמטרים של הדמות רשומים כאן (בריאות, שריון, ניסיון וכו'). הציור וכיוון התנועה (שנעדרים כרגע) מעניינים.
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. ניהול
כיצד להזיז את התו כבר ברור (x—++, y—++). אבל אופן הטיפול במקלדת מעניין יותר:
char key;
char getkey()
{
system("stty raw");
key = getchar();
system("stty cooked");
return key;
}
כל מה שנותר הוא להגדיר את "תווי הבקרה". ניתן לעשות זאת באמצעות switch, אבל אני שונא את זה.
switch(...) case .. : ... ; break יותר טוב ככה
#define KEY if (key ==
#define I ){
#define J ;}else
void keys()
{
getkey();
KEY 'a' I x-- ; pos = 1 J
KEY......
}
יפה! אנחנו מבצעים לולאה של הפונקציות ורצים מסביב למסך! אבל זה קצת פתאומי... הסמן והאותיות מהבהבות... נתקן את זה!
//До цикла
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");
וואו! אחוז אחד מוכן!
3. העולם סביבנו
כאן אנו יוצרים מערכים עבור x ו-y חלקים של העולם והחלקים עצמם. (char o[N]), אותו הדבר לגבי מפלצות ובונוסים.
צור פונקציה world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) באנלוגיה עם hero(), אבל עם פרמטרים ולולאה נוספת לפלט המערך... בשביל הכיף, אנחנו מציירים רק בשדה הראייה (vis) (if (ox[k] < vis && oy[k]....))
כעת אנו ממלאים את המסך בחלקיקי העולם באמצעות דרך פשוטה ומרוקנים חדרים ומעברים באופן פרוצדורלי, ובמקביל אנו נכנסים לאויבים וחפצים, לאקראיות מוחלטת שאיננו שוכחים. 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. אינטראקציה
עכשיו אנחנו צריכים איכשהו להימנע ממעבר דרך קירות ומפלצות, ולקבל בונוסים מפריטים.
האהוב עלינו עבור ו#מגדיר
#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. תפריט
אנחנו פשוט מציגים את התפריט על המסך, ממספרים את הפריטים ומעבדים את בחירת השחקן באמצעות הפקודה getkey(). אנחנו כותבים את שורת המצב של הדמות, מיישמים את תפריט השדרוג, כותבים את סיפור הרקע ומקבלים את מה שקראתי "תת-קרקע".
מסקנה
זה משהו כזה. אתה יכול לשחק את זה, , לפרוק ולהפעיל אותו כך:
$ sudo chmod +x Subsoil-1.0/Subsoil$ Subsoil-1.0/Subsoil, או, סוף סוף בהשראה, כתבו לעצמכם הרפתקה לטעמכם. אני מזהיר אתכם מראש: המשחק שלי אינו קל!
קישורים
, .
מקור: www.habr.com
