
kirish
"Linux o'yin uchun emas!" eskirgan ibora: hozirda ushbu ajoyib tizim uchun maxsus ishlab chiqilgan juda ko'p ajoyib o'yinlar mavjud. Lekin ba'zida siz o'zgacha bir narsani xohlaysiz, o'zingizga to'g'ri keladigan narsani... Va men buni o'ziga xos narsani yaratishga qaror qildim.
Asosiy
Men sizga barcha kodni ko'rsatmayman va aytmayman (bu juda qiziq emas) - faqat asosiy fikrlar.
1. Belgi
Barcha belgilar parametrlari (salomatlik, zirh, tajriba va boshqalar) bu erda keltirilgan. Chizilgan rasm va harakat yo'nalishi (hozirda mavjud emas) qiziqish uyg'otadi.
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. Menejment
Belgini qanday ko'chirish allaqachon aniq (x-++, y-++). Ammo klaviatura bilan ishlash qiziqroq:
char key;
char getkey()
{
system("stty raw");
key = getchar();
system("stty cooked");
return key;
}
Faqatgina "nazorat belgilari" ni o'rnatish qoladi. Buni kalit bilan qilish mumkin, lekin men undan nafratlanaman.
switch(...) case .. : ... ; break Bu kabi yaxshiroq
#define KEY if (key ==
#define I ){
#define J ;}else
void keys()
{
getkey();
KEY 'a' I x-- ; pos = 1 J
KEY......
}
Chiroyli! Biz funksiyalarni aylantirmoqdamiz va ekran atrofida aylanyapmiz! Lekin biroz chayqaladi... Kursor tinmay miltillaydi, harflar ham... Buni tuzatamiz!
//До цикла
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");
Voy! Bir foiz tayyor!
3. Atrofimizdagi dunyo
Bu erda biz dunyoning x, y qismlari va bo'laklarning o'zlari uchun massivlar yaratamiz (char o[N]), HAYVONLAR va bonuslar uchun bir xil.
Funktsiya yarating world(int objx[N] .... objy[N] ... obj[N], ... objcolor[N]) bilan o'xshashlik bilan hero(), lekin massivni chiqarish uchun parametrlar va qoʻshimcha halqa bilan... oʻyin-kulgi uchun biz faqat koʻrish maydonida chizamiz (vis) (if (ox[k] < vis && oy[k]....))
Endi biz ekranni dunyoning zarralari bilan oddiy va protsessual ravishda o'chiradigan xonalar va o'tish joylari yordamida to'ldiramiz, shu bilan birga biz dushmanlar va ob'ektlarga kiramiz, to'liq tasodifiylik uchun biz unutmaymiz. 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. O'zaro ta'sir
Endi biz qandaydir tarzda devorlar va yirtqich hayvonlardan o'tishdan qochishimiz va narsalardan bonuslar olishimiz kerak.
Bizning sevimlilarimiz for va #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. Menyu
Biz shunchaki menyuni ekranda ko'rsatamiz, elementlarni raqamlaymiz va getkey() yordamida pleyerning tanlovini qayta ishlaymiz. Biz belgilar holati satrini yozamiz, tekislash menyusini amalga oshiramiz, orqa tarixni yozamiz va men "Yer osti boyliklari" deb nomlangan narsaga erishamiz.
xulosa
Bu shunga o'xshash narsa. Siz uni o'ynashingiz mumkin, , o'rash va uni quyidagicha ishga tushirish:
$ sudo chmod +x Subsoil-1.0/Subsoil$ Subsoil-1.0/Subsoil, yoki, nihoyat, ilhomlanib, o'zingizga yoqqan sarguzashtni yozing. Ogoh bo'ling: mening o'yinim oson emas!
Havolalar
, .
Manba: www.habr.com
