Navbatga asoslangan strategiya uchun skriptlar. Bosqichma-bosqich strategiyani ishlab chiqish. Strategiyani yaratishning asosiy bosqichlari

Hammaga salom! Endi men sizga oddiy RTS (RTS - Real Time Strategy, ya'ni real vaqt strategiyasi) 8.1 gamakini qanday ochishni aytaman (8.0 da ishlash kafolatlanmaydi) objControl ob'ektini yaratish, ya'ni bu bo'ladi. bizning asosiy ob'ektimiz, yaratish hodisasini yaratish ( Yaratish) Hodisa qo'shish => Yaratish (Vodea qo'shish => Yaratish) yaratish hodisasi faqat bir marta amalga oshiriladi - yaratishda o'ng vertikal menyudagi boshqaruv yorlig'ini bosing va "Bajarish" ni o'ng tugmasini bosing. kodni (kodni bajaring) va kodni yozing (kodni nusxa ko'chirmaslik yaxshiroq va uni o'zingiz yozish eslashni ancha osonlashtiradi):

200?"200px":""+(this.scrollHeight+5)+"px");">startx=0; //x ning boshlang'ich nuqtasi uchun o'zgaruvchini e'lon qilish
boshlang'ich = 0; //Nuqta boshi uchun o'zgaruvchini y bilan e'lon qilish
draw_rect=false; //Tanlash to'rtburchak chizmang


O'zgaruvchan: ma'lumotni o'z ichiga olgan xotira qismi. Ularning o'z nomi bor, ular bilan bog'lanishingiz mumkin. GML-dagi o'zgaruvchilar haqiqiy son yoki satrni o'z ichiga olishi mumkin. Misol uchun, stol o'zgaruvchan, yog'och yoki shisha qiymatdir
Endi biz qadam hodisasini yaratamiz (Step, Add Event => Step) va operatsiyani qayta bajaramiz (Execute code-ni o'ng tugmasini bosing):

200?"200px":""+(this.scrollHeight+5)+"px");">
agar sichqonchani_tekshirish_tugmasi_bosilsa(mb_chap) //Agar LMB bosilsa
{
draw_rect=true; //To'rtburchak chizamiz
startx=mouse_x; //Boshlash x pozitsiyasi = sichqonchaning x pozitsiyasi
starty=mouse_y; //Boshlanish pozitsiyasi = sichqonchaning holati
barcha tanlanganlar bilan=false; //Bu hali e'lon qilingan o'zgaruvchi emas, u nima qilishini keyinroq bilib olamiz
}

Agar sichqonchani_check_button_released(mb_left) //Agar LMB chiqarilgan bo'lsa
{
draw_rect=false; //Biz to'rtburchak chizmaymiz
uchun(i=0;i<=instance_number(par);i+=1) //Читайте про цикл for ниже
{
ii=nasol_topish(par,i); //Biz hali yaratilmagan ob'ektni qidirmoqdamiz
if(to'qnashuv_to'rtburchak(startx,starty,mouse_x,mouse_y,ii,true,false)) //Mana bizning to'qnashuv to'rtburchagi (kontakt)
{
ii.selected=true;
}
}
}

Kod katta va murakkab bo'lib, biz if shartli bayonot bilan tanishamiz:
If bilan kod quyidagicha bajariladi:

200?"200px":""+(this.scrollHeight+5)+"px");">
agar (shart)
{
harakat
}

Shuningdek, u else iborasini ham o'z ichiga olishi mumkin (aks holda), misol:

200?"200px":""+(this.scrollHeight+5)+"px");">agar (shart)
{
harakat
}
boshqa
{
harakat 2
}

Va for sikl operatori bo'lsa, u quyidagicha bajariladi:

200?"200px":""+(this.scrollHeight+5)+"px");">
uchun (<переменная> ; <выражение> ;<действие переменной>)
{
<действия>
}


For operatori juda kuchli narsa, u qiyin vaziyatlarda ko'p yordam beradi

Operator - tilga kiritilgan amallar, masalan, int, if, else, string, switch, for, case, break, exit va hokazolar eng keng tarqalgan.

Endi biz rasm chizish hodisasini ham yaratamiz (chizamiz) va xuddi shu tarzda yozamiz:

200?"200px":""+(this.scrollHeight+5)+"px");">agar draw_rect=true
{
alfa=.8;
chizilgan_to'rtburchaklar_rangi(startx, starty, sichqoncha_x, sichqoncha_y, c_yashil, c_yashil, c_yashil, c_yashil, rost);
}

Bu erda hamma narsa oson, bu erda bir xil narsa faqat rus tilida:
agar biz to'rtburchak chizishimiz kerak bo'lsa, biz shaffoflikni tanlaymiz va to'rtburchak chizamiz
bu erda dalillar

200?"200px":""+(this.scrollHeight+5)+"px");">to‘rtburchaklar_rangini chizish(x1,y1,x2,y2, rang 1, rang 2, rang 3, rang 4, kontur)


kontur - faqat chekka (to'g'ri) yoki to'ldirilgan to'rtburchak (yolg'on) chiziladimi
Biz yangi so'zni topdik - doimiy, bu so'z bilan almashtirilgan raqamli ifoda yoki kod, gamakda o'rnatilgan konstantalar mavjud:

200?"200px":""+(this.scrollHeight+5)+"px");">rost - 1
noto'g'ri - 0
pi - 3,1415...


Xo'sh, biz buni tushundik, endi yaratishimiz kerak yangi ob'ekt- o'z bolalariga ulanadigan ota-ona ob'ekti. Keling, uni par deb ataymiz (nomni o'zgartirish uchun siz boshqaruv ob'ektining qadam hodisasidagi kodni o'zgartirishingiz kerak), yaratish hodisasiga yozing:

200?"200px":""+(this.scrollHeight+5)+"px");">selected=false; //Mana bizning o'zgaruvchimiz, ob'ekt tanlanganmi yoki yo'qmi

Bu hammasi. Endi, albatta, bizga harakatlana oladigan ob'ekt kerak, biz uni objTest deb ataymiz va kodni yaratish hodisasiga yozamiz:

200?"200px":""+(this.scrollHeight+5)+"px");">gox=x; //Qaerga borish kerak...
goy=y; //y tomonidan
tanlangan=noto'g'ri; //Biz tanlanmaganmiz =)
object_set_parent(self,par) //Mana ota-onani tanlash

Yangi harakat:

200?"200px":""+(this.scrollHeight+5)+"px");">object_set_parent(ind,obj)

Ind nomli ob'ektga asosiy ob'ektni o'rnatadi.
VA yangi operator: o‘z-o‘zidan, harakatning o‘z-o‘zidan ketishini bildiradi
Qo'rqmang, qadam hodisasiga hali oz vaqt qoldi:

