Yanıtlar:
Veritabanındaki bir ağacı temsil etmek için böyle bir yapı kullanın:
#Talent
id parent description
1 0 Tackle
2 1 Kick
3 1 Punch
4 3 Fire Punch
Ve kullanıcı başına kazanılmış yetenekleri temsil eden başka bir tablo
#UserTalent
id user talent
1 4 1
2 4 3
3 4 4
Yetenek bağımlılıklarını programlı olarak tüm yetenek tablosunu sorgulayarak ve bağlantılı bir ağaç oluşturarak kontrol edebilirsiniz. Bunu SQL ile de yapabilirsiniz, ancak özyinelemeli alt seçimler veya çok fazla sorgu gerektirecektir. Kodunda yapsan iyi olur.
Örnek için gibi birden bağımlılıkları varsa Fire Punch
bağlıdır Punch
VE Immolation
bağımlılık grafiği temsil etmek iki tablo kullanın:
#Talent
id description
1 Tackle
2 Kick
3 Punch
4 Fire Punch
5 Immolation
#Depedency
id parent child
1 0 1
2 0 5
3 1 2
4 1 3
5 3 4
6 5 4
Her düğümün belirli bir yetenek / beceriyi temsil ettiği bir ağaç kullanmanızı tavsiye ederim . Oyuncunun bir yetenek kazanıp kazanmadığına bağlı olarak, çocuğun yetenekleri kazanılabilir. Örneğin aşağıdaki veri yapısı
class Talent {
std::vector<Talent*> children;
bool earned;
};
Bir oyuncunun hangi yeteneklere sahip olduğunu belirlemek için, kök yeteneğini alır ve kazanılanların yanlış olduğu yetenek düğümlerine ulaşana kadar grafiğin içinde yürürsün. Bu aynı zamanda hangi yeteneklerin edinilebileceğini de ortaya çıkaracaktır: her daldaki ilk yetenek, kazanılan kök yeteneğinden aşağıya doğru.
ptr_vector
daha iyi olabilir.
Oyunumda şöyle yapıyorum:
Veritabanı:
reference_talent : benzersiz bir kimlik, ad, efekt vb.
yetenek : id, playerid <- oyuncuların "öğrendiği" bütün yetenekleri içerir.
Oyun içi: (sunucuda)
Reference_talents'ı 'statik' (salt okunur) std :: map içine yükledim, böylece kimlikleriyle kolayca erişebiliyorum.
Bir müşteri bir oyuncuyu kontrol ettiğinde, tüm yetenekleri veri tabanından alırım ve bunları bir std :: vector içinde toplarım, böylece özellikleri hesaplamak için ihtiyaç duyduğumda vb. Ayrıca yetenekleri müşteriye gönderiyorum.
Bu konuda (elbette 'yetenek' tablosunda sadece 'INSERT' olan + müşteriye bir mesaj olan yeni yeteneklerin kaydedilmesi dışında).
Bu öğreticideki gibi kilidini açanlar ve kilidi açılmamışlar arasındaki ilişki olarak tanımlarsınız . İlişkisel cebir ve veritabanları hakkında daha fazla şey öğrenmenizi öneririm. Verileri modellemenin iyi bir yoludur. Bilgileri veritabanından nasıl sorgulayacağınızı öğrenirseniz, verileri kolayca kolayca modelleyebilirsiniz.
Modelleme ilişkileri hakkında ne biliyorsun bilmiyorum. Bu eğitim size bu konuda yardımcı olmalıdır.
WoW'nun gerçekte olduğu gibi çalıştığını (ehm), olduğunu
Bu N: N ilişkisidir; bu, iki yetenek arasında yeni bir ilişkiye "orta erkeğe" ihtiyacınız olduğunu gösterir:
(talent who unlocks id, talent who is unlocked)
Böylece A, B, C ve D ((A, B), (A, C), (A, D)) ve X, Z ve W ((X, Y), ( Z, Y), (W, Y)). Emir kipi / yordamsal / nesne yönelimli dilde, orada olduğu gibi çiftlerin listesi / listesi olarak yaparsınız:
var unlocks_unlocked = [[A, B],[A,C],[A,D],[X,Y],[Z,Y],[W,Y]];
Yani "gerçek dünya" örneği için şunları yapabilirsiniz:
... ["running fast", "jumping superhigh"], ["antigravity's child", "jumping superhigh"]
ve "hızlı koşmak" ve "yerçekimi karşıtı çocuğun" yeteneklerinden sonra "süper atlamak" anlamına geliyor.
Son zamanlarda Diablo'yu oynamamıştım, ama olabileceği gibi, sadece vardı:
1: N ilişkisi:
You put "is unlocked by this talent's id" variable into talent's structure
sevmek:
var Talent[8] = { "name": "superpower", "unlocked by": "being Clark Kent"};
UserTalent
tabloda, bir autokey sütunun ihtiyacı yok.user
vetalent
sadece iki sütun ve birleşik anahtar olabilir: bunlar asla kopya olmaz veid
yine de sorgulamazsınız .