Alanın temsili için 2 boyutlu bir IMover
slice'ı kullanılır. IMover
alan içindeki her canlı için gerekli olan methodları barındırır.
type IMover interface {
Move() (int, int)
Unit() int
X() int
Y() int
SetX(int)
SetY(int)
}
Bununla birlikte LivingThing
struct'ı IMover
interface'ini implemente eder. Bu struct alan içindeki her canlı için gerekli olan methodları ve fieldları barındırır. Alan içindeki her canlı bu struct'ı kapsar.
type LivingThing struct {
x int
y int
unitRange int
}
Alan içinde toplamda 3 farklı tür vardır; Hunter (Avcı), Predator (Yırtıcı) ve Prey (Kurban). Bu türlerin her biri IMover
interface'ini implemente eder.
Uygulama içeriside periyodik olarak, sırası ile Move
, Breed
ve Hunt
fonksiyonları çağrılır. Yani; ilk olarak her canlı rastgele bir yöne hareket eder (eğer rastgele belirlenen konumda başka bir canlı var ise konumu tekrardan hesaplanır), IBreeder
interface'ini implemente eden canlılar ürer ve IHunter
interface'ini implemente eden canlılar avlanır.
Alan içerisinde sırayla hareket edilir. Hareket etme öncelikleri şöyledir; hunter
-> predator
-> prey
. Hareketin yönü (yukarı, sağ, aşağı, sol) rastgele belirlenir. Move
fonksyonu IMover.Move
methodu çağrılır, bu method area
içerisindeki kendi objesinin x
ve y
fieldlarını günceller. Daha sonra area.matrix
üzerinde eski konumu silinir, yeni konuma atama yapılır.
Aynı cins hayvanların 3 birim yakınına gelindiğinde üreme gerçekleşir. Breed
fonksiyonu IAnimal
interface'ini implemente eden canlılar için çağrılır. Breed
methodlarında canlının 3 birim uzaklığı sol ve sağından başlanarak taranır.
Ardından Hunt
fonksiyonu çağrılır. Bu fonksiyon IHunter
interface'ini implemente eden canlılar için çağrılır. Hunt
methodlarında canlının avlayabileceği mesafe içerisindeki canlılar taranır. Eğer avlanma gerçekleşirse avlanan canlı area.matrix
üzerinden silinir.
Belirli bir konumda, 3 birim mesafe içerisindeki konumlar kırmızı ile gösterilmiştir. Tarama işlemi için ilk olarak x ekseninden 3 birim soldan ve sağdan başlanır. Tarama işleminin her adımında y ekseninden taranacak eleman sayısı 2 artar. Bu 2 elemen o anki taranan x konumunun bir üst ve bir altındaki konumlarıdır. Bu işlem x eksenindeki tarama işleminin, etrafı taranan birimin olduğu konuma gelene kadar tekrarlanır.
Toplam taranan alan şekildeki gibidir.
Taranan alan içerisinde, kendisi ile aynı tür ve farklı cinsiyetteki hayvanlar, bir slice içerisine eklenir. Daha sonra bu slice içerisinden kendisine en yakın olan hayvan seçilir. Hayvan tipinin kurucu fonksiyonu çağrılarak yeni bir hayvan oluşturulur. Oluşturulan hayvanın konumu rastgele üretilir ve area.matrix
üzerinde bu konuma atama yapılır.
-
Hunt
methodu sonrasıarea.matrix
üzerinde silme işlemi düzeltilmeli. -
Predator
vePrey
yapılarındaBreed
methodu,Hunter
vePredator
yapılarında iseHunt
methodu içerisinde tarama işlemi için tekrar eden kod blokları bulunuyor. Bu tarama işlemi için daha generic bir fonksiyon yazılmalı. -
Breed
methodu, eşleştiği hayvan daha önce üreme yapmış olsa bile üreme yapabiliyor. Bu durum düzeltilmeli. - Logging sistemi kurulmalı
Benim gözümden kaçan eksikler varsa, belirtirseniz sevinirim. 🙏