Sıfırdan bir strateji oluşturmak - ayrıntılı bir kılavuz. Akıllı mı yoksa aptal müşteri mi? Sıra tabanlı bir strateji oluşturun

tema_parkı:
İhtiyacımız olacak:
bina ruhu
hareketli menü
AŞAĞIDAKİ GİBİ ÇEŞİTLİ DÜĞMELERİN SPRİTELERİ:
yazıtlı yazı (inşaat, inşaat, inşaat vb.)
görünen bir pencere
bina çizimi,
1) gerisini kendimiz ekleyeceğiz
2) sahte kelimesi - benim tarafımdan yaratıldı, çünkü kaynağımızla eşleşmesi için sahtesini yapmamız gerekecek)
Haydi başlayalım:
1) 1. madde hariç, I. maddede yazılan her şeyi yaratın)
Para adında global bir değişken oluşturalım, başlangıçtaki herhangi bir para miktarını ayarlayalım
Ayrıca bir fare ve klavye nesnesi oluşturacağız
Bir metin oluşturalım, buna bilgi adını verelim, bir Always olayı oluşturalım ve içinde bir eylem oluşturalım:
eylem seçiminde bilgi seçin metindeki metni ayarla seçeneğini seçin şunu yazın:
"para: " &(küresel("para".
2) bir menü ekleyin, menünün asıl görevi müdahale etmek değil, oyuncunun gezinmesine yardımcı olmaktır (nasıl müdahale edebilir? - oyunun ortasına yerleştirirseniz kolaydır); menüyü yapmadan önce, Yazdığımız görüntüleme öğesinde, oranlarında (ayarlar, seçenekler) menü adını vereceğimiz yeni bir katman oluşturacağız:


içine bir sprite ekleyeceğiz ve üretim öncesi materyallerdeki menünün görüntüsünü (I noktası) alıp menümüzü müdahale etmeyeceği ancak ekranda görüneceği tenha bir yere yerleştireceğiz.
Ayrıca ön kaplama malzemelerinden yapılmış (I noktası) BUILD (veya buna benzer bir şey) yazısıyla bir düğme yerleştirelim.
bunu menüye koyalım
Şimdi Etkinlik Sayfası Düzenleyicisine gidin
bir etkinlik oluştur (#blah blah blah# - bu benim sana mesajım (açıklama) sadece bla bla bla yerine benim yorumum olacak; >> - eylem; ll - pencerelerin bölünmesi örneğin:

fare&klavye ll tıklanan nesnede ll nesneye sol tıklandığında #BUILD yazan menü düğmeniz (veya buna benzer bir şey)## geri kalanı daha sonra (bkz. madde 3)#
3)şimdi en zor kısım(Çok karmaşık olmaması için bunu iki noktaya ayırdım),
ön kaplama malzemelerinden "görünecek bir pencere" içeren bir hareketli grafik oluşturun
daha sonra p1 adında boş bir hareketli grafik oluşturuyoruz, pencereyi ekranın dışına taşıyoruz ve oluştur düğmesine bastığınızda (veya CHVER gibi bir şeye) pencerenizin görünmesi gereken yere p1'i koyuyoruz
harika! Şimdi etkinlik sayfası düzenleyicisine gidin
Bitmeyen olayı sonuna kadar yazalım:
Metin ll metni ayarla ll bla-bla-bla)
fare&klavye ll tıklanan nesnede ll nesneye sol tıklandığında #OLUŞTUR etiketli menü düğmeniz (veya buna benzer bir şey)#>>
4)En zor kısmın ikinci kısmı:
binanın görselinin (ön kaplama malzemeleri) çizileceği bir hareketli grafik oluşturalım, adını h1 koyalım
boş bir hareketli grafik oluşturalım, buna p2 adını verelim, şimdi onu pencerenin açılması gereken yere yerleştirelim,
Bir hareketli grafik, ayrıca bir pencere (ön kaplama malzemeleri) oluşturalım, pencereye binanın adını, maliyetini ve açıklamasını (isteğe bağlı) güzel bir şekilde yazacağız ve buna i1 adını vereceğiz.
p3 adında başka bir boş karakter yaratalım, onu p2'nin yanına yerleştirelim, yalnızca p2'ye sol üst köşeyle dokunacak şekilde
Şimdi birkaç etkinlik oluşturalım, ancak önce önceki etkinliği yeni bir eylem haline getirelim:
fare&klavye ll tıklanan nesne üzerinde ll nesneye sol tıklanır #menünüzün BUILD yazan düğmesi (veya buna benzer bir şey)#>> sistem ll nesneye göre nesne oluşturacaktır ll #pencereniz# #menü adı altındaki katman numarası# # # X ;Y-p1 nesnesine# değiştirmeyin
>>sistem ll nesneye göre nesne oluştur ll #ikinci pencereniz# #menü adı altındaki katman numarası# #X;Y-nesneyi p2 olarak değiştirmeyin
Ayrıca ona bir etkinlik yapmamız gerekiyor:
olayı kopyalayın ve tersine çevirin
yeni etkinlik
fare&klavye ll nesnenin üzerindedir ll h1>>sistem ll nesneyi nesneye göre oluşturur ll i1 #menü adı altındaki katman numarası# #X;Y-nesne p3'e değişmez#
Bir binayla bir hareketli grafik yapalım (üretim öncesi malzemeleri kullanın) ve ona ev adını verelim
Menüde seçildiğinde binalarımızın görüneceği bir pencere oluşturalım, buna rlo adını verelim
olaylar:
fare&klavye ll tıklanan nesnenin üzerine tıklanır h1>>sisteme sol tıklanır ll nesneye göre nesne oluşturulur ll ev #katman numarası adı altında menu# #X;Y-nesne rlo olarak değiştirilmez#
>> sistem ll değerinden çıkarılacak ll #inşaat sırasında alınması gereken para miktarı#
Artık bir etkinlik inşa etmek imkansızdı
Size eski yasaklama yöntemimi anlatacağım (yazmayı bitirdiğimde, oyun tema parkı dünyasını hatırladığımda içimi burkan başka bir yöntemi keşfedeceğim)
olaylar:
ev başka bir nesneyle çarpışınca eve döner
>>evi yok edeceğim
>> sistem ll değerinden ll'yi çıkarın - #inşaat sırasında alınan para miktarının iki katı##koymanız gereken not - miktar#
temelde her şey.
III söylemek istediğim şey:

Oyunumun çökmesine çok üzüldüm.Bu bir strateji oyunuydu ve bu yazı şemasına göre derlendi.Sizden ricam fazla eleştirmeyin, uzun zamandır yazdım, konuşma hataları bulursanız yazın ve onları düzeltin
ve ayrıca izleme keyfiniz için kaynak kodu da burada, bakın, prensipte her şey burada yazılanlarla aynı, sadece bu oyunun demo versiyonuydu.Asıl önemli olan hiçbir şeyi değiştirmemek, aksi takdirde hatalı olur !
Kullan, dene, kontrol et, istediğini yap, benim için sorun değil

KaMiKaZa:
“Kod” etiketinde tüm “sistem” ifadeleri bulunmalıdır.
O zaman daha iyi olacağını düşünüyorum.
Ayrıca bana öyle geliyor ki ekran görüntüleri burada zarar görmez. Ve ayrıca yeni başlayanlar için kaynak kodu.

tema_parkı:
Olayların ekran görüntülerini nasıl alacağımı bilmiyorum.

Peki, bu gerekli değil.

ben:
theme_park, klavyede özel bir düğme var - PrintScreen

tema_parkı:
Bazı insanların bunu farklı şekilde yaptığını biliyorum. Üstelik herkesin kendi ruhu var.
ve eğer tüm bu spriteları ben kurarsam çok az kişi anlayacaktır.
Belki birisi bir artı verir? Mücadele etmeme şaşmamalı mı?

Burlaçenko:
Böyle bir dersin herhangi birinin ilgisini çekmesi için buna göre formatlanması gerekiyor ama burada "her neyse".
Ve yine de, eğer isterseniz, zamanınız olduğunda, azar azar, lütfen onu “güzelleştirin”.

tema_parkı:
tamam okuldan eve gelip hazırlanacağım.
PS. kaynak eklendi

Serega Lebedev:

iamnp, bu ekran görüntüleri daha sonra nereye gidecek?

KaMiKaZa:

Panoya.
Herhangi birine git Metin düzeltici ve "Yapıştır" işlemini gerçekleştirin veya Ctrl+V tuşlarına basın.

Bu yazıda bilinmeyen bir şeye değinmem pek mümkün değil. Tüm hesaplamalar Ajax'ın ne olduğunu bilen herkes için basit ve anlaşılırdır. Gerçek zamanlı oyunlarda () bir istemciyi bir sunucuyla nasıl birleştireceğim hakkında zaten bir makale yazmıştım. Bu makalede sıra tabanlı oyunlarda geçerli olan aynı sorunları ele alacağım.

