Kartların iki önemli özelliğe sahip olduğu bir kart oyunu modellemeye çalışıyorum:
Birincisi bir etkidir. Bunlar, kartı oynadığınızda meydana gelen oyun durumundaki değişikliklerdir. Etki için arayüz aşağıdaki gibidir:
boolean isPlayable(Player p, GameState gs);
void play(Player p, GameState gs);
Ve ancak maliyetini karşılayabiliyorsanız ve tüm etkileri oynatılabiliyorsa kartın oynanabilir olduğunu düşünebilirsiniz. Şöyle ki:
// in Card class
boolean isPlayable(Player p, GameState gs) {
if(p.resource < this.cost) return false;
for(Effect e : this.effects) {
if(!e.isPlayable(p,gs)) return false;
}
return true;
}
Tamam, şimdiye kadar oldukça basit.
Karttaki diğer özellikler ise yeteneklerdir. Bu yetenekler, istek üzerine etkinleştirebileceğiniz oyun durumundaki değişikliklerdir. Bunlar için arabirim ortaya çıktığında, etkinleştirilip etkinleştirilemeyeceklerini belirlemek için bir yönteme ve aktivasyonun uygulanması için bir yönteme ihtiyaç duyduklarını fark ettim. Sonuçta
boolean isActivatable(Player p, GameState gs);
void activate(Player p, GameState gs);
Ve bunu "oynamak" yerine "aktive" olarak adlandırmak dışında Ability
ve Effect
aynı imzanın olduğunu anlıyorum .
Aynı imzayla birden fazla arayüze sahip olmak kötü bir şey midir? Sadece bir tane kullanmalı mıyım ve aynı arabirimin iki setine sahip miyim? Bu şekilde:
Set<Effect> effects;
Set<Effect> abilities;
Eğer öyleyse, özdeş olmadıkları takdirde (daha fazla özellik yayınlandıkça), özellikle de ıraksaklarsa (yani her ikisinin de diğerinin almaması gereken bir şeyi kazanması durumunda, tek bir kazanım elde etmeleri gerekiyorsa , hangi yeniden düzenleme adımlarını izlemeliyim? diğeri ise tam bir alt küme)? Özellikle bir şeyler değiştiğinde onları birleştirmenin sürdürülebilir olmayacağından endişe duyuyorum.
İnce baskı:
Bu sorunun oyun geliştirmeyle ortaya çıktığını biliyorum, ancak özellikle oyun dışı geliştirmede, özellikle de birden fazla müşterinin iş modellerini hemen hemen tek bir uygulamada barındırmaya çalışırken, bu kadar kolay sürünebilecek bir sorun olduğunu hissediyorum. birden fazla iş etkisi ile yaptığım her proje ... Ayrıca, kullanılan parçacıklar Java parçacıklarıdır, ancak bu çok sayıda nesne yönelimli dilde de kolaylıkla uygulanabilir.