所以我有一个超级简单的掷硬币游戏,但是它是多人游戏,因此里面有很多代码。在游戏的翻转部分,我遇到了一个问题。
我想要它,以便每当掷硬币时,如果硬币落在头上,数字1就会存储到Firebase数据库中;如果硬币落在头上,我希望数字2将存储起来。
这就是我现在的工作方式:
private void startGame() {
flipCoin();
games.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull final DataSnapshot dataSnapshot) {
HomePage.getCurrentGameID(new HomePage.CallbackID() {
@Override
public void onSuccess(String currentGameID) {
games.child(currentGameID).child("horT").setValue(getCoinSide());
}
});
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
一旦两个玩家都加入游戏并达到“就绪”状态,则将调用此方法。您可以看到,它首先调用了flipCoin()方法,即:
private void flipCoin() {
final Random r = new Random();
coinSide = r.nextInt(2) + 1;
}
然后我使用getCoinSide()
在数据库中设置头或尾(1或2),正如您已经在此行中看到的那样
games.child(currentGameID).child("horT").setValue(getCoinSide());
我的getCoinSide()就是这样:
private int getCoinSide() {
return coinSide;
}
所以这有点奏效。它获取一个数字并将其存储在数据库中,但是问题在于它不断地将其连续地存储在数据库中。因此定义正面或反面的数字每隔半秒就会切换为1或2。如何获得没有变化机会的静态数字?
答案 0 :(得分:2)
您编写了一个无限循环。您在数据库(games
)的某个位置有一个侦听器,只要该位置 或 下的任何值发生变化,就会调用该侦听器。在您的侦听器内部,您有一些代码将值写入games
下的位置。然后,该写入的值会触发您在games
处添加的侦听器,该侦听器将在其中写入另一个值,等等。
您将不得不找出其他方法来满足游戏的要求,而无需编写这样的自触发侦听器,这可能是通过限制侦听器的范围以使其也不会侦听重视它的写作。