Öyleyse ne sıra tabanlı oyun? Aşağıdaki tanım Vikipedi'de bulunabilir sıra tabanlı strateji - Gerçek zamanlı stratejinin aksine, ana özelliği oyuncuların sırayla hamle yapması olan bir bilgisayar oyunu türüdür.. Bu tanımı biraz basitleştireceğim:

  • Adım adım strateji - sıra tabanlı bir strateji oyunudur.
  • Strateji oyunu - Bu, zafere ulaşmanın anahtarının planlama ve stratejik düşünme olduğu bir oyun türüdür..
  • Sıra tabanlı oyun - temel özelliği oyuncuların sırayla hamle yapması olan bir oyun türüdür.
Sıra tabanlı oyunlar şunları içerir:
  • Sıra tabanlı stratejiler
  • Kart oyunları
  • Masa oyunları (satranç, go, tekel vb.)
Sıra tabanlı oyunların, gerçek zamanlı oyunlara kıyasla etkileşim protokolünün karmaşıklığına daha az kısıtlama getirdiğini belirtmek isterim. Yani, belirli bir olaya tepki süresi önemli bir rol oynamaz. Oyuncuya genellikle karar vermesi için 10 saniye verilir. Ping çok büyük olsa bile, örneğin 3 saniye, oyuncunun düşünmek için hâlâ 7 saniyesi vardır. Ayrıca ping atlayabilir ve atlayabilir, ancak bunu hiç umursamıyoruz (gerçek zamanlı oyunlarda bu durum pratik olarak her protokolü öldürür).

Tipik olarak (sıra tabanlı oyunların %95'inde) herhangi bir zamanda kararı tam olarak bir oyuncu verir. Sonuç olarak, yeterince yanıtlamamız gereken taleplerin sayısı daraldı.

Bu nedenle bir protokol oluştururken öncelikle uygulama ve desteğinin kolaylığına odaklanacağız. Bu sayede daha kısa sürede daha fazla kar elde edebiliriz.

Yukarıdaki mantık, belirli bir kart oyununun 2 aylık gelişimine dayanmaktadır.

Akıllı mı yoksa aptal müşteri mi?

Öncelikle müşterimizin ne kadar “akıllı” olabileceğine karar verelim. İstemcide uygulama mantığını (oyun kuralları) kopyalamaya değip değmeyeceğini tartışıyorum. Elbette, uygulamanın potansiyel olarak hacklenmesini önlemek için sunucunun akıllı olması gerekir. Ancak müşteriye iş mantığını öğretmeye değer mi?

Bu doğrudan oyununuzun durumuyla ilgili tüm veri miktarının ne kadar ağır olduğuna bağlıdır. Bu miktardaki veri büyükse, sunucuda toplanması uzun sürüyorsa ve istemciye aktarılıyorsa, sunucuyu rahatlatmak için mantığın bir kısmını istemci üzerinde uygulamak mantıklı olur. Örneğin, Civilization'da kullanılan hafıza göstergesi her zaman çizelgelerin dışındadır. İstemcide yalnızca kullanıcı arayüzünü bırakarak benzer bir şey oluşturabilir misiniz?

Öte yandan, müşteri ne kadar akıllıysa oyun geliştirme de o kadar pahalı olacaktır. Sunucu geliştirme süresinin hiçbir şekilde müşterinin bilgisine bağlı olmadığını belirtmek isterim. İstemci süper mega akıllı olsa bile, kullanıcı tarayıcı penceresini yeniden yüklemek isterse, sunucunun istemciye aktarmak için oyunla ilgili tüm verileri toplaması ve birleştirmesi gerekecektir. Bir la "Kaydedilmiş bir oyun yükleniyor". Sonuç: Akıllı bir istemci, bir uygulamayı hızlandırabilir ancak uygulamayı geliştirmek için her zaman ek kaynaklara ihtiyaç duyacaktır.

Aşağıdakileri öneririm Ölçek:

1. Kanal ses seviyesi izin veriyor mu?

Oyun durumu verilerinin tamamının ortalama ağırlığını tahmin edin. Daha sonra, sunucuya saniyede yapılan ortalama istek sayısıyla çarpın. Ortaya çıkan sayı giden veri kanalı kapasitesini aşarsa, aptal istemci kabul edilemez. Bu sayı giden kanalın% 20'sini aşarsa işe yarayıp yaramayacağını düşünmelisiniz?

2. Emek yoğun mu?

Oyun veri toplama algoritmasının karmaşıklığını (saniyenin kesirleri cinsinden) tahmin edin. Burada veritabanına yapılan tüm sorguları dikkate alın. Daha sonra, sunucuya saniyede yapılan ortalama istek sayısıyla çarpın. Süre bir saniyeyi aşarsa aptal bir müşteri kabul edilemez. Bu sayı 200 ms'yi aşarsa, bunun devam edip etmeyeceğini düşünmelisiniz?

Devamı:

Herkese selam! Şimdi size basit bir RTS'nin (RTS - Gerçek Zamanlı Strateji, yani gerçek zamanlı bir strateji) bir hamak 8.1'i (8.0'da çalışabilirlik garanti edilmez) nasıl bir objControl nesnesi oluşturacağını anlatacağım. ana nesnemiz, bir oluşturma etkinliği oluşturun ( Oluştur) Etkinlik ekle => Oluşturma (Etkinlik ekle => Oluştur) oluşturma etkinliği yalnızca bir kez yapılır - oluştururken sağdaki kontrol sekmesine tıklayın dikey menü ve Kodu çalıştır'a sağ tıklayın ve kodu yazın (en iyisi kodu kopyalamamak, ancak kendiniz yazmaktır, hatırlaması çok daha kolaydır):

200?"200px":""+(this.scrollHeight+5)+"px");">startx=0; //x'in başlangıç ​​noktası için bir değişken tanımlayın
başlangıç=0; //Y ile noktanın başlangıcı için bir değişken tanımlayın
Draw_rect=yanlış; //Seçim dikdörtgeni çizme


Değişken: Bilgi içeren hafıza parçası. Onlarla iletişim kurabileceğiniz kendi isimleri var. GML'deki değişkenler gerçek bir sayı veya bir dize içerebilir. Örneğin masa bir değişkendir, ahşap ya da cam ise bir değerdir.
Şimdi bir adım olayı oluşturuyoruz (Adım, Olay Ekle => Adım) ve işlemi tekrar gerçekleştiriyoruz (Kodu Yürüt'e sağ tıklayın):

200?"200px":""+(this.scrollHeight+5)+"px");">
if mouse_check_button_pressed(mb_left) //LMB'ye basılırsa
{
Draw_rect=true; //Bir dikdörtgen çiziyoruz
startx=fare_x; //Başlangıç ​​x konumu = fare x konumu
starty=mouse_y; //Başlangıç ​​konumu = fare konumu
tümü seçiliyken=yanlış; //Bu henüz bildirilmiş bir değişken değil, ne yapacağını daha sonra öğreneceğiz
}

Eğer mouse_check_button_released(mb_left) //LMB serbest bırakılırsa
{
Draw_rect=yanlış; //Dikdörtgen çizmiyoruz
for(i=0;i<=instance_number(par);i+=1) //Читайте про цикл for ниже
{
ii=instance_find(par,i); //Henüz yapılmamış bir nesneyi arıyoruz
if(collision_rectangle(startx,starty,mouse_x,mouse_y,ii,true,false)) //İşte çarpışma dikdörtgenimiz (kontak)
{
ii.seçili=doğru;
}
}
}

If koşullu ifadesini öğrenirken kod büyük ve karmaşıktır:
if içeren kod şu şekilde yürütülür:

200?"200px":""+(this.scrollHeight+5)+"px");">
eğer (koşul)
{
aksiyon
}

Ayrıca bir else ifadesi de içerebilir (aksi halde), örneğin:

200?"200px":""+(this.scrollHeight+5)+"px");">if (condition)
{
aksiyon
}
başka
{
eylem 2
}

For bir döngü operatörüdür ve şu şekilde yürütülür:

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


for operatörü çok güçlü bir şeydir, zor durumlarda çok yardımcı olur

Operatör - bir dilde yerleşik eylemler; örneğin en yaygın olanları int, if, else, string, switch, for, case, break, çıkış vb.'dir.

Şimdi ayrıca bir çizim olayı (çizim) oluşturup aynı şekilde yazıyoruz:

200?"200px":""+(this.scrollHeight+5)+"px");">if Draw_rect=true
{
alfa=.8;
Draw_rectangle_color(startx,starty,mouse_x,mouse_y,c_green,c_green,c_green,c_green,true);
}

Burada her şey kolay, işte aynı şey sadece Rusça'da:
bir dikdörtgen çizmemiz gerekiyorsa şeffaflığı seçip bir dikdörtgen çizeriz
işte argümanlar

200?"200px":""+(this.scrollHeight+5)+"px");">draw_rectangle_color(x1,y1,x2,y2,color 1, color 2, color 3, color 4, anahat)


anahat - yalnızca kenarın mı (doğru) yoksa içi dolu dikdörtgenin mi (yanlış) çizileceği
Yeni bir kelime bulduk - sabit, bu bir kelimeyle değiştirilen sayısal bir ifade veya koddur, hamakta yerleşik sabitler bulunur:

