将当前游戏的得分添加到Android的长期统计信息中

时间:2019-07-18 12:38:44

标签: java android

我正在寻找一些建议,以保持游戏中玩家的长期得分。

当我加载游戏时,它会自动创建3个新的Player对象,它们的名称分别为DannyMarkSteve(最终,我会对其进行正确整理,以便它们在List<Player>

开始新游戏时,我从两个Spinner中选择两个玩家名称,然后检查所选Spinner中的名称是否与Player对象中任何名称的名称匹配。

这是我用于main_menu的代码,其中从两个Spinners中选择了玩家

Intent intent = new Intent(Main_Menu.this, MainActivity.class);
String p1Name = playerOnesName = p1Spinner.getSelectedItem().toString();
String p2Name = playerTwosName = p2Spinner.getSelectedItem().toString();
intent.putExtra("message_key", playerOnesName);
intent.putExtra("message_key2", playerTwosName);
startActivity(intent);

然后,如果playerOnesName的名称与保存在Players列表中的任何名称相匹配,则单击开始游戏时,我会签入主要活动。

p1Name = getIntent().getStringExtra("message_key");
p2Name = getIntent().getStringExtra("message_key2");

if (p1Name.equals(p3.getName())) {
  p1.setTotalDarts(p3TotalDarts);
  p1.setTotalScore(p3TotalScore);
  p1.setHighout(p3HighOut);
  if ((p1.getTotalScore()) != 0 || p1.getTotalDarts() != 0) {
    p1.setAverage(p1.getTotalScore() / p1.getTotalDarts());
  } else {
    p1.setAverage(0.0f);
  }
}

用于保存属性的代码,

public void save() {
        SharedPreferences sharedPref = getSharedPreferences("mypref", 0);
        SharedPreferences.Editor editor = sharedPref.edit();

        editor.putInt("p4TotalScore", p4.getTotalScore());
        editor.putInt("p5TotalScore", p5.getTotalScore());
        editor.putInt("p3TotalScore", p3.getTotalScore());

        editor.putInt("p4TotalDarts", p4.getTotalDarts());
        editor.putInt("p5TotalDarts", p5.getTotalDarts());
        editor.putInt("p3TotalDarts", p3.getTotalDarts());

        editor.putInt("p4HighOut", p4.getHighout());
        editor.putInt("p5HighOut", p5.getHighout());
        editor.putInt("p3HighOut", p3.getHighout());
        //OVERALL_HIGH_OUT is a class variable.
        editor.putInt("highOut", OVERALL_HIGH_OUT);
        editor.apply();


    }

在所有情况下(例如p1 = p3,p4或p5和p2 = p3,p4或p5),我都有相同的想法。

我有一个加载按钮,它为共享的prefs加载数据,其中包含p3、4、5 totalDarts,totalScore和hightOut的int值。

我现在希望该应用为相关播放器加载上述长期值。例如p1代表p3,则p1将获得{3}的highOut totalScoretotalDarts

当我单击“保存”时,我希望这些值然后保存回p3,以便将来在加载p3时,它将具有新的更新值。

我可以想到实现此目的的方法,但是所有方法似乎都非常冗长且效率低下。

任何人都可以提供有关最佳方法的建议吗?

1 个答案:

答案 0 :(得分:0)

因此,我首先修改了保存内容,以根据Player本身保存这些播放器,而不是将p3等中的硬编码存储到String s中,并创建了一个辅助方法来保存单个名为Player的{​​{1}}。

savePlayer

现在,由于public void save() { SharedPreferences sharedPref = getSharedPreferences("mypref", 0); SharedPreferences.Editor editor = sharedPref.edit(); savePlayer(editor, p3); savePlayer(editor, p4); savePlayer(editor, p5); //OVERALL_HIGH_OUT is a class variable. editor.putInt("highOut", OVERALL_HIGH_OUT); editor.apply(); } //Used to save a single Player based on the Player Object public void savePlayer(SharedPreferences.Editor editor, Player p) { editor.putInt(p.getName() + "TotalScore", p.getTotalScore()); editor.putInt(p.getName() + "p4TotalDarts", p.getTotalDarts()); editor.putInt(p.getName() + "p4HighOut", p.getHighout()); } 中的密钥现在基于存储在每个editor对象中的名称,您可以轻松地为Player创建一个构造函数,该构造函数根据{{ 1}}和Player会根据名称加载密钥:

SharedPreferences

这是您可能会根据发现的相同名称使用它从以前创建相同的playerName对象的方法:

public Player(SharedPreferences sharedPref, String playerName)
{
    this.name = playerName;
    this.totalScore = sharedPref.getInt(playerName + "TotalScore", -1); // -1 is default to set if preference does not exist
    this.totalDarts = sharedPref.getInt(playerName + "TotalDarts", -1);
    this.highOut = sharedPref.getInt(playerName + "HighOut", -1);
}

Player现在将具有与该特定名称相同的设置(如果以前使用过的话)。尽管这里只是专门检查Player p1 = new Player(); //Or however you start the declaration if (p1Name.equals(p3.getName())) { p1 = new Player(sharedPref, p1Name); } 是什么。

注意:如果很适合您的要求,修改构造函数代码以将其转换为返回Player p1的方法非常简单。