基于回合卡游戏使用Firebase和Kotlin:存储和检索数据



我正在使用kotlin和firebase创建一个基于回合的纸牌游戏。

我的问题是,每个玩家都可以在战士、法师、治疗者和弓箭手之间选择一个角色。角色都有相似的结构(生命值、攻击点、金钱和抽卡(,但他们也有单独的变量(例如法师和治疗者有法力(。我想做的是有一个包含对象"Character"的"Player"类。这意味着拥有一个"角色"类和4个继承自它的类"战士"、"法师"、"治疗者"one_answers"弓箭手"。

class Player constructor(uid: String?, name: String?): Serializable{
var mUid: String? = ""
var mName: String? = null
var mCharacter: Character? = null
var mHealth = 0
var mAttack = 0
var mMoney = 0
init {
mUid = uid
mName = name
}
...
}
abstract open class Character: Serializable {
var mStartingMoney = 0
var mStartingHealth = 0
var mStartingAttack = 0
abstract fun card1(listPlayer: HashMap<String, Player>?, currentPlayerUid: String?)
abstract fun card2(listPlayer: HashMap<String, Player>?, currentPlayerUid: String?)
abstract fun card3(listPlayer: HashMap<String, Player>?, currentPlayerUid: String?)
fun playCard(i: Int, listPlayer: HashMap<String, Player>?, currentPlayerUid: String?) {
when (i) {
1   -> card1(listPlayer, currentPlayerUid)
2   -> card2(listPlayer, currentPlayerUid)
3   -> card3(listPlayer, currentPlayerUid)
}
}
...
}
class Mage: Character() {
var mStartingMana = 0
init {
mStartingHealth = 4
mStartingAttack = 1
mStartingMoney = 2
mStartingMana = 3
}
override fun card1(listPlayer: HashMap<String, Player>?, currentPlayerUid: String?)
{
listPlayer!![currentPlayerUid]!!.addMana(2)
}
override fun card2(listPlayer: HashMap<String, Player>?, currentPlayerUid: String?)
{
listPlayer!![currentPlayerUid]!!.addMoney(2)
}
override fun card3(listPlayer: HashMap<String, Player>?, currentPlayerUid: String?)
{
listPlayer!![currentPlayerUid]!!.loseHealth(2)
}
...
}

然而,当我试图检索玩家的值时,这似乎会导致Firebase出现问题。它将尝试实例化一个Character,这是不可能的,因为它是抽象的。我想要的是Firebase在读取数据时实例化Character的正确子类型,但它无法知道它是什么子类型。

所以,如果有人对我如何做到这一点或如何更好地管理我的课程有任何建议,我将不胜感激!非常感谢。

Firebase无法知道要实例化哪个类,因此您必须自己构建该部分。通常,这意味着在数据库中存储有关字符类的属性,并在写入/读取字符的其他属性之前写入/读取该属性。

然后,一旦从数据库中读取了字符类,就可以在代码中实例化该类,并让它读取(其他(属性。

因此,如果你使用的是实时数据库,并且有一个字符的JSON路径,它看起来像这样:

val ref = FirebaseDatabase.instance.reference.child("path/to/character")
ref.addListenerForSingleValueEvent(object:ValueEventListener() {
fun onDataChange(dataSnapshot:DataSnapshot) {
val character:Char
val characterClass = dataSnapshot.child("class").getValue(String::class.java)
if ("Mage" == characterClass)
{
character = dataSnapshot.getValue(Mage::class.java)
}
}
fun onCancelled(databaseError:DatabaseError) {
throw databaseError.toException()
}
})

在Kotlin中可能有一种更惯用的方法来做到这一点,但这应该足够好,可以让你开始。

最新更新