200?"200px":""+(this.scrollHeight+5)+"px");">true - 1
yanlış - 0
pi - 3,1415...


Bunu çözdük, şimdi yeni bir nesne - çocuklarına bağlanacak bir ana nesne - yaratmamız gerekiyor. Buna par diyelim (adı değiştirmek için kontrol nesnesi adım olayındaki kodu değiştirmeniz gerekir), created olayına şunu yazın:

200?"200px":""+(this.scrollHeight+5)+"px");">selected=false; //İşte değişkenimiz, nesne seçili olsun veya olmasın

Hepsi bu. Şimdi elbette hareket edebilen bir nesneye ihtiyacımız var, buna objTest adını veriyoruz ve create olayına kodu yazıyoruz:

200?"200px":""+(this.scrollHeight+5)+"px");">gox=x; //Nereye gitmeli...
goy=y; //tarafından
seçilmiş=yanlış; //Seçilmedik =)
object_set_parent(self,par) //İşte ebeveyn seçimi

Yeni eylem:

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

Ana nesneyi ind adlı nesneye ayarlar.
Ve yeni bir operatör: self, eylemin kendisine gideceği anlamına gelir
Korkmayın, step olayına az da olsa kaldı:

200?"200px":""+(this.scrollHeight+5)+"px");">if distance_to_point(gox,goy) > 20
{
mp_potential_step(gox,goy,6,solid);
}
if(selected=true) && mouse_check_button_pressed(mb_right)
{
gox=fare_x;
goy=fare_y;

Stratejinin oluşturulması
Amatörlere güvenemezsin:
planları beklenmedik bir şekilde işe yarayabilir,
ve kimse buna hazır değil.

(A. Cuningham)

Önceki iki sayıda öğrendik basit 2D oyunlar yapın, spriteları kontrol edin, oyun ekranını kaydırın, oyun nesnelerinin çarpışmalarını izleyin, bir arayüz oluşturun (düğmeler, fare, klavye, metin alanları) ve tam ekran ve pencereli modlarda çalışın. Bütün bunlar örnek olarak bir atari oyunu kullanılarak yapıldı.

Bu sefer atari oyunlarından daha "ciddi" bir türe, stratejilere geçeceğiz. Burada bir dizi yeni mekanizmaya hakim olmamız gerekecek, ancak burada da karmaşık bir şey olmayacak. Bu yazımızda Sıra tabanlı stratejinin yapısını inceleyelim(ve ayrıca Gerçek zamanlı strateji- bunu LKI-Creator ile yapmak daha da kolay) ve örnek olarak bir oyun yapacağız, ancak yalnızca çok kullanıcılı modu (ve ayrıca harita editörü onun için). Köşemizin bir sonraki sayısında tek oyunculu modu ele alacağız. yapay zekanın temelleri.

Bu zaten üçüncü ders olduğundan ayrıntılara girmeyeceğiz. Tümüörnek kod - neyse ki, pek çok şey önceki iki seferde yapılanlarla tamamen aynı şekilde yapıldı. Referans olması açısından örnek bir program (içinde çok sayıda yorum var) ve önceki makaleler var.

Geçmiş derslerimizin materyallerini sitemizde bulabilirsiniz. CD Bu amaç için özel olarak oluşturulan “Kendin Yap oyunu” bölümünde.

Sorunun formülasyonu

İki fantastik ordu arasındaki savaştan oluşan bir strateji oyunu yazalım. Savaşın amacı birkaç kişiyi ele geçirmektir. Dikilitaşlar, haritaya yerleştirildi. Savaştan önce 6 kişiden oluşan birliklerimizi konuşlandırıyoruz. kılıç ustaları, 4 okçular, 2 şövalyeler, 2 sihirbazlar ve 1 hayalet, bize tahsis edilen bölge dahilinde. Haritada bunlara ek olarak tarafsız olanlar da var ejderhalar.

Savaşçıların özellikleri
Dövüşçü Hareket İsabetler Menzil Zarar Koruma Yetenekler
Kılıç ustası4 8 1 7 2 -
Okçu4 5 7 5 1 -
Şövalye3 15 1 9 4 İyileştirme, Şövalye Saldırısı
Büyücü3 12 5 6 0 Ateş topu
Hayalet4 7 2 5 5 Yenilenme
Ejderha6 30 2 12 5 Uçuş

Savaşçıların özellikleri tabloda sunulmaktadır. Tedavi- bu, savaşta bir kez komşu bir savaşçıyı (hayalet hariç) tam sağlığa iyileştirme hakkıdır. Şövalye Saldırısı- Oyun başına bir kez üçlü hasar verme hakkı. Ateş topu- Sihirbazın saldırısı yalnızca yakın hedefin değil aynı zamanda çevredeki karelerin de can puanlarını ortadan kaldırır. Yenilenme- tur başına 1 vuruşun iyileşmesi. Uçuş- engellerin üzerinden geçme hakkı.

Oyun, Hot Seat versiyonunda çok oyunculu modda oynanır (bir bilgisayardan oynanır, teker teker oynanır). Oyuncular döndükten sonra tarafsız ejderhalar sırasını alarak 7 hücrelik yarıçap içindeki herhangi bir düşmana saldırır.

Parti, taraflardan birinin haritada bulunan dikilitaşların yarısından fazlasını ele geçirmesi veya tamamen ölmesiyle sona erer.

Harita başlangıçta harita düzenleyicide ayarlandı. Dikilitaşlar, ejderhalar ve engeller (içinden geçemeyeceğiniz veya saldıramayacağınız nesneler) vardır.

İşe hazırlanma

Başlamadan önce paketi yeniden yüklememiz gerekecek LKI-Yaratıcı. Gerçek şu ki, geçen zamana göre birçok değişiklik ve ekleme yapıldı.

(Umarım Delfi zaten yüklediniz; Değilse, önceki makalemizdeki - derginin Haziran sayısında veya bu sayının CD'sinde veya web sitesinde - bu konuyla ilgili önerileri okuyun.)

Bu önemli: LKI-Creator'ın önceki sürümünün Delphi'nin yeni sürümleriyle bazı uyumluluk sorunları vardı. Bu versiyonda bunlar ortadan kaldırılmıştır.

Program metinleri ve resimleri içeren dosyayı CD'mizden alın (“Kendi ellerinizle oyun” bölümü) ve proje dizinine açın.

Artık indirebilirsiniz gerekli dosyalar buradan .

Üç alt dizinimiz olmalı. Bir - Birimler - LKI-Creator paketinin DirectX kitaplıklarını ve modüllerini saklar. Başka bir projede - çalışacağız; ihtiyaç duyacağımız resimler önceden oraya yerleştirilir ve önceki versiyon bizim oyun salonumuz. Üçüncüsü - Eskort - başarılı olmamız gereken hazır bir program.

Şimdi LKI-Creator'ı kuralım (yeniden kuralım). Delphi menüsünde Bileşen öğesini açın ve Bileşeni Yükle seçeneğini seçin. Bu paketi zaten yüklediyseniz Mevcut pakete sekmesinde kalın, aksi takdirde Yeni pakete sekmesine gidin ve şekilde gösterildiği gibi boş satırları doldurun (en üst satırda en kolay yol LKI2dEngine.dll dosyasını seçmektir). Gözat düğmesini kullanarak pas dosyasına gidin ve alt kısma sadece LKI yazın). Daha sonra Tamam'a tıklayın ve Yükle'yi seçin. Artık Delphi'nin üst panelinde LKI sekmesini görmelisiniz.

Artık geriye sadece projemizi yüklemek kalıyor. Dosya menüsünde Aç'ı seçin, Project\Obelisk.dpr dosyasını açın…

Harita nerede Billy? Bir haritaya ihtiyacımız var!

Ancak büyük konulara girmeden önce grafik motoru üzerinde biraz daha çalışmamız gerekecek.

Bir önceki projemiz olan Star Escort'ta “haritanın” hiçbir anlamı yoktu; yıldızlar rastgele yerleştiriliyordu ve hiçbir şeyi etkilemiyordu, diğer nesnelerin konumu ya doğrudan kodda belirtiliyor ya da tesadüfen belirleniyordu. Bu her projeye uygun değildir. Bu, motorumuza ekleme zamanımızın geldiği anlamına geliyor alan haritası.

Muhtemelen neye benzeyeceğini zaten tahmin edebilirsiniz - proje penceresine bir harita nesnesi yerleştiririz ve ardından onu özelliğe kaydederiz. Harita bizim motorumuz.

Bu böyle... ama birden fazla kart sınıfımız var. Hadi daha yakından bakalım...

Kart türleri

Harita bir şeyden oluşuyor manzara Ve nesnelerüzerine kurulu. Manzara çoğunlukla (ancak her zaman değil) hücrelere bölünmüştür. fayans- fayans.

Bir okul geometri dersinden bildiğimiz gibi, bir düzlem üç türden normal çokgenlerle boşluklar veya örtüşmeler olmadan kaplanabilir: üçgen (eşkenar), kare, altıgen. Üçgen alanlar özellikle uygun değildir, bu nedenle kare hücreler veya altıgenler daha sık kullanılır.

Bir bakıma karelerle yaşamak daha kolaydır: Eğer iki boyutlu bir hücre dizimiz varsa, belirli bir hücreye bitişik hücreleri nasıl bulacağımız hemen anlaşılır. Bunlar iki endeksin her biri için +1 ve -1'dir. Altıgenlerde her şey biraz daha karmaşıktır... ancak altıgen tahtanın çok değerli bir özelliği vardır: içindeki tüm yönler aynıdır. Kare ızgarada durum böyle değildir: köşegenler yatay ve dikeylerden önemli ölçüde farklıdır. Bu nedenle ciddi stratejik hesaplamalar için altıgenler karelerden daha iyi olabilir.

Döşemesiz kartlar da vardır. LKI-Creator iki türü destekler: grafik ve yama işi.

Grafik haritası, yalnızca birkaç önemli noktanın ve belki de özel alanların (örneğin geçilemez olanlar) anlam taşıdığı bir haritadır ve geri kalanı, oyun etkisi olmayan bir modeldir. Master of Orion'da olduğu gibi yıldız haritaları sıklıkla bu şekilde yapılır: yıldızlar ve kara delikler kilit noktalardır, gerisi arka plandır. Bu modda bazen örneğin bir rol yapma oyunu için küresel haritalar yaparlar.

Patchwork haritası alanlara bölünmüştür ve alanın içindeki tüm noktalar aynıdır, “patchwork” boyunca hareket edemezsiniz. Bu, bir ilin minimum bölge birimi olduğu küresel stratejiler için iyidir.

Çeşitli oyunlardan, türünü belirten kart örnekleri resimlerde mevcuttur.

Yani çoğunluk iki boyutlu haritalar (üç boyutlu - özel bir makale) dört sınıfa ayrılabilir:

  • Dikdörtgen- TLKIRectMap. Bu döşenmiş bir harita, hücreler kareler. Böyle bir harita, örneğin Civilization III'te.
  • Altıgen- TLKIHex Haritası. Altıgen hücreli kiremitli harita. Pek çok savaş oyununda kullanılır ve yalnızca bunlarla sınırlı değildir: örneğin Heroes of Might & Magic savaş haritası geleneksel olarak bu şekilde yapılmıştır.

    Bu iki kart türü genel sınıfın torunlarıdır TLKITileMap.

  • Graphovaya- TLKIGraph Haritası. Bu kart var arka plan (Arka plan özelliği) ve üzerinde vurgulanan kilit noktalar statik nesnelerdir. Bu haritadaki diğer nesnelerin konumu ya sıradan koordinatlarla (yıldızlararası uzaydaki bir uzay gemisi gibi) ya da bir nesneye referansla (bir gezegenin yörüngesindeki aynı gemi) ifade edilir. Bunlar Master of Orion, Arcanum (global) vb. kartlardır.
  • yama işi- TLKIClusterMap. Grafiğin biri gibi bir arka plan özelliği ve ikinci bir özelliği var - maske Hangi noktanın hangi bölgeye ait olduğunu belirleyen , özelliği Kenarlıklar, "parçalar" arasındaki bağlantıları tanımlar. Örneğin Medieval: Total War veya Victoria'da haritalar bu şekilde düzenlenir.

Bu önemli: harita sınıfları LKI2dEngine modülünde değil, LKI2dMap'te açıklanmaktadır.

Eğim açıları

Ancak bunun LKI-Creator'ın haritaları görüntüleme yeteneklerini tükettiğini düşünüyorsanız, çok yanılıyorsunuz.

Harita sunulabilir üstten görünüm veya eş ölçülü- dikey bir açıyla bakın. Örneğin, Civilization III veya Heroes of Might & Magic IV'ün haritası izometriktir, ancak Civilization I yukarıdan aşağıya bir görünümü benimser.

Tipik olarak izometri, döşenmiş haritalar için kullanılırken, grafik haritalarının ölçeği genellikle daha küçük olduğundan grafik haritaları üstten görünümle kullanılır. Ancak istisnalar da var: örneğin Medieval: Total War'da yama işi izometrik bir harita var.

Harita özelliği izometriklikten sorumludur izometrik ve kameramızın baktığı açıyı belirleyen iki parametre: Phi Ve Teta.

Birincisi, haritanın dikey eksene göre dönmesinden sorumludur: örneğin, onu 45 dereceye ayarlarsanız (derece olarak ölçülür), o zaman dikdörtgen ızgara hücresi, Medeniyet'te olduğu gibi yukarı doğru bir açıyla yönlendirilecektir. . Phi=0'da hücrenin kenarlarından biri yatay olacaktır.

İkincisi, kameranın dikeye göre eğimini kontrol eder. Kolaylık sağlamak için yatay ve dikey uzunluk birimlerinin oranı olarak verilir. Diyelim ki hücremizin genişliğinin yarısı kadar boyunda çizilmesini istiyorsak Theta'yı 2'ye ayarlamamız gerekiyor.

Döşenmiş bir haritada bu açıları keyfi olarak seçmemize izin verilmiyor: sonuçta (henüz) 3D'ye sahip değiliz. Doğrudan fayansların parametrelerine bağlıdırlar. Örneğin, yukarı açılı elmas şeklinde bir eksenimiz varsa ve dikey eksen, yatay eksenin yarısı boyutundaysa, 45 ve 2 parametrelerini ayarlamamız gerekir.

Ancak grafik ve yama haritaları size bu parametreleri istediğiniz gibi atama hakkını verir (ve hatta isterseniz bunları süreçte değiştirin), ancak buna kapılmamalısınız - ayrıca bu tür dönüşlerin zaman alması gerçeğine ek olarak çoğu zaman pek hoş da görünmüyorlar. Ve unutmayın ki haritanız sanatsal ise, resimler, yazılar vb. içeriyorsa, o zaman onunla birlikte döneceklerdir... Genel olarak, bazen gerekli dönüşü - neyse ki mesafeleri - hesaba katarak yama işi bir harita çizmek daha kolaydır. genellikle orada hiçbir rol oynamazlar.

Eklemler

Patchwork haritası, üst görünüm.

Döşeme haritalarının başka bir sorunu daha var: döşemelerin birleştirilmesi. Parametre tarafından kontrol edilir Döşeme Kenarlık Stili. Çoğu zaman bu kiremitDüz, döşemelerin herhangi bir kenar etkisi olmadan kolayca birbirine uyduğu bir mod veya kiremitSınır, bir döşemeyi diğerinden ayıran çizgilerin çizildiği - hücrelerin sınırları (ikinci durumda, tanımlamayı unutmayın) renk parametredeki kafesler Döşeme Kenarlığı Rengi).

Ancak aynı döşemelerin değişiklik yapılmadan birbirine bitişik olduğu ve özel bir "geçiş" döşemesi kullanılarak farklı döşemelerin kullanıldığı daha kurnaz bir seçenek var. Bu genellikle haritanın esas olarak tek bir tür bölgenin geniş alanlarından oluşması, örneğin geniş yeşil alanlardan oluşması ve tek bir hücrenin önemli olmaması ve oyuncu tarafından fark edilmemesi durumunda yapılır. Bu Might Magic Kahramanları kartıdır. Ancak Medeniyet'te olduğu gibi her hücre ayrı ayrı işleniyorsa, bu yöntem uygun değildir ve hücreleri birbirinden açıkça ayırmak daha iyidir. “Birleştirilmiş” teknoloji (aynı zamanda maske) şuna eşit olan TileBorderStyle değeriyle belirtilir: kiremitMaskeli. Yapıları hakkında başka zaman konuşacağız - bu oldukça karmaşık bir konu.

Fayans

Harita öğesi - sınıf nesnesi TLKITile- Basit bir yapıya sahiptir. Başlangıçta şunları içerir: koordinatlar, onu çizen karakter, döşeme türü kodu (burada ne olduğumuzu belirler - tepe, çöl, yol, deniz?) ve arazi kabiliyeti (bu çoğu oyunda geçerlidir). Sonuncusu bu döşemede ilerlemek için harcanan hareket birimi sayısıdır kara Tayfa. Geçilmez fayanslar için bu negatif bir sayıdır.

Başka bir parametre - Nesneler, bu kutucukta bulunan nesnelerin listesi (TLKIGameObject yazın).

Hangi hücreye tıklandığını bulmak için haritanın bir yöntemi vardır Fare Döşemesi(x,y) seçilen döşemeyi döndürür.

Döşeme yöntemleri şunları içerir: Komşu(Döşeme, Mesafe). Bu işlev, Döşeme verilen döşemeden Uzaklık hücrelerinden daha fazla uzakta değilse true değerini döndürür (varsayılan olarak bu parametre bire eşittir, yani yalnızca IsNeighbour(Tile) yazarsanız, işlev hemen bitişik döşeme için true değerini döndürür Verilen döşemeye Kare ızgaralar için, çapraz olarak sınırlanan döşemeler de "komşu" olarak kabul edilir.

Fonksiyonlar İlk Komşu Ve SonrakiKomşu Belirli bir hücreye bitişik tüm hücreleri kontrol etmek için kullanılır. Bunlardan ilki bir komşu hücreye işaret ediyor, ikincisi ise ancak birinciyi çağırdıktan sonra çağrılabiliyor ve sonraki komşuları birer birer dağıtıyor.

Komşuların numaralandırılması

// Hücreye zarar verilmesi

prosedür TObeliskTile.Damage(dmg: integer);

eğer(Nesneler.Sayı > 0) Ve// sahip olabiliriz

// hücre başına birden fazla nesne yok

(Nesneler.ID > 0) // Pasif nesneler

// hasar görmemiş

Aralık(Nesneler.İsabetler,

// Korumayı hasardan otomatik olarak çıkarın

Max(0,dmg-(Nesneler gibi TObeliskGameObject).Savunma);

eğer Nesneler.Hitsthen Die; // Ölüleri kaldırıyoruz

// Ateş topu saldırısı

prosedür TObeliskTile.Fireball;

var Komşu: TObeliskTile;

Komşu:= İlk Komşu as TObeliskTile;

Komşu.Damage(6);

Komşu:= Sonraki Komşu as TObeliskTile;

değin Komşu = sıfır; // Komşular bitene kadar

Bunun bir örneği “Komşuları Numaralandırma” kenar çubuğundadır. Bu prosedür, ateş topunun bir hücreye ve onun tüm komşularına çarpmasını hesaplar.

Bu ilginç: işi için hiç önemli değil altıgen veya kare bir kafesimiz var.

Genellikle başka parametrelere ihtiyaç duyarız ve genellikle haritayı oluşturan döşemelerin sınıfı azalan TLKITile. Yani örnekte - TObeliskTile, TLKITile'dan miras alınmıştır.

Bu önemli: Oyun ekranımıza döşenmiş bir harita getirirsek, mesafeyle ilgili TLKIGameObject yöntemlerinin yanı sıra koordinatlar da varsayılan olarak mesafeyi noktalar yerine döşemelerle ölçmeye başlar. Düğmelerin, simgelerin vb. koordinatları. piksel cinsinden ölçülmeye devam ediyor! Ancak bu mod kapatılabilir; bu, gerçek zamanlı stratejiler için yararlı olabilir.

Kart seçme

Öyleyse dikdörtgen bir kafes (TLKIRectMap), izometrik bir haritalama (açısal parametreler 0, 1.5) ile başlayalım. Izgaranın çizilmesine izin verin (tileBorder stili). Motora bu özel haritanın görüntülenmesi gerektiğini söyleyelim. Şu ana kadar tek satır kod yazılmadan gerekli tüm işlemler tamamlandı.

Bu işlemler yapılmalı önce motor başlatmanın yanı sıra yazı tipi bildirimi.

Rakamları daha önce olduğu gibi sprite olarak ilan edeceğiz.

Harita düzenleyici

Patchwork haritası, izometrik.

Burada oldukça fazla zorluk var. Tamamen aynı motor, aynı döşeme bildirimleri... Bir döşeme seçme, yükleme/kaydetme vb. gibi arayüz kolaylıkla yapılabilir standart araçlar Delphi: Kimse bizi bunu tercüme etmeye zorlamıyor tam ekran modu. Bunu burada analiz etmeyeceğiz; her şey örnek dosyadadır. Örnek kod kasıtlı olarak kullanıldı en basit yol; İstenirse örneğin nesne paleti ve döşeme paleti grafiği yapabilirsiniz.

Editörün bize yabancı olan yalnızca iki özelliği var. İlki oldukça basit: özellikle döşeme haritaları için tasarlanmış yeni bir fare özelliği. İşlev TLKIRectMap.SelectTile tam olarak tıklanan döşemeye bir işaretçi döndürür, böylece tıklamayı kolayca halledebiliriz.

Ancak ikinci yeni ürün daha dikkatli bir değerlendirmeyi hak ediyor.

Aslında verileri kaydetmenin ve ondan veri okumanın birçok yolu vardır. Dosyada kodlanan yöntemi seçtik Top Tabanı. Cannon, alt nesneleri okumak ve yazmak için bir araçtır TCannonObject tip kontrolü ve diğer bazı özelliklerle.

Şimdi koda bakalım (“Kart yaz”).

Kart kaydetme

prosedür TObeliskMap.Save;

var i,j: tamsayı;

InitSave(FName);

WriteStr(HaritaAdı);

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

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

için ben:=0 ile Harita.Genişlik-1 Yapmak

j için:=0 ile Harita.Yükseklik-1 Yapmak

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

İşte nasıl çalışıyor? Öncelikle dosyayı özel bir prosedür kullanarak açmanız gerekir. BaşlatKaydet, tek parametresi dosya adıdır. Daha sonra özel bir prosedür kullanarak başlığı tip kontrolü için kaydederiz Yazma Başlığı. Daha sonra prosedürü kullanarak ihtiyacımız olan her şeyi yazıyoruz. YazmaStr dizeler ve diğer tüm alanlar için - Yazmak(ikinci parametresi yazılı verinin bayt cinsinden boyutudur). Gerektiğinde nesne alanları için kendi prosedürlerinizi yazabilirsiniz. Kaydetmek bir başlık kaydı ile. Son olarak prosedürle dosyayı kapatıyoruz. FinKaydet.

Kendi başlığına sahip tüm nesnelerin ayrı ayrı bildirilmesi gerekir. Bölümde Başlatma modül (sonra gelen isteğe bağlı bölüm) Uygulama Programı başlatırken en başında yürütülmesi gereken komutları içeren), örneğin aşağıdaki satırı yazmalısınız:

RegisterUserName(tpMap, "TObeliskMap");

Tp Haritası sizin de beyan etmeniz gereken bir sabittir. Bunu 1'e eşitleyin. TObeliskMap nesnesinin yapıcısında bu sabitin değerini parametreye atayın. Tür Kimliği.

Bütün bu yaygara neden? Tür eşleştirmenin yanı sıra çok önemli bir avantaj elde edersiniz.

Örneğin yeni alanların eklenmesi nedeniyle dosya formatı değişirse, eski dosyaları yenilerine dönüştüren herhangi bir "dönüştürücü" yazmanıza gerek kalmayacaktır. Kodunuz bunları otomatik olarak okuyacaktır.

Bu kod, dosyaya kaydedilmemişse yeni alanı otomatik olarak boş olarak başlatacaktır. Ve basitçe WriteStr(Name) satırını en sonuna ekleyerek bir dosya yazabilirsiniz.

Yorum: Eğer hala bu sürecin ne işe yaradığını anlamadıysanız endişelenmeyin. Daha geleneksel kayıt ve kaydetme yöntemlerini kullanabilirsiniz. Ancak gerçekten büyük ölçekli oyun projelerinde bu yol önemli avantajlar sağlıyor.

Hadi oynayalım

Öncelikle TLKIGameObject'ten türetilmiş yeni bir sınıf oluşturmamız gerekiyor. Eskinin özelliklerini özleyeceğiz. Yeni sınıfta ana özellikler için alanlar eklemeniz gerekir: menzil, hareket vb.

Bu önemli: Eski hız parametremiz bizde kalıyor ama parçanın tur başına kat edeceği mesafeyi değil, ekran boyunca hareket eden parçanın hızını gösteriyor. Eğer gerçek zamanlı bir strateji yapıyor olsaydık yeni bir parametreye ihtiyacımız olmazdı, aksi takdirde onu tanıtmak zorunda kalacağız.

Ekranımızda okçular, kılıççılar, sihirbazlar, hayaletler, şövalyeler şeklinde TLKIButton butonlarını uygulayacağız.

Öncelikle düzenlemeyi yapıyoruz. Yerleştirme bölgesini bir taraf için haritanın üstteki üç "çizgisi", diğer taraf için alttaki üç "çizgi" olarak tanımlayalım.

Kod bu şekilde çalışıyor. Düğmelerden herhangi birine bastığınızda ilgili dövüşçünün kurulumu etkinleştirilir; Yerleştirme alanında boş bir kareye tıklamak figürü oraya yerleştirir ve düğmeyi devre dışı bırakır. Tüm düğmeler devre dışı bırakılır bırakılmaz hareket düşmana aktarılır.

Her yeni hareketin başlangıcında tüm düğmeler yeniden açılır: Bu, kişinin henüz kime benzemediğini fark etmesini kolaylaştırmak için yapılır. Buna göre düğmeye basıldığında şekil seçilir ve hareket yapıldığı anda düğme kaybolur. Başka bir düğme - "Dönüşü sonlandır" - yalnızca yerleştirme aşamasından sonra görünür.

En son arayüz öğelerini etkinleştirmek ve devre dışı bırakmak için zaten işlemler yapmıştık, bu nedenle bu işlemi ayrıntılı olarak analiz etmeyeceğiz - örnek koda bakın.

Şeklin hareketi

// Seçilen hücre düşman tarafından işgal edilmişse saldırırız,

// boşsak hareket ederiz, meşgulsek kendi işimizle uğraşırız

// veya bir engel - tıklamayı dikkate almayın

Döşeme:= Map.MouseTile(MouseX, MouseY);

eğer(Döşeme = sıfır)// Oyun penceresinin dışına tıklayın

Daha sonraçıkış;

// Hareketli

eğer(Tile.Objects.Count = 0)

Ve(Mesafe(Kendi)

ve yok Etkilenmiş Daha sonra

// Oraya varabilecek miyiz kontrol edelim

eğer Olumsuz HasWay(Döşeme) Daha sonraçıkış;

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

// Oyun sıra tabanlıdır; hemen hareket edin

Taşındı:= doğru;

//

eğer Saldırıya uğradı Daha sonra

Icon.IsVisible:= YANLIŞ;

// Saldırı

eğer(Döşeme.Nesneler.Sayı > 0)

Ve(Mesafe(Kendi)

ve yok Saldırıya uğradı Daha sonra

Obj:= Tile.Objects;

// Sadece düşmanlara saldırırız

eğer Obj.Side = Yan Daha sonraçıkış;

Obj.Damage(hasar);

Saldırıya uğradı:= doğru;

// Taşıma işlemi tamamlandıysa simgeyi kaldırın

eğer Etkilenmiş Daha sonra

Icon.IsVisible:= YANLIŞ;

Hareket şu şekilde gerçekleştirilir (bkz. “Parça hareketi”). Tıklanan hücre bulunur. Üzerinde bir düşman varsa ve menzil içindeyse zarar görür; eğer boşsa ve menzil içindeyse taş hareket eder (engeller izin veriyorsa); eğer işgal edilmişse ancak bir düşman tarafından değilse, tıklama dikkate alınmaz .

Her iki taraf da yaklaştığında ejderhalar harekete geçti. Çok basit çalışırlar: Kendilerine 7 kare mesafedeki en yakın ejderha olmayanı seçerler ve saldırırlar. Dragon Eylemleri koduna bakın.

Ejderha Eylemleri

// Ejderhanın 7 karesindeki kareler kontrol ediliyor

için i:= Maks(0, x - 7) ile Min(MaksBoyut, x + 7) Yapmak

için j:= Maks(0, y - 7) ile Min(MaksBoyut, y + 7) Yapmak

if (Map.Tiles.Objects.Count > 0) Ve

(Harita.Tiles.Objects.Code>1)

// 0 - engel kodu, 1 - ejderha

Daha sonra başlamak

// Taşınacak noktayı seçme

eğer x=i Daha sonra balta:=i

başka eğer x>i ise Daha sonra balta:=i+2

başka ax:= i-2;

eğer y=j Daha sonra evet:=j

başka eğer y>j ise Daha sonra evet:= j+2

başka ay:= j-2;

MoveObj(HAYIR, balta, ay);

// Hadi saldıralım

Harita.Tiles.Damage(12);

// Döngüyü kırmak: birden fazla saldırı yok

// tur başına her ejderha

Son olarak geriye kalan tek şey, dikilitaşların yarısından fazlasının bir tarafın birlikleri tarafından işgal edilip edilmediğini kontrol etmektir - ve eğer öyleyse, oyunu durdurun ve kazananı ilan edin!


Yani bir strateji oyunumuz var. Bununla birlikte, tam bir mutluluk için, her şeyden önce eksik olan, oyuna tek oyunculu mod vermeyi mümkün kılacak yapay zekadır (ejderhaları kontrol etmek için en basit prosedürü dikkate almıyoruz). Bir dahaki sefere yapacağımız şey bu. Bir ay sonra görüşürüz!

Gelecek sayılarda

Aşağıdaki konularda konuşacağız:

  • duman, kıvılcım vb. görüntülemek için parçacık sistemleri;
  • şeffaflıkla çalışmak;
  • üç boyutlu motorlar;
  • Yapay zekanın temelleri;
  • programda hata ayıklama;
  • Bir oyun planı ve senaryosu oluşturmak,
  • bir tasarım belgesi yazmak;
  • oyun dengesi;
  • oyun karakterleri ve replikleri üzerinde düşünmek;
  • Photoshop ve 3D paketlerle çalışma;
  • animasyonlar;
  • müzik ve seslendirme;
  • ve daha fazlası.

Tüm bunları kendi ellerinizle nasıl yapacağınızı öğrenmek oldukça mümkün. Yakında bunu göreceksiniz.

Bize yazın…

Paketin bir şeylerle desteklenebileceğini düşünenler için: Öncelikle şunu unutmayın; Son sürüm pakettir, ancak yalnızca makalelerimizde açıklanan işlevleri uygulayan pakettir. Belki de fikirlerinizden bazıları halihazırda uygulamaya konmuştur ve sıralarını beklemektedir (“Gelecekteki sayılarda” kenar çubuğuna bakın). Ve her durumda: bize bir fikir sunarken, teklifinizin neden yalnızca sizin spesifik oyununuz için değil, birçok oyun için aynı anda yararlı olduğunu gerekçelendirmeye çalışın.

Bağımsız çalışma için

Bir sonraki sayıyı beklerken kendi projeniz üzerinde çalışabilir veya bunu geliştirmeye çalışabilirsiniz. İşte kendi uygulamanız için bazı fikirler:

  • engel nesnelerini yıkılabilir (ağaçlar ve çalılar) ve yok edilemez (kayalar) olarak ikiye bölün ve ateş toplarının ve ejderhanın nefesinin bitki örtüsünü yaktığından emin olun;
  • yangın saldırısının tetiklendiği yerde çukurlar (kahverengi hücre) veya birkaç dönüş boyunca yanan bir yangın (kırmızı hücre) oluşturmak;
  • kılıç ustalarının ve şövalyelerin komşularını korumalarına izin vererek onlara savunma için +1 verir;
  • Rakamların ekrandaki hareketini pürüzsüz hale getirin.

Peki ya gerçek zamanlıysa?

Oyunculara farklı girdi araçları verirseniz, gerçek zamanlı bir strateji oyunu yapmak artık zor değil. Bunu yapmanın en kolay yolu ağ üzerindendir - önümüzdeki sayılardan birinde bunun hakkında konuşacağız. Aşağıdaki değişikliklere de ihtiyaç duyulacaktır:

  • alana gerek yok Oyun hızı sınıfta TObeliskObject- Temel motordan Hız kullanın (ekrandaki hareket hızı oyun hızına eşittir);
  • mesafelerin tamsayı hesaplaması devre dışı bırakıldı;
  • engellerin etrafında bir yörünge çizmenin gerekli olduğu gerçeği dikkate alınarak figürün hareket kodu yeniden yazılmıştır;
  • "Hareketin sonu" düğmesi kaldırıldı.

Bu kadar. Kendin yapmayı deneyecek misin?

Günümüzde pek çok ticaret stratejisini kolaylıkla bulabilirsiniz, tek sorun bunların çoğunun ya işe yaramaması ya da yeterince etkili olmamasıdır. Böyle bir durumda sıfırdan strateji oluşturmak soruna mükemmel bir çözümdür.

Ve her özel durumda bir aracın yaratılması farklı olsa da ana aşamalar aynı kalıyor. Yani, tüm aşamaları sırayla geçerek evrensel bir rehber gibi bir şey yaratabilirsiniz ve sonunda tamamen işe yarar bir sistem elde edeceğiz.

Her ne kadar sıfırdan bir strateji oluşturma seçeneğini, bir fikirle başlayıp, bir filtrenin tanıtılması ve aracın nihai geliştirilmesiyle bitirme seçeneğini değerlendirecek olsak da, bu, tüm hazır sistemlerin açıkça etkisiz olduğu gerekçesiyle derhal atılması gerektiği anlamına gelmez. . Bir dizi TS temel olarak kullanılabilir ve yanlış sinyalleri ayıklamak için sadece birkaç filtre eklenebilir.

Strateji oluşturmanın ana aşamaları

Rastgele 5-7 gösterge alıp onlardan çalışan bir araç oluşturmaya çalışırsanız, o zaman yararlı bir şeyin ortaya çıkması pek olası değildir. Öncelikle stratejinin ana fikrini düşünmeniz ve ancak bundan sonra araçları seçmeye geçmeniz gerekir. Aşağıdaki eylem sırası önerilebilir:

  • sistem sıfırdan oluşturulmuşsa ilk adım fikir üzerinde çalışmaktır. Bu aşamada, yalnızca ticaret tarzınızın ne olacağına, örneğin işlemlerin trend boyunca mı yoksa ona karşı mı gerçekleştirileceğine veya belki de stratejinin yalnızca çıkış için planlanıp planlanmadığına karar vermeniz yeterlidir. Henüz ayrıntıları düşünmüyoruz;
  • Uygun ticaret stilini seçtikten sonra ayrıntıları çözmeye başlayabilirsiniz. Enstrümanları seçmeden önce, çalışan döviz çiftlerini ve zaman dilimlerini, işlem süresini vb. açıkça belirlemeniz gerekir;

Önemli! Bir zaman dilimi seçerken, özellikle yatırımcının küçük zaman aralıklarında spekülasyon yapma deneyimi yoksa, çok küçük bir çerçeveye gidilmesi önerilmez. Yeni başlayanlar için genellikle H1-H4'ün altına inmemek daha iyidir; en uygun zaman aralığını seçme hakkında daha fazla bilgi edinebilirsiniz.

  • bir sonraki aşama uygun enstrümanların seçimidir ve burada seçim bolluğu yatırımcıya acımasız bir şaka yapabilir çünkü elinde düzinelerce gösterge, mum, dalga, teknik ve temel analiz kullanma yeteneği vardır. Tüm bu çeşitlilik arasından, amaçladığınız ticaret tarzına en uygun olan birkaç enstrümanı seçmeniz gerekir;
  • Herhangi bir stratejinin ana kurallarından biri, alınan sinyalin birkaç filtre tarafından onaylanması gerektiğidir, ancak bunların sayısının sınırlandırılması tavsiye edilir. Örneğin gösterge stratejileri için gösterge sayısının 3-4'ü geçmesi istenmez, aksi takdirde sinyallerde karışıklık olur ve teknik analiz kullanarak çalışmayı planlıyorsanız göstergeler destekleyici rol oynayacaktır;
  • konum desteğine ilişkin kurallar geliştirildiğinde, sonuç herhangi bir senaryo için bir eylem algoritması olmalıdır;
  • Son aşama, aracı önce bir geçmiş hesabında, ardından bir demo hesabında veya daha iyisi gerçek bir sent hesabında çalıştırmaktır. Ana amaç, stratejinin uygulanabilirliğini gerçek koşullarda test etmektir ve gerçek bir hesap (bir kuruş bile), coşkudan kayıpların acısına kadar tüm duyguları hissetmenize olanak tanır.

Ayrıca aracın karmaşıklığına takılıp kalmamanızı da tavsiye edebilirsiniz. Uygulama, aşırı karmaşıklığın hiçbir şekilde etkililiğin bir göstergesi olmadığını göstermektedir. Nasıl daha basit sistem ticaret yapmak o kadar kolay olur.

Araçta neler bulunmalıdır?

Strateji oluşturmak bir nevi inşaat seti gibidir; sadece doğru parçaları seçmeniz yeterlidir. Bir araç oluştururken şunları kullanabilirsiniz ve kullanmalısınız:

  • göstergeler. Üstelik ne çokluğunu ne de aşırı karmaşıklığını kovalamamalısınız, tamamen mekanik araçlarda bile 3-5 adet yeterlidir;
  • grafik desenleri - iyi bilinen bayraklar, flamalar, üçgenler, baş ve omuzlar, çift dipler ve üst kısımlar hala iyi çalışıyor;
  • grafik yapılar;
  • Fibo seviyeleri;
  • temel analizin unsurları - artık yalnızca haberlerden para kazanmak zor, ancak ticarette ekonomik takvimi dikkate almak gerekiyor. En azından ABD veya Avrupa için önemli istatistikler yayınlanmadan önce işlemleri başabaş noktasına taşıyın, hatta kârı tamamen kapatın.

Faydaları tartışmalı olan bir dizi teknik de vardır:

  • Martingale başlangıçta kârsız bir taktiktir, başarının tek şansı, kaybetmeden önce yatırdığınız tutarı telafi edip biraz kazanabilmenizdir;

  • Çok gerekmedikçe kilitlemenin kullanılması da istenmez, bu durumda kaleden ayrılmak oldukça zordur;
  • Ayrıca dışarıdan gelen sinyalleri kullanmamak daha iyidir. Dışarıdan gelen sinyaller, örneğin satıcı/alıcı sayısının karşılaştırılması, tüccarların çoğunluğunun ruh halinin çeşitli endeksleri vb. anlamına gelir. Ancak aynı zamanda dinleyebileceğiniz bir dizi kaynak da vardır; örneğin Autochartist grafik desenlere dayalı olarak iyi sinyaller verir;
  • Ayrıca dalga analizi unsurlarını kullanmamak daha iyidir (en azından yeni başlayanlar için). Burada istisnalar olmasına rağmen, örneğin Wolfe Waves'de işlem yapmak tam olarak dalga analizine dayanır, ancak özellikle karmaşık değildir.

Basit bir gösterge stratejisinin geliştirilmesi

Stratejinin ana fikrinin yalnızca trend yönünde ticaret yapmak olduğunu varsayalım. Üstelik oldukça riskli olan bir trendin ortaya çıktığı anda değil, küçük bir düzeltme tamamlandıktan sonra piyasaya gireceksiniz.

Strateji hemen hemen her döviz çifti üzerinde çalışmalıdır; bu gereklidir çünkü geniş zaman dilimi nedeniyle sinyaller çok sık meydana gelmeyecektir. Yani aynı anda 5-7 döviz çifti kullanılarak durum değerlendirilecek. Zaman aralığına gelince, D1 uygundur, Forex'in ilk aşamada sadece ana işe bir ek olduğu gerçeğinden yola çıkıyoruz, bu nedenle günlük mumlarla işlem yapacağız.

Artık gireceğiniz anın tam olarak nasıl belirleneceğine karar vermeniz gerekiyor. Bir trendi tanımlamak için birçok seçenek vardır:

  • görsel olarak - ancak göz küresi, net ticaret kuralları geliştirmenize izin vermez;
  • bir veya daha fazla hareketli ortalamanın kullanılması;
  • ADX göstergesinin değerine göre, 30'un üzerindeyse güçlü bir trend var demektir, 20'nin altındaysa piyasa sakindir;
  • grafik yapıların kullanılması;
  • Bollinger Bantları, kanalın üst ve alt sınırları arasındaki mesafeye göre bir trendin gücünü değerlendirmenize olanak tanır.

Genel olarak birçok seçenek var ancak stratejinin mümkün olduğunca basit olması gerektiğinden hareketli ortalamalara odaklanacağız. Daha doğrusu, bir MA'da trendin yönünü fiyatın ona göre konumuna göre değerlendireceğiz. Tüm bir süre boyunca (hafta, ay, çeyrek vb.) fiyatın ortalamasını alan dönemlerle başlayabilirsiniz; örneğin 20, geçen aydaki fiyatın ortalamasını alacaktır. En zor şey uygun MA dönemini seçmektir ancak burada deneme yanılma yoluyla ilerlemeniz gerekecektir.

Ticaretin ana fikri şu olacaktır: Trend hareketinin ortaya çıkmasını bekleriz, ardından bir gün içinde bir düzeltme gelir ve bunun bitiminden sonra bir anlaşma yapılır. Bütün bunlar açık kurallar biçiminde sunulursa, eylemlerin algoritması şöyle görünecektir (satın alma örneğini kullanarak):

  • öncelikle MA'ya göre fiyat pozisyonunu kontrol ederiz, fiyat çizginin üzerinde olmalıdır;
  • Daha sonra bir trend hareketi bulmamız gerekiyor, büyük gövdeli ve küçük gölgeli bir muma ihtiyacımız var (gölgenin değerinin mum gövdesinin boyutunun %10-15'ini geçmemesi tavsiye edilir);
  • bunu küçük bir günlük aralığa (Yüksekten Kapanışa olan mesafe) sahip bir mum takip etmelidir. Kapanış fiyatı önceki günün %50 seviyesine ulaşmamalıdır; bu günde fiyat düzeltmesi gerçekleşir.

Bu durumda düzeltme 2 senaryoya göre yapılabilir:

  • Altında uzun gölgeli bir mum oluştuğunda günün kapanışında hemen işlem açabilirsiniz. Mumun bu şekli düzeltmenin zaten tamamlandığını gösterir;
  • Olası bir seçenek, düzeltme mumunun minimumda kapanmasıdır; Geri dönüş henüz tamamlanmadı, bu durumda bir sonraki mum kapanana kadar beklemeniz gerekir, eğer beyazsa uzun pozisyon açabilirsiniz.

Pozisyonun ve koruma emirlerinin korunmasına gelince, zararı durdurmanın en azından geniş gövdeli mumun ortasının ötesine yerleştirilmesi gerekir. Hedef seviyeye ulaşmak için aynı mumun değerini satın alma seviyesinden ayırmak yeterlidir; takip eden stop kullanabilirsiniz.

Stratejinin kuralları oluşturuldu, geriye kalan tek şey onu eylem halinde test etmektir. Uygulama, bu kadar basit bir algoritmanın bile kârlı işlemlerin yarısından fazlasını ürettiğini göstermektedir (ve işlemi erken sıfıra çevirirseniz, kayıp olasılığı azalır).

Trendin başlangıcında giriş

Yukarıda önerilen TS, trend hareketinin bir kısmını kaçırıyor ancak piyasa analizi için fazla zaman gerektirmiyor. Günün fiyatının davranışını izlemek mümkünse, o zaman trendi oluşumunun en başında sürdürmeyi deneyebilirsiniz. Yani stratejinin ana fikri, fiyat yatay kanaldan çıkmaya başladıktan sonra pazara girmektir.

Ve burada trendin en başında güvenilir bir sinyali zamanında almak çok önemlidir. Hareketli ortalamalar yine imdada yetişebilir, ancak bunlar önceki stratejiden biraz farklı şekilde kullanılacaktır. Farklı dönemlerdeki birkaç MA'yı alabilir ve bir trendin oluşumunu birbirlerine göre konumlarına göre değerlendirebilirsiniz.

Bu devrim niteliğinde bir yaklaşım değil; Bill Williams da benzer bir şeyi ünlü Timsah'ında kullanmıştı. Yani bu gösterge TS'nin temeli bile alınabilir.

H1'e standart ayarlardaki Alligator'ı eklersek çok fazla yanlış sinyal verdiğini görebiliriz, bizim görevimiz bunları ayıklamak. Bunu yapmak için pazara bekleyen bir emirle gireceğiz ve yerleştirme seviyesi Fraktallar kullanılarak belirlenecek.

Sonuç olarak iş akışı şu şekilde görünecektir (satın alma örneğini kullanarak):

  • Grafikte düz bir alan arıyoruz (tüm Timsah çizgileri kaotik bir şekilde birbiriyle iç içe geçmiş durumda);
  • Daha sonra, fraktal bir muma ihtiyacınız var (ve alt gölgeye bile dokunmadan çizgilerin üzerine yerleştirilmelidir);
  • Maksimum seviyenin hemen üzerine bir satın alma durdurma emri verilir ve konsolidasyon bölgesinin alt sınırının ötesine koruyucu bir emir verilir;
  • TP ya sabittir (50-70 p) ya da takip eden bir durdurma kullanın. Genel olarak bir trend hareketinin gücünü tahmin etmek oldukça zordur, dolayısıyla sabit bir TP yerine takip eden stop kullanmak veya aynı teknik analizi kullanarak hedef seviyeyi belirlemek daha iyidir.

Bu örnek, sıfırdan bir strateji geliştirmek değil, daha ziyade halihazırda bilinen bir stratejinin modern pazara hafif bir uyarlamasıdır.

Basit bir birleşik sistem örneği

Fikir hala aynı - düzeltmenin sonunda giriş, ancak bu sorunu farklı bir şekilde çözeceğiz. Amaç aynı kalıyor - düzeltmenin tamamlanma anını belirlemek ve trend yönüne girmek, ancak daha önce hareketli ortalamayı kullanmış olsaydık, şimdi geri dönüşün tamamlandığını belirlemek için Fibo seviyelerini ve osilatörü kullanacağız.

Belirgin bir trend hareketi ilgimizi çekecektir, görsel olarak da belirlenebilir. Bundan sonra, Fibo seviyelerini ona kadar uzatmanız yeterlidir; bu, düzeltmeyi tamamlamak için potansiyel seviyeleri belirlemek için gereklidir. En önemli düzeltme seviyesi %38,2 olup, %50 ve %61,8'den gelen ribauntlarda işlem yapılmasına izin verilmektedir.

Ancak fiyatın Fibo seviyesine dokunması yeterli değil, teyit edilmesi gerekiyor. Stokastik bu görevin üstesinden oldukça iyi gelebilir (aynı amaç için RSI'yi kullanmayı deneyebilirsiniz). Örneğin bir alış işlemi için fiyatın düzeltme seviyesine yakın olması ve Stokastik'in o andaki aşırı satış bölgesinde olması gerekir.

Fiyat seviyeye dokunduktan sonra Stokastik'in aşırı satış bölgesinden çıkıp alım yapmasını bekleriz. Durdurma noktası bir sonraki düzeltme seviyesinin ötesine yerleştirilebilir ve TP, en azından geri çekilmenin başlamasından önceki son en yüksek seviyeye yerleştirilebilir.

Fibo seviyeleri ve bir osilatör, bir sinyal almak için gereken minimum değerlerdir. İstenirse ek filtreler ekleyerek sistemi karmaşıklaştırabilirsiniz.

Teknik analize dayalı stratejiler

Teknik analiz saf haliyle kullanılırsa, görev biraz daha basit hale gelir; artık sıfırdan bir araç geliştirmeye gerek yoktur. Etkinliği yıllar boyunca test edilmiş çok sayıda teknik ve araç vardır ve tüccar yalnızca uygun olanları seçip inşaatlarda kullanabilir.
Prensip olarak başarılı bir ticaret için bu yeterlidir:

  • trend çizgileri - bunları farklı zaman dilimlerinde oluşturuyoruz, en yüksek olandan başlayıp yavaş yavaş işe yarayan zaman dilimine iniyoruz;
  • Fibo seviyeleri, tarihteki önemli fiyat hareketlerine kadar genişletilmelidir. %38,2, 50 ve 61,8'lik düzeltme seviyeleri kilit önemde olacaktır; uygulama, düzeltmenin çoğunlukla bu işaretlerde bittiğini göstermektedir;
  • MT4 ayrıca Andrews dirgenleri, bir dizi Gann aracı, çeşitli kanal türleri vb. gibi bir dizi başka teknik analiz aracını da uygular.

Ancak oldukça doğru bir tahmin için Fibo seviyeleri ve trend çizgileri yeterlidir; seviyelerin ve çizgilerin yoğunlaştığı alanlar genellikle destek/direnç görevi görür. Ticaret hem bir çıkış hem de seviyelerden ve çizgilerden toparlanma için yapılabilir.

Ek filtrelere gelince, sapmaları aramak için mum çubuğu formasyonları ve bir tür gösterge ekleyebilirsiniz (aynı Stokastik veya MACD). Teknik analizin kullanımı hakkında daha fazla bilgi edinebilirsiniz.

Ticaret sistemleri için filtreler

Herhangi bir ticaret aracı, fikir işe yarasa ve ticaret genel olarak karlı olsa bile, çok sayıda sinyal üretir ve bunların bazıları kârsızdır. Sistem kuralları oluşturulduktan sonra karlı/karsız işlem oranını iyileştirmeye yardımcı olacak bir dizi evrensel filtre kullanabilirsiniz.

Hemen hemen her stratejiye uyacak çok sayıda filtre vardır:

  • daha yüksek zaman dilimlerinde durum. Örneğin, strateji H1'de mekanik bir stratejiye göre yürütülüyorsa, o zaman H4 ve D1'de olup bitenlere bakmak yanlış olmaz;
  • ortalama günlük aralık, fiyatın günde ortalama kat ettiği mesafe anlamına gelir; gün içi işlem yaparken bu, bir dizi sinyalin filtrelenmesine yardımcı olacaktır. Gün içerisinde fiyatın ortalama 100-120 pip hareket ettiğini, eğer günlerden birinde akşama kadar fiyat zaten bir yönde 90-100 pip'i geçmişse ve TS'nin pazara girme sinyali verdiğini hayal edelim. aynı yöndeyse bunu görmezden gelmek mantıklı olur, istatistikler trafiğin bu günde devam etme ihtimalinin düşük olduğunu söylüyor;

Önemli! Bu kurala uyulması bazı kârlı işlemlerin kaçırılmasına neden olacak ancak kârlı/zararlı işlemlerin oranı artacaktır.

  • Sinyal oluştuktan sonraki mum sayısı da önemlidir, hatta üzerinde daha detaylı duracağımız 5 mumluk bir filtre bile vardır.

TS bir sinyal verdiğinde, ideal olarak durum, işlem tamamlandıktan hemen sonra lehimize gelişmeye başlamalıdır (yani sonraki 1-3 mumda). Bu gerçekleşmezse, işlemin tamamlanmasından bu yana ne kadar çok zaman geçerse, tüccarın piyasaya girdiğinde önemli olan faktörlerin piyasa üzerindeki etkisi o kadar az olacaktır. Etkileri zamanla kaybolur.

Kriter olarak 5 mum alabilirsiniz; eğer bir anlaşma yapıldıktan sonra fiyat 5 mum için karlı bir yönde hareket etmediyse, anlaşmayı manuel olarak kapatmak daha iyidir. Bu, grafiğin yerinde kaldığı ancak fiyatın kârsız tarafa geçmiş olması durumunda bu filtrenin uygulanmadığı bir senaryo anlamına gelir.

Bu durum hemen hemen tüm zaman dilimleri için geçerlidir (m1-m5 hariç). Tabii ki, bir işaretin etrafında gezinen fiyatın doğru yönde hareket etme olasılığı hala var, ancak bizim tercihimiz istikrar. Birkaç karlı işlemden fedakarlık etmek, ancak 3-5 kârsız işlemden kaçınmak daha iyidir.

Özetleme

Ticaret sistemi olmadan çalışmaya başlamak ölüm gibidir, her tüccar bunu hatırlamalıdır. Bu durumda depozitonun kaybedilmesi an meselesidir.

Uygun bir araç seçmek zor değildir; üstelik kamuya açık alanda iyi çalışan sistemler bulabilirsiniz. Ayrıca kendi stratejinizi oluşturmaya da özen gösterebilirsiniz, özellikle bunun için programlama dilleri bilgisi gerektirmediğinden, sadece fikir sahibi olmak ve en azından piyasanın nasıl çalıştığına, hangi göstergelerin, hangi amaçlarla kullanıldığına dair temel bilgiye sahip olmak yeterlidir.

Sürecin kendisi bir inşaat setinin montajını andırıyor; önce bir problem belirliyoruz, sonra onu çözmek için gerekli araçları seçiyoruz. Geçmişi kontrol ettikten sonra demo veya cent hesabında TS testine geçebilirsiniz.


Tepe