200?"200px":""+(this.scrollHeight+5)+"px");">agar masofa_nuqta(gox,goy) > 20 bo'lsa
{
mp_potential_step(gox,goy,6,solid);
}
agar(tanlangan=toʻgʻri) && sichqonchani_tekshirish_tugmasi_bosilsa(mb_oʻng)
{
gox=sichqoncha_x;
goy=mouse_y;

mavzu_parki:
Menga kerak bo'ladi:
sprite qurish
sprite menyusi
TURLI TUGMALARNING SPRITESLARI:
yozuvli srite (qurilish, qurish, qurish va h.k.)
paydo bo'ladigan oyna
qurilish chizmasi,
1) qolganlarini o'zimiz qo'shamiz
2) soxta so`z – o`zim yaratgan, chunki manbamizga mos kelishi uchun uni soxtalashtirishimiz kerak)
IILetning boshlanishi:
1) 1-banddan tashqari I bandda yozilgan hamma narsani yarating
Keling, pul deb nomlangan global o'zgaruvchini yarataylik, har qanday boshlang'ich pul miqdorini belgilaymiz
Shuningdek, biz sichqoncha va klaviatura obyektini yaratamiz
Keling, matn yarataylik, uni info deb nomlaymiz, har doim hodisani yaratamiz va unda harakat yaratamiz:
harakatni tanlashda ma'lumotni tanlang matndagi to'plam matnini tanlang buni yozing:
"pul: " &(global("pul".
2) menyu qo'shing, menyuning asosiy vazifasi aralashish emas, balki o'yinchiga harakat qilishiga yordam berishdir (qanday qilib aralashishi mumkin? - agar siz uni o'yinning o'rtasiga qo'ysangiz, bu oson); menyuni yaratishdan oldin, biz Yangi qatlam yaratamiz, biz uni menyu deb ataymiz, uning nisbatlarida (sozlamalar, variantlar) biz yozamiz:


biz unga sprayt qo'shamiz va ishlab chiqarishdan oldingi materiallarda bo'lgan menyuning rasmini olamiz (I nuqta) va menyumizni xalaqit bermaydigan, lekin ekranda ko'rinadigan tanho joyga joylashtiramiz.
Keling, oldindan pardozlash materiallaridan (I nuqta) BUILD (yoki shunga o'xshash narsa) yozuvi bilan tugmachani joylashtiramiz.
keling, uni menyuga kiritamiz
Endi Voqealar jadvali muharririga o'ting
voqea yarating (#blah blah blah# - bu mening sizga xabarim (tushuntirish) faqat blah blah blah o'rniga siz uchun mening sharhim bo'ladi; >> - harakat; ll - oynalarni bo'linish, masalan:

Ob'ekt ustida sichqoncha va klaviatura ll bosiladi ll ob'ekt uchun chap bosiladi #BUILD yozuvi bilan menyu tugmasi (yoki shunga o'xshash)##qolganlari keyinroq (3-bandga qarang)#
3)endi eng qiyin qismi(Bunchalik murakkab bo'lmasligi uchun men buni ikki nuqtaga ajratdim),
Oldindan pardozlash materiallaridan sprayt yarating "oyna paydo bo'ladi"
keyin biz p1 deb nomlangan bo'sh sprite yaratamiz, oynani ekrandan o'tkazamiz va p1 ni qurish tugmasini bosganingizda oynangiz paydo bo'ladigan joyga qo'yamiz (yoki shunga o'xshash CHVER)
ajoyib! Endi voqealar sahifasi muharririga o'ting
Tugallanmagan voqeani oxirigacha yozamiz:
Matn matnni o'rnatadi bla-bla-bla)
Ob'ekt ustida sichqoncha va klaviatura tugmasi bosiladi va ob'ektga chap tugmacha bosiladi #BUILD (yoki shunga o'xshash) deb nomlangan menyu tugmasi#>>
4)Eng qiyin qismning ikkinchi qismi:
keling, binoning tasviri (oldindan pardozlash materiallari) chiziladigan sprayt yarataylik, keling, uni h1 deb ataymiz.
keling, bo'sh sprayt yarataylik, uni p2 deb nomlang, endi uni oyna ochilishi kerak bo'lgan joyga qo'ying,
Keling, sprite, shuningdek, deraza (oldindan pardozlash materiallari) yarataylik, derazada biz binoning nomini, uning narxini va tavsifini (ixtiyoriy) chiroyli yozamiz va uni i1 deb nomlaymiz.
keling, p3 deb nomlangan boshqa bo'sh sprite yarataylik, uni p2 yoniga qo'ying, shunda u faqat yuqori chap burchak bilan p2 ga tegadi.
Keling, bir nechta tadbirlarni yarataylik, lekin avval biz oldingi voqeani yangi harakat qilamiz:
ob'ekt ustida sichqoncha va klaviatura ll bosilgan bo'lsa ob'ektga chap tugmacha bosiladi #BUILD yozuvi bilan menyuingiz tugmasi (yoki shunga o'xshash)#>> tizim ll ob'ektiga nisbatan ob'ekt yaratadi #sizning oynangiz# #menyu nomi ostidagi qatlam raqami# # X ;Y-p1 ob'ektiga # o'zgartirmang
>>sistem ll ob'ektiga nisbatan ob'ekt yaratadi #ikkinchi oynangiz# #ism menyusi ostidagi qatlam raqami# #X;Y-obyektni p2 ga o'zgartirmang#
Biz ham unga bir voqeani qaytarishimiz kerak:
voqeani nusxalash va uni teskari aylantirish
yangi voqea
sichqoncha&klaviatura ll ob'ekt ustida joylashgan ll h1>>sistem ll ob'ektga nisbatan ob'ekt yaratish ll i1 #nom menyusi ostidagi qatlam raqami# #X;Y-obyektni p3 ga o'zgartirmang#
Keling, bino bilan sprayt yarataylik (ishlab chiqarishdan oldingi materiallardan foydalaning) va uni uy deb ataymiz
Binolarimiz menyuda tanlanganda paydo bo'ladigan oyna yarataylik, uni rlo deb nomlang
voqealar:
sichqoncha&klaviatura ll ob'ektga bosiladi ll chap tugmacha bosiladi h1>>sistem ob'ektga nisbatan ob'ektga yaratiladi ll uy # nom menyusi ostidagi qatlam raqami# #X;Y-obyektga rlo o'zgarmas
>> tizim qiymatdan ll #qurilish vaqtida olib qo'yilishi kerak bo'lgan pul miqdorini olib tashlaydi#
Endi tadbir qurishning iloji yo'q edi
Men sizga o'zimni aytaman oldingi yo'l taqiqlar (yozishni tugatgandan so'ng, men parkdagi dunyo o'yinini eslaganimda, meni ko'k rangga aylantirgan boshqa usulni o'rganaman)
voqealar:
uy ll boshqa ob'ekt bilan to'qnashganda uyga ll
>>uy buziladi
>> tizim ll qiymatidan ayiriladi - #qurilish vaqtida olib qo'yilgan pul miqdorini ikki baravar oshiring##qo'yish kerak bo'lgan eslatma - miqdor#
asosan hamma narsa.
III Men aytmoqchi bo'lgan narsa:

O'yinim yiqilib ketganidan juda xafa bo'ldim.Bu strategiya o'yini edi va bu maqola shu sxema bo'yicha tuzilgan.Ko'p tanqid qilmasligingizni so'rayman, uzoq vaqt yozdim, agar nutqda xatolik topsangiz, yozing va men ularni tuzataman
va shuningdek, bu yerda tomosha qilish zavqingiz uchun manba kodi, qarang, printsipial jihatdan hamma narsa bu erda yozilganidek, faqat bu o'yinning demo versiyasi edi.Asosiysi hech narsani o'zgartirmaslik, aks holda u noto'g'ri bo'ladi. !
foydalaning, tajriba qiling, tekshiring, xohlaganingizni qiling, men uchun hammasi yaxshi

KaMiKaZa:
Barcha "tizim" iboralari "Kod" tegiga kiritilishi kerak.
Keyin yaxshiroq bo'ladi deb o'ylayman.
Bundan tashqari, menimcha, skrinshotlar bu erda zarar qilmaydi. Shuningdek, yangi boshlanuvchilar uchun manba kodi.

mavzu_parki:
Voqealar skrinshotini qanday olishni bilmayman.

Xo'sh, bu kerak emas.

imnp:
theme_park , klaviaturada maxsus tugma mavjud - PrintScreen

mavzu_parki:
Bilaman, ba'zi odamlar buni boshqacha qilishadi, bundan tashqari, har kimning o'z sprayti bor
va agar men bu barcha spritlarni o'rnatsam, kam odam tushunadi.
Xo'sh, ehtimol kimdir ortiqcha beradi? Men kurashayotganim ajablanarli emasmi?

burlachenko:
Bunday dars har kimni qiziqtirishi uchun uni shunga mos ravishda formatlash kerak, ammo bu erda "baribir shunday edi".
Va shunga qaramay, agar xohlasangiz, oz-ozdan, vaqtingiz bo'lganda, uni "chiroylashtiring".

mavzu_parki:
yaxshi, men maktabdan kelaman va tayyorlanaman.
PS. qo'shilgan manba

Serega Lebedev:

iamnp, bu skrinshotlar keyinroq qayerga ketadi?

KaMiKaZa:

Buferga.
Istalganiga o'ting matn muharriri, va "Qo'yish" amalini bajaring yoki Ctrl+V tugmalarini bosing.

Ushbu maqolada men noma'lum narsaga tegishim dargumon. Barcha hisob-kitoblar oddiy va Ajax nima ekanligini biladigan har bir kishi uchun tushunarli. Men allaqachon real vaqtda o'yinlarda mijozni server bilan qanday birlashtirish haqida maqola yozganman (). Ushbu maqolada men navbatga asoslangan o'yinlarga tegishli bo'lgan bir xil muammolarni ko'rib chiqaman.

Xo'sh, nima navbatga asoslangan o'yin? Quyidagi ta'rifni Vikipediyada topish mumkin navbatga asoslangan strategiya - bu janr Kompyuter o'yinlari, uning asosiy xususiyati shundaki, real vaqt strategiyasidan farqli o'laroq, o'yinchilar navbatma-navbat harakatlarni amalga oshiradilar. Men ushbu ta'rifni biroz soddalashtiraman:

  • Bosqichma-bosqich strategiya - navbatga asoslangan strategiya o'yini.
  • Strategiya o'yini - Bu g'alabaga erishishning kaliti rejalashtirish va strategik fikrlash bo'lgan o'yinlar janri..
  • Navbatga asoslangan o'yin - oʻyinlar janri boʻlib, uning asosiy xususiyati oʻyinchilarning navbatma-navbat harakat qilishidir.
Navbatga asoslangan o'yinlarga quyidagilar kiradi:
  • Navbatga asoslangan strategiyalar
  • Karta o'yinlari
  • Stol o'yinlari (shaxmat, go, monopoliya va boshqalar)
Shuni ta'kidlaymanki, navbatga asoslangan o'yinlar real vaqtda o'yinlarga qaraganda o'zaro ta'sir protokolining murakkabligiga kamroq cheklovlar qo'yadi. Aynan, Muayyan hodisaga reaktsiya vaqti asosiy rol o'ynamaydi. O'yinchiga qaror qabul qilish uchun odatda 10 soniya vaqt beriladi. Agar ping juda katta bo'lsa ham, aytaylik, 3 soniya, keyin o'yinchining o'ylash uchun hali 7 soniyasi bor. Bundan tashqari, ping sakrashi va sakrashi mumkin, ammo biz bunga umuman ahamiyat bermaymiz (real vaqtda o'yinlarda bu holat deyarli har qanday protokolni o'ldiradi).

Odatda (navbat asosidagi o'yinlarning 95 foizida) har qanday vaqtda aynan bitta o'yinchi qaror qabul qiladi. Shunday qilib, biz adekvat javob berishimiz kerak bo'lgan so'rovlar soni toraydi.

Shuning uchun, protokol yaratishda biz birinchi navbatda uni amalga oshirish va qo'llab-quvvatlash qulayligiga e'tibor qaratamiz. Bu bizga qisqa vaqt ichida ko'proq foyda olish imkonini beradi.

Yuqoridagi fikr ma'lum bir karta o'yinining 2 oylik rivojlanishiga asoslangan.

Aqlli mijozmi yoki ahmoqmi?

Birinchidan, mijozimiz qanchalik "aqlli" bo'lishi mumkinligini aniqlaymiz. Men mijozda dastur mantig'ini (o'yin qoidalarini) takrorlashga arziydimi yoki yo'qligini muhokama qilyapman. Albatta, dasturni potentsial buzishning oldini olish uchun server aqlli bo'lishi kerak. Ammo mijozga biznes mantig'ini o'rgatish arziydimi?

Bu to'g'ridan-to'g'ri o'yiningiz holati haqidagi ma'lumotlarning to'liq miqdori qanchalik og'irligiga bog'liq. Agar ma'lumotlarning bu miqdori katta bo'lsa, serverda to'plash uchun uzoq vaqt kerak bo'lsa va mijozga uzatilsa, serverni bo'shatish uchun mijozda mantiqning bir qismini amalga oshirish mantiqan. Misol uchun, Civilization-da ishlatiladigan xotira o'lchagich har doim jadvaldan tashqarida. Mijozda faqat UI qoldirib, shunga o'xshash narsani yarata olasizmi?

Boshqa tomondan, mijoz qanchalik aqlli bo'lsa, o'yinni ishlab chiqish shunchalik qimmatga tushadi. Shuni ta'kidlash kerakki, serverni ishlab chiqish vaqti hech qanday tarzda mijozning bilimiga bog'liq emas. Mijoz super-duper-mega smart bo'lsa ham, agar foydalanuvchi brauzer oynasini qayta yuklamoqchi bo'lsa, server uni mijozga o'tkazish uchun o'yin haqidagi barcha ma'lumotlarni to'plashi va yig'ishi kerak bo'ladi. "Saqlangan o'yin yuklanmoqda". Xulosa: Aqlli mijoz dasturni tezlashtirishi mumkin, lekin u har doim dasturni ishlab chiqish uchun qo'shimcha resurslarni talab qiladi.

Men quyidagilarni taklif qilaman sinov:

1. Kanalning ovoz balandligi ruxsat beradimi?

O'yin holati ma'lumotlarining to'liq hajmining o'rtacha og'irligini hisoblang. Keyinchalik, serverga soniyada o'rtacha so'rovlar soniga ko'paytiring. Olingan raqam chiquvchi ma'lumotlar kanali hajmidan oshsa, ahmoq mijoz qabul qilinishi mumkin emas. Agar bu raqam chiquvchi kanalning 20% ​​dan oshsa, u ishlaydimi yoki yo'qmi haqida o'ylash kerakmi?

2. Mehnatni talab qiladimi?

O'yin ma'lumotlarini yig'ish algoritmining murakkabligini hisoblang (soniyaning kasrlarida). Bu erda ma'lumotlar bazasiga barcha so'rovlarni hisobga oling. Keyinchalik, serverga soniyada o'rtacha so'rovlar soniga ko'paytiring. Agar vaqt bir soniyadan oshsa, ahmoq mijoz qabul qilinishi mumkin emas. Agar bu raqam 200 ms dan oshsa, u davom etadimi, deb o'ylash kerakmi?

Davomi:

Strategiyani shakllantirish
Siz havaskorlarga ishonishingiz mumkin emas:
ularning rejalari kutilmaganda amalga oshishi mumkin,
va hech kim bunga tayyor emas.

(A. Kuningem)

Oldingi ikkita sonda biz bilib oldik oddiy 2D o'yinlar qiling, spritlarni boshqaring, oʻyin ekranini aylantiring, oʻyin obʼyektlarining toʻqnashuvini kuzatib boring, interfeys (tugmalar, sichqoncha, klaviatura, matn maydonlari) yarating va toʻliq ekranli va oynali rejimlarda ishlang. Bularning barchasi misol sifatida arkada o'yini yordamida amalga oshirildi.

Bu safar biz arkada o'yinlaridan "jiddiy" janrga - strategiyalarga o'tamiz. Bu erda biz bir qator yangi mexanizmlarni o'zlashtirishimiz kerak, ammo bu erda ham murakkab narsa bo'lmaydi. Ushbu maqolada biz Keling, navbatga asoslangan strategiyaning tuzilishini o'rganamiz(va shuningdek real vaqt strategiyasi- buni LKI-Creator bilan qilish osonroq) va biz misol sifatida o'yinni yaratamiz, ammo faqat ko'p foydalanuvchi rejimi (va shuningdek xarita muharriri uning uchun). Yagona o'yinchi rejimi bilan biz ruknimizning keyingi sonida shug'ullanamiz - bag'ishlangan asoslar sun'iy intellekt .

Bu allaqachon uchinchi dars bo'lgani uchun biz batafsil ma'lumotga kirmaymiz hammasi misol kodi - Yaxshiyamki, avvalgi ikki marta bo'lgani kabi ko'p narsa qilingan. Malumot uchun, dasturning namunasi (unda ko'plab sharhlar mavjud) va oldingi maqolalar mavjud.

Xo'sh, siz bizning o'tgan darslarimiz materiallarini bizning saytimizda topishingiz mumkin CD, bu maqsad uchun maxsus yaratilgan "O'zingni o'zing qil o'yin" bo'limida.

Muammoni shakllantirish

Keling, ikkita fantaziya armiyasi o'rtasidagi jangdan iborat strategiya o'yinini yozaylik. Jangning maqsadi bir nechtasini qo'lga olishdir obelisklar, xaritada joylashtirilgan. Jangdan oldin biz 6 kishidan iborat qo'shinlarimizni joylashtiramiz qilichbozlar, 4 kamonchilar, 2 ritsarlar, 2 sehrgarlar va 1 sharpa, bizga ajratilgan hudud doirasida. Ulardan tashqari, xaritada neytrallari ham bor ajdarlar.

Jangchilarning xususiyatlari
Jangchi Harakat Xitlar Diapazon Zarar Himoya Imkoniyatlar
Qilichboz4 8 1 7 2 -
Kamonchi4 5 7 5 1 -
Ritsar3 15 1 9 4 Shifolash, ritsarning zarbasi
Sehrgar3 12 5 6 0 Yong'in to'pi
Arvoh4 7 2 5 5 Regeneratsiya
Ajdaho6 30 2 12 5 Parvoz

Jangchilarning xususiyatlari jadvalda keltirilgan. Davolash- bu har bir jangda bir marta qo'shni jangchini (arvohdan tashqari) to'liq sog'lig'iga shifolash huquqidir. Knight's Strike- har bir o'yinda bir marta uch marta zarar etkazish huquqi. Yong'in to'pi- sehrgarning hujumi zarba nuqtalarini nafaqat to'g'ridan-to'g'ri nishondan, balki atrofdagi kvadratlardan ham olib tashlaydi. Regeneratsiya- har bir burilishda 1 zarbani tiklash. Parvoz- to'siqlardan o'tish huquqi.

O'yin ko'p o'yinchi rejimida, Hot Seat versiyasida o'ynaladi (bitta kompyuterdan o'ynang, bir vaqtning o'zida bir marta aylanadi). O'yinchilar o'girilgandan so'ng, neytral ajdarlar o'z navbatini qiladilar va 7 hujayra radiusidagi istalgan dushmanga hujum qilishadi.

Partiya bir tomon xaritada mavjud bo'lgan obelisklarning yarmidan ko'pini qo'lga kiritganda yoki butunlay o'lganida tugaydi.

Xarita dastlab xarita muharririda o'rnatildi. Obelisklar, ajdarlar va to'siqlar (siz harakatlana olmaydigan yoki hujum qila olmaydigan ob'ektlar) mavjud.

Ishga tayyorgarlik

Ishni boshlashdan oldin paketni qayta o'rnatishimiz kerak bo'ladi LKI-Yaratuvchi. Gap shundaki, o‘tgan vaqtga nisbatan unga ko‘plab o‘zgartirish va qo‘shimchalar kiritilgan.

(Umid qilamanki Delphi siz allaqachon o'rnatgansiz; agar yo'q bo'lsa, unda bizning oldingi maqolamizdagi ushbu mavzu bo'yicha tavsiyalarni o'qing - jurnalning iyun sonida yoki ushbu sonning diskida yoki veb-saytda.)

Bu muhim: LKI-Creator-ning oldingi versiyasida Delphi-ning yangi versiyalari bilan ba'zi moslik muammolari mavjud edi. Ushbu versiyada ular yo'q qilinadi.

Dastur matnlari va rasmlari bo'lgan faylni kompakt diskimizdan ("O'z qo'llaringiz bilan o'yin" bo'limi) oling va uni loyiha katalogiga oching.

Endi yuklab olishingiz mumkin kerakli fayllar bu yerdan .

Bizda uchta kichik katalog bo'lishi kerak. One - Units - LKI-Creator paketining DirectX kutubxonalari va modullarini saqlaydi. Boshqasida - Loyiha - biz ishlaymiz; Bizga kerak bo'lgan rasmlar u erda oldindan joylashtirilgan va oldingi versiya bizning arkadamiz. Uchinchisida - Escort - biz muvaffaqiyatga erishishimiz kerak bo'lgan tayyor dastur.

Endi LKI-Creator-ni o'rnatamiz (qayta o'rnatamiz). Delphi menyusida Komponent bandini oching va Komponentni o'rnatish-ni tanlang. Agar siz ushbu paketni allaqachon o'rnatgan bo'lsangiz, "Mavjud paketga" yorlig'ida qoling, aks holda "Yangi paketga" yorlig'iga o'ting va rasmda ko'rsatilgandek bo'sh qatorlarni to'ldiring (yuqori satrda, eng oson yo'li LKI2dEngine-ni tanlashdir. "Browse" tugmasi yordamida pas faylini oching va pastki qismida LKI-ni yozing). Keyin OK tugmasini bosing va O'rnatish-ni tanlang. IN yuqori panel Delphi-da siz LKI yorlig'ini ko'rishingiz kerak.

Endi faqat loyihamizni yuklash qoladi. Fayl menyusida Ochish-ni tanlang, Project\Obelisk.dpr faylini oching…

Xarita qayerda, Billi? Bizga xarita kerak!

Biroq, katta narsalarga kirishdan oldin, biz grafik dvigatelda biroz ko'proq ishlashimiz kerak.

Bizning oldingi loyihamiz Star Escortda "xarita" hech qanday ma'noga ega emas edi: yulduzlar tasodifiy joylashtirilgan va hech narsaga ta'sir qilmadi va boshqa ob'ektlarning joylashuvi to'g'ridan-to'g'ri kodda ko'rsatilgan yoki tasodifan aniqlangan. Bu har bir loyiha uchun mos emas. Bu bizning dvigatelimizga qo'shish vaqti kelganligini anglatadi hudud xaritasi.

Ehtimol, siz uning qanday ko'rinishini taxmin qilishingiz mumkin - biz xarita ob'ektini loyiha oynasiga qo'yamiz va keyin uni mulkda ro'yxatdan o'tkazamiz. Xarita bizning dvigatelimiz.

Bu shunday... lekin bizda bir nechta karta sinflari mavjud. Keling, batafsil ko'rib chiqaylik ...

Kartalar turlari

Xarita biror narsadan iborat manzara Va ob'ektlar unga o'rnatilgan. Landshaft ko'pincha (lekin har doim emas) deb ataladigan hujayralarga bo'linadi plitkalar- plitkalar.

Maktab geometriya kursidan ma'lumki, tekislik uch turdagi muntazam ko'pburchaklar bilan bo'shliqlarsiz yoki qoplamalarsiz qoplanishi mumkin: uchburchak (teng tomonli), kvadrat, olti burchakli. Uchburchak maydonlar ayniqsa qulay emas, shuning uchun kvadrat hujayralar yoki olti burchaklar ko'proq ishlatiladi.

Qaysidir ma'noda kvadratchalar bilan yashash osonroq: agar bizda ikki o'lchovli hujayralar massivi bo'lsa, ma'lum bir hujayraga qo'shni hujayralarni qanday topish mumkinligi darhol aniq bo'ladi. Bu ikki indeksning har biri uchun +1 va -1. Olti burchaklar bilan hamma narsa biroz murakkabroq ... lekin olti burchakli taxta juda qimmatli xususiyatga ega: undagi barcha yo'nalishlar bir xil. Kvadrat panjara bilan bunday emas: diagonallar gorizontal va vertikallardan sezilarli darajada farq qiladi. Shuning uchun jiddiy strategik hisob-kitoblar uchun olti burchakli kvadratlardan ko'ra yaxshiroq bo'lishi mumkin.

Bundan tashqari, plitka qo'yilmagan kartalar ham mavjud. LKI-Creator ikki turni qo'llab-quvvatlaydi: grafik va patchwork.

Grafik xarita - bu faqat bir nechta asosiy nuqtalar, shuningdek, maxsus joylar (masalan, o'tib bo'lmaydiganlar) ma'noga ega bo'lgan xarita, qolganlari esa o'yin effektiga ega bo'lmagan naqshdir. Yulduzli xaritalar ko'pincha shunday tuziladi, masalan, Orion ustasi: yulduzlar va qora tuynuklar asosiy nuqtalar, qolganlari fon. Ushbu rejimda ular ba'zan global xaritalar tuzadilar, masalan, rolli o'yin uchun.

Patchwork xaritasi hududlarga bo'lingan va maydon ichida barcha nuqtalar bir xil, siz "yamoq" bo'ylab harakatlana olmaysiz. Bu mintaqaning minimal birligi bo'lgan global strategiyalar uchun yaxshi.

Suratlarda turini ko'rsatadigan turli xil o'yinlardagi kartalar misollari keltirilgan.

Shunday qilib, ko'pchilik ikki o'lchovli xaritalarni (uch o'lchovli - maxsus maqola) to'rtta sinfga bo'lish mumkin:

  • To'rtburchak- TLKIRectMap. Bu plitkali xarita, katakchalar kvadratchalardir. Bunday xarita, masalan, Civilization III da.
  • Olti burchakli- TLKIHexMap. Olti burchakli katakchalar bilan qoplangan xarita. Ko'pgina urush o'yinlarida qo'llaniladi va nafaqat: bu, masalan, "Heroes of Might & Magic" jangovar xaritasi an'anaviy tarzda qanday yaratilgan.

    Ushbu ikki turdagi kartalar umumiy sinfning avlodlari TLKITileMap.

  • Graphovaya- TLKIGraphMap. Bu karta bor fon (fon xususiyati) va unda ta'kidlangan asosiy nuqtalar statik ob'ektlardir. Ushbu xaritadagi boshqa ob'ektlarning holati oddiy koordinatalar (yulduzlararo fazodagi kosmik kema kabi) yoki ob'ektga (sayyora orbitasidagi xuddi shu kema) havola bilan ifodalanadi. Bular Master of Orion, Arcanum (global) va boshqalar kartalari.
  • Patchwork- TLKICluster xaritasi. U birinchi grafik kabi fon xususiyatiga va ikkinchi xususiyatga ega - niqob, qaysi nuqta qaysi mintaqaga tegishli ekanligini va mulkni belgilaydi Chegaralar, bu "shreds" o'rtasidagi aloqalarni belgilaydi. Masalan, O'rta asrlarda xaritalar shunday joylashtirilgan: Umumiy urush yoki Viktoriya.

Bu muhim: xarita sinflari LKI2dEngine modulida emas, balki LKI2dMap da tasvirlangan.

Nishab burchaklari

Ammo agar siz bu LKI-Creator-ning xaritalarni ko'rsatish imkoniyatlarini tugatadi deb o'ylasangiz, unda siz juda adashasiz.

Xaritani taqdim etish mumkin yuqori ko'rinish yoki izometrik- vertikalga burchakka qarang. Misol uchun, Civilization III yoki Heroes of Might & Magic IV xaritasi izometrik, ammo Civilization I yuqoridan pastga qarashni qabul qiladi.

Odatda, plitkali xaritalar uchun izometriya qo'llaniladi, grafik xaritalar esa yuqori ko'rinishda ishlatiladi, chunki grafik xaritalarning masshtablari odatda kichikroq bo'ladi. Ammo istisnolar mavjud: masalan, O'rta asrlarda: Total Warda yamoqli izometrik xarita mavjud.

Xarita xususiyati izometriklik uchun javobgardir Izometrik va kameramiz ko'rinadigan burchakni o'rnatadigan ikkita parametr: Phi Va Teta.

Birinchisi, xaritaning vertikal o'qga nisbatan aylanishi uchun javobgardir: masalan, agar siz uni 45 darajaga qo'ysangiz (u darajalarda o'lchanadi), u holda to'rtburchaklar panjara katakchasi Sivilizatsiyadagi kabi yuqoriga burchak bilan yo'naltiriladi. . Phi=0 da hujayraning bir tomoni gorizontal bo'ladi.

Ikkinchisi kameraning vertikalga nisbatan egilishini boshqaradi. Qulaylik uchun u gorizontal va vertikal uzunlik birliklarining nisbati sifatida berilgan. Aytaylik, agar biz hujayramiz kengligining yarmiga teng bo'lishini xohlasak, Teta ni 2 ga qo'yishimiz kerak.

Plitka bilan qoplangan xarita bilan biz bu burchaklarni o'zboshimchalik bilan tanlashga ruxsat etilmaydi: axir, bizda (hali) 3D yo'q. Ular to'g'ridan-to'g'ri plitkalarning parametrlariga bog'liq. Misol uchun, agar bizda yuqoriga burchakli olmos shaklidagi o'q bo'lsa va vertikal o'q gorizontal o'qning yarmiga teng bo'lsa, unda biz 45 va 2 parametrlarini o'rnatishimiz kerak.

Ammo grafik va yamoqli xaritalar sizga ushbu parametrlarni o'zingiz xohlagan tarzda belgilash huquqini beradi (va hatto, agar xohlasangiz, ularni jarayonda o'zgartiring), lekin siz bunga berilmasligingiz kerak - bundan tashqari, bunday burilishlar bir muncha vaqt o'tadi. ko'p vaqt, ular ham juda ajoyib ko'rinmaydi. Va unutmangki, agar sizning xaritangiz badiiy bo'lsa, rasmlar, yozuvlar va hokazo bo'lsa, ular u bilan aylanadi... Umuman olganda, ba'zida kerakli aylanishni hisobga olgan holda yamoqli xaritani chizish osonroq bo'ladi - xayriyatki, masofalar. ko'pincha u erda hech qanday rol o'ynamaydi.

Bo'g'inlar

Patchwork xaritasi, yuqoridan ko'rinish.

Plitka xaritalarida yana bir muammo bor - plitkalarni birlashtirish. Bu parametr bilan boshqariladi TileBorderStyle. Ko'pincha bu kafel tekis, plitkalar chekka effektlarsiz oddiygina bir-biriga mos keladigan rejim yoki tileBorder, unda bir plitkani boshqasidan ajratib turadigan chiziqlar chizilgan - hujayralar chegaralari (ikkinchi holda, belgilashni unutmang. rang parametrdagi panjaralar TileBorderColor).

Ammo bir xil plitkalar o'zgarishsiz bir-biriga ulashganda va turli xil plitkalar maxsus "o'tish" plitkalari yordamida ishlatilsa, yanada ayyor variant mavjud. Bu, odatda, agar xarita asosan bir turdagi hududning keng maydonlaridan iborat bo'lsa, masalan, katta yashil maydonlardan iborat bo'lsa va alohida katak muhim bo'lmasa va o'yinchi tomonidan sezilmasligi kerak bo'lsa amalga oshiriladi. Bu "Heroes of Might Magic" kartasi. Ammo agar har bir hujayra Sivilizatsiyadagi kabi alohida ishlov berilsa, unda bu usul mos kelmaydi va hujayralarni bir-biridan aniq ajratish yaxshiroqdir. "Birlashtirilgan" texnologiya (shuningdek, deb ataladi niqob) ga teng TileBorderStyle qiymati bilan belgilanadi plitka maskalangan. Biz ularning tuzilishi haqida boshqa safar gaplashamiz - bu juda murakkab mavzu.

Plitka

Xarita elementi - sinf ob'ekti TLKITile- oddiy tuzilishga ega. U dastlab quyidagilarni o'z ichiga oladi: koordinatalar, uni chizadigan sprayt, plitka turi kodi (bu bizda nima borligini aniqlaydi - tepalik, cho'l, yo'l, dengiz?) va o'tish qobiliyati (bu ko'pchilik o'yinlarda tegishli). Oxirgisi - bu plitka bo'ylab harakatlanish uchun sarflangan harakat birliklari soni yer otryad. O'tib bo'lmaydigan plitkalar uchun bu salbiy raqam.

Boshqa parametr - Ob'ektlar, ushbu plitkada joylashgan ob'ektlar ro'yxati (TLKIGameObject turi).

Qaysi hujayra bosilganligini bilish uchun xaritada usul mavjud MouseTile(x,y) tanlangan plitkani qaytarish.

Plitka usullari o'z ichiga oladi Qo'shni(Plitka, masofa). Agar Plitka berilgan plitkadan masofa yacheykalaridan uzoqda bo'lmasa, bu funksiya true qiymatini qaytaradi (sukut bo'yicha bu parametr bittaga teng bo'ladi, ya'ni agar siz oddiygina IsNeighbour(Tile) deb yozsangiz), funktsiya darhol qo'shni bo'lgan kafel uchun haqiqatni qaytaradi. Kvadrat to'rlar uchun diagonal chegaralangan plitkalar ham “qo'shnilar” hisoblanadi.

Funksiyalar Birinchi qo'shni Va Keyingi qo'shni ma'lum biriga ulashgan barcha hujayralarni tekshirish uchun ishlatiladi. Ulardan birinchisi qo'shni hujayraga ishora qiladi, ikkinchisini esa faqat birinchisini chaqirgandan keyin chaqirish mumkin va u keyingi qo'shnilarni birma-bir chiqaradi.

Qo'shnilarning ro'yxati

// Hujayraga zarar yetkazish

tartib TObeliskTile.Damage(dmg: integer);

agar(Ob'ektlar soni > 0) va// Bizda bo'lishi mumkin

// har bir katakchada bittadan ortiq ob'ekt bo'lmasligi kerak

(Objects.ID > 0) // Passiv ob'ektlar

// shikastlanmagan

Dec(Objects.Hits,

// Himoyani shikastlanishdan avtomatik ravishda olib tashlang

Maks(0,dmg-(Ob'ektlar kabi TObeliskGameObject).Mudofaa);

agar Objects.Hitsthen Die; // Biz o'liklarni olib tashlaymiz

// Olovli to'p hujumi

tartib TObeliskTile.Fireball;

var Qo'shni: TObeliskTile;

Neighbor:= First Neighbour TObeliskTile sifatida;

Neighbor.Damage(6);

Neighbor:= NextNeighbour TObeliskTile sifatida;

qadar Qo'shni = nol; // Qo'shnilar tugamaguncha

Misol "Qo'shnilarni sanab o'tish" yon panelida. Ushbu protsedura hujayra va uning barcha qo'shnilariga tegadigan olov sharini hisoblab chiqadi.

Bu qiziq: uning ishi uchun umuman ahamiyati yo'q, bizda olti burchakli panjara yoki kvadrat bor.

Ko'pincha bizga boshqa parametrlar kerak bo'ladi va odatda xaritani tashkil etadigan plitkalar sinfi avlod TLKITile. Shunday qilib, misolda - TObeliskTile TLKITile-dan meros qilib olingan.

Bu muhim: Agar biz o'yin ekranimizga plitkali xaritani olib kirsak, koordinatalar, shuningdek, masofaga bog'liq TLKIGameObject usullari sukut bo'yicha masofani nuqtalarda emas, balki plitkalarda o'lchashni boshlaydi. Tugmalar, piktogrammalar va boshqalarning koordinatalari. piksellarda o'lchashda davom eting! Ammo bu rejim o'chirilishi mumkin - bu real vaqt strategiyalari uchun foydali bo'lishi mumkin.

Karta tanlash

Shunday qilib, keling, to'rtburchaklar panjara (TLKIRectMap), izometrik xaritalash (burchak parametrlari 0, 1,5) bilan boshlaylik. To'r chizilgan bo'lsin (tileBorder uslubi). Keling, dvigatelga ushbu xaritani ko'rsatish kerakligini aytaylik. Hozirgacha barcha kerakli harakatlar bir qator kod yozmasdan bajarildi.

Ushbu operatsiyalar bajarilishi kerak oldin dvigatelni ishga tushirish, shuningdek, shrift deklaratsiyasi.

Biz raqamlarni, avvalgidek, spritlar deb e'lon qilamiz.

Xarita muharriri

Patchwork xaritasi, izometrik.

Bu erda juda ko'p qiyinchiliklar mavjud. Aynan bir xil dvigatel, bir xil plitka deklaratsiyalari ... Plitka tanlash, yuklash/saqlash va hokazo kabi interfeysni osongina bajarish mumkin. standart vositalar Delphi: hech kim bizni uni to'liq ekran rejimiga o'tkazishga majburlamaydi. Biz buni bu erda tahlil qilmaymiz - hamma narsa misol faylida. Misol kodi ataylab ishlatilgan eng oddiy yo'l; Agar xohlasangiz, masalan, ob'ektlar palitrasi va plitkalar palitrasi grafikasini yaratishingiz mumkin.

Muharrir biz uchun notanish bo'lgan faqat ikkita xususiyatga ega. Birinchisi juda oddiy: shunday yangi xususiyat plitkali xaritalar uchun maxsus mo'ljallangan sichqoncha. Funktsiya TLKIRectMap.SelectTile bosilgan aniq plitkaga ko'rsatgichni qaytaradi, shuning uchun biz bosishni osonlik bilan boshqarishimiz mumkin.

Ammo ikkinchi yangi mahsulot diqqat bilan ko'rib chiqilishi kerak.

Aslida, ma'lumotlarni saqlash va undan ma'lumotlarni o'qishning ko'plab usullari mavjud. Biz faylda kodlangan usulni tanladik CannonBase. Cannon - avlod ob'ektlarini o'qish va yozish uchun vosita TCannonObject turini tekshirish va boshqa ba'zi funktsiyalar bilan.

Keling, kodni ko'rib chiqaylik ("Write card").

Kartani yozib olish

tartib TObeliskMap.Save;

var i, j: butun son;

InitSave (FName);

WriteStr(MapName);

Write(Map.Width, SizeOf(Map.Width));

Write(Map.Height, SizeOf(Map.Height));

uchun i:=0 uchun Map.Width-1 qil

j uchun:=0 uchun Map.Height-1 qil

Write(Map.Tiles.Code, SizeOf(integer);

Bu qanday ishlaydi. Avval faylni maxsus protsedura yordamida ochishingiz kerak InitSave, uning yagona parametri fayl nomi. Keyin biz maxsus protsedura yordamida tipni boshqarish uchun sarlavhani saqlaymiz WriteHeader. Keyin protseduradan foydalanib, kerak bo'lgan hamma narsani yozamiz WriteStr satrlar uchun va boshqa barcha maydonlar uchun - Yozing(uning ikkinchi parametri baytlardagi yozma ma'lumotlarning hajmi). Ob'ekt maydonlari uchun kerak bo'lganda o'zingizning protseduralaringizni yozishingiz mumkin Saqlash sarlavha yozuvi bilan. Nihoyat, biz faylni protsedura bilan yopamiz FinSave.

O'z sarlavhasiga ega bo'lgan barcha ob'ektlar alohida e'lon qilinishi kerak. Bobda Initializatsiya modul (keyin keladigan ixtiyoriy bo'lim Amalga oshirish, dasturni ishga tushirishda eng boshida bajarilishi kerak bo'lgan buyruqlarni o'z ichiga oladi), siz quyidagi qatorni yozishingiz kerak, masalan:

RegisterUserName(tpMap, "TObeliskMap");

TpMap siz ham e'lon qilishingiz kerak bo'lgan doimiydir. Uni, aytaylik, 1 ga tenglashtiring. Va TObeliskMap ob'ektining konstruktorida ushbu doimiyning qiymatini parametrga belgilang. TypeID.

Nega bu shov-shuv? Turni moslashtirishdan tashqari, siz juda muhim foyda olasiz.

Agar fayl formati o'zgartirilsa, masalan, yangi maydonlar qo'shilishi sababli, siz eski fayllarni yangisiga o'zgartiradigan hech qanday "konvertorlar" yozishingiz shart emas. Sizning kodingiz ularni avtomatik ravishda o'qiydi.

Ushbu kod, agar faylda saqlanmagan bo'lsa, yangi maydonni avtomatik ravishda bo'sh qilib ishga tushiradi. Va siz WriteStr(Name) qatorini oxirigacha qo'shish orqali faylni yozishingiz mumkin.

Izoh: Agar bu jarayon nima uchun ekanligini hali ham tushunmasangiz, tashvishlanmang. Siz ko'proq an'anaviy yozish va saqlash usullaridan foydalanishingiz mumkin. Ammo haqiqatan ham keng ko'lamli o'yin loyihalarida bu yo'l muhim afzalliklarni beradi.

Keling o'ynaymiz

Avvalo biz yaratishimiz kerak yangi sinf, TLKIGameObject dan olingan. Biz eskisining xususiyatlarini sog'inamiz. Yangi sinfda siz asosiy xususiyatlar uchun maydonlarni qo'shishingiz kerak: diapazon, harakat va boshqalar.

Bu muhim: Bizning eski tezlik parametrimiz bizda qoladi, lekin u bir burilishda bosib o'tadigan masofani emas, balki ekran bo'ylab harakatlanadigan qismning tezligini bildiradi. Agar biz real vaqt strategiyasini tuzayotgan bo'lsak, bizga yangi parametr kerak emas edi, aks holda biz uni joriy qilishimiz kerak bo'ladi.

Bizning ekranimizda kamonchilar, qilichbozlar, sehrgarlar, arvohlar, ritsarlar ko'rinishidagi TLKIButton tugmachalarini qo'llaymiz.

Avval biz tartibga egamiz. Keling, bir tomon uchun joylashtirish zonasini xaritaning yuqori uchta "chizig'i", ikkinchisi uchun - pastki uchta "chiziq" sifatida belgilaymiz.

Kod shunday ishlaydi. Har qanday tugmachani bosganingizda, tegishli qiruvchi samolyotni o'rnatish faollashadi; Joylashtirish maydonidagi bo'sh kvadratni bosish rasmni u erga qo'yadi va tugmani o'chiradi. Barcha tugmalar o'chirilgandan so'ng, harakat dushmanga o'tkaziladi.

Har bir yangi harakatning boshida barcha tugmalar yana yoqiladi: bu odam hali kimga o'xshamaganligini sezishi osonroq bo'lishi uchun amalga oshiriladi. Shunga ko'ra, tugmani bosish raqamni tanlaydi va harakat qilish bilanoq tugma yo'qoladi. Boshqa tugma - "Burilishni tugatish" - faqat joylashtirish bosqichidan keyin paydo bo'ladi.

Oxirgi marta biz allaqachon interfeys elementlarini yoqish va o'chirish operatsiyalarini bajarganmiz, shuning uchun biz ushbu operatsiyani batafsil tahlil qilmaymiz - misol kodiga qarang.

Shaklning harakatlanishi

// Agar tanlangan katak dushman tomonidan ishg'ol qilingan bo'lsa, biz hujum qilamiz,

// bo'sh bo'lsa, aylanib yuramiz, o'zimizniki bilan band bo'lsak

// yoki to'siq - chertishga e'tibor bermang

Tile:= Map.MouseTile(MouseX, MouseY);

agar(Kafel = nol)// O'yin oynasi tashqarisida bosing

keyin Chiqish;

// Harakatlanuvchi

agar(Tile.Objects.Count = 0)

va(Dist(O'z)

va yo'q Ko'chib keyin

// Keling, u erga borishimiz mumkinligini tekshirib ko'raylik

agar emas HasWay (plitka) keyin Chiqish;

MoveObj(ID, Tile.x, Tile.y);

// O'yin navbatga asoslangan - darhol harakatlaning

Ko'chirildi:= rost;

//

agar Hujum qilingan keyin

Icon.IsVisible:= yolg'on;

// Hujum

agar(Tile.Objects.Count > 0)

va(Dist(O'z)

va yo'q Hujum qilingan keyin

Obj:= Tile.Objects;

// Biz faqat dushmanlarga hujum qilamiz

agar Obj.Side = Yon keyin Chiqish;

Obj.Damage(dmg);

Hujum qilingan:= rost;

// Agar harakat tugallangan bo'lsa, belgini olib tashlang

agar Ko'chib keyin

Icon.IsVisible:= yolg'on;

Ko'chirish quyidagi tarzda amalga oshiriladi (qarang: "Bo'laklarni ko'chirish"). Bosilgan katak joylashgan. Agar uning ustida dushman bo'lsa va ular masofada bo'lsa, u zarar ko'radi; agar u bo'sh bo'lsa va masofa ichida bo'lsa, parcha harakatlanadi (agar to'siqlar imkon bersa); agar u dushman tomonidan emas, balki egallab olingan bo'lsa, chertish e'tiborga olinmaydi. .

Ikkala tomon yaqinlashganda, ajdarlar harakat qilishdi. Ular juda oddiy ishlaydi: ular 7 kvadrat ichida joylashgan eng yaqin ajdahoni tanlaydilar va hujum qilishadi. Dragon Actions kodiga qarang.

Ajdaho harakatlari

// Ajdahoning 7 kvadratidagi plitkalarni tekshirish

uchun i:= Maks(0, x - 7) uchun Minimum(MaxSize, x + 7) qil

uchun j:= Maks(0, y - 7) uchun Minimal(MaxSize, y + 7) qil

agar (Map.Tiles.Objects.Count > 0) va

(Map.Tiles.Objects.Code>1)

// 0 - to'siq kodi, 1 - ajdaho

keyin boshlanishi

// Ko'chirish uchun nuqta tanlash

agar x=i keyin ax:=i

boshqa agar x>i keyin ax:=i+2

boshqa ax:= i-2;

agar y=j keyin ay:=j

boshqa agar y>j keyin ay:= j+2

boshqa ay:= j-2;

MoveObj(NO, ax, ay);

// Keling, hujum qilaylik

Map.Tiles.Damage(12);

// Tsiklni buzish: bitta hujumdan ortiq emas

// har bir turda har bir ajdaho

Va nihoyat, obelisklarning yarmidan ko'pini bir tomonning qo'shinlari egallab olganligini tekshirish qoladi - va agar ular bo'lsa, o'yinni to'xtating va g'olibni e'lon qiling!


Shunday qilib, bizda strategiya o'yini bor. Biroq, to'liq baxt uchun, birinchi navbatda, sun'iy intellekt etishmaydi, bu o'yinni bitta o'yinchi rejimiga ega bo'lishiga imkon beradi ( eng oddiy protsedura Biz ajdaho nazoratini hisoblamaymiz). Keyingi safar shunday qilamiz. Bir oydan keyin ko'rishguncha!

Kelgusi sonlarda

Quyidagi masalalarda biz gaplashamiz:

  • tutun, uchqun va boshqalarni ko'rsatish uchun zarrachalar tizimlari;
  • shaffoflik bilan ishlash;
  • uch o'lchamli dvigatellar;
  • AI asoslari;
  • dasturni tuzatish;
  • o'yin rejasi va skriptini yaratish,
  • dizayn hujjatini yozish;
  • o'yin balansi;
  • o'yin qahramonlari va ularning chiziqlari orqali fikr yuritish;
  • Photoshop va 3D paketlar bilan ishlash;
  • animatsiyalar;
  • musiqa va ovozli aktyorlik;
  • va yana ko'p narsalar.

Bularning barchasini o'z qo'llaringiz bilan qanday qilishni o'rganish juda mumkin. Tez orada buni ko'rasiz.

Bizga yozing…

Paketni biror narsa bilan to'ldirish mumkin deb o'ylaydiganlar uchun: birinchi navbatda, yo'qligini unutmang Yakuniy versiya paket, lekin faqat bizning maqolalarimizda tasvirlangan funktsiyalarni amalga oshiradigan. Ehtimol, ba'zi g'oyalaringiz allaqachon amalga oshirilgan va o'z navbatini kutayotgandir ("Kelgusi sonlarda" yon panelga qarang). Va har qanday holatda: bizga g'oya taklif qilayotganda, sizning taklifingiz nima uchun faqat sizning o'ziga xosingiz uchun emas, balki bir vaqtning o'zida ko'plab o'yinlar uchun foydali ekanligini asoslashga harakat qiling.

Mustaqil ish uchun

Keyingi sonni kutayotganda, siz o'zingizning loyihangiz ustida ishlashingiz mumkin yoki uni yaxshilashga harakat qilishingiz mumkin. O'zingizning amalga oshirishingiz uchun ba'zi fikrlar:

  • to'siqlarni buzilmaydigan (daraxtlar va butalar) va buzilmaydigan (toshlar) ga bo'ling va olov sharlari va ajdaho nafasi o'simliklarni yoqib yuborishiga ishonch hosil qiling;
  • yong'in hujumi boshlangan joyda chuqurlarni (jigarrang hujayra) yoki bir necha burilishlar uchun yonib turadigan olovni (qizil hujayra) yaratish;
  • qilichbozlar va ritsarlarga o'z qo'shnilarini qoplashlariga ruxsat bering, ularga mudofaa uchun +1 bering;
  • ekrandagi figuralarning harakatini silliq qilish.

Agar real vaqtda bo'lsa-chi?

Agar siz o'yinchilarga turli xil kirish vositalarini taqdim etsangiz, real vaqtda strategiya o'yinini yaratish qiyin bo'lmaydi. Buni qilishning eng oson yo'li tarmoq orqali - biz bu haqda kelgusi sonlardan birida gaplashamiz. Quyidagi o'zgarishlar ham kerak bo'ladi:

  • maydon kerak emas O'yin tezligi sinfda TObeliskObject- asosiy dvigateldan tezlikdan foydalaning (ekran bo'ylab harakat tezligi o'yin tezligiga teng);
  • masofalarni butun son bilan hisoblash o'chirilgan;
  • to'siqlar atrofida traektoriya chizish zarurligini hisobga olgan holda figuraning harakat kodi qayta yoziladi;
  • "Ko'chirishning oxiri" tugmasi olib tashlanadi.

Ana xolos. Buni o'zingiz qilishga harakat qilasizmi?

Men sizning kompaniyangizni mamlakatimizdagi konsalting xizmatlari bozoridagi eng kuchlilaridan biri deb bilaman. Menga boshqaruv muammolarining keng doirasiga to‘xtalib, ularni yetarlicha sifat va chuqurlik bilan qamrab olganingiz yoqadi. Men sizning kompaniyangiz nashrlarida juda ko'p foydali ma'lumotlarni topaman, chunki professionallarning tajribasi bilan tanishish va ulardan o'rganish har doim qiziqarli.

Borisyuk Yuriy Aleksandrovich, boshqaruv maslahatchisi, shifokor texnik fanlar

Siz o'rgatayotgan mahorat darslari menga juda yoqadi. Shaxsan men ilgari zavod rahbari bo'lganim uchun menejmentga yondashuvlarimni o'zgartira boshladim, shu jumladan. sizdan olingan ma'lumotlar uchun rahmat. U zavodda qilgan va kuzatganlarimga qandaydir tarzda javob berdi. O'shandan beri men Rossiyaning sanoat imkoniyatlari qanchalik samarasiz ekanligi va salohiyat qanchalik ulkan va buni qanday amalga oshirish mumkinligi haqida o'ylay boshladim. Muammolar bilan shaxsan tanishish turli korxonalar(ba'zida do'stlar meni mutaxassis sifatida taklif qilishadi) Men qanchalik ko'p ish qilish mumkinligini, qanday qilib samaradorlikni va samaradorlikni oshirishni ko'raman.

Dryagin Oleg Borisovich

Ha, mahorat darslari menga yoqadi, juda tizimli yondashuv, materialni yuqori saviyada bilish va, albatta, ko‘rib chiqilayotgan masalalarda katta amaliy tajriba. Meni o'ziga jalb qiladigan narsa shu Aleksandrning professionalligi va ushbu mavzu bo'yicha yuqori darajadagi professional bilimi menga allaqachon tanish bo'lgan narsalarga boshqacha qarashga imkon beradi. Mening nuqtai nazarimdan bu Bilgan narsalarga yangicha qarash juda muhim va zarur, chunki... Jarrohlik ishi paytida ko'pincha ko'z "loyqa" bo'lib qoladi va siz, aslida, aniq narsalarni ko'rishni to'xtatasiz.

Elena Fedash, ATB korporatsiyasining kadrlar bo'yicha direktori, Dnepropetrovsk.