Android猜图游戏:如何让已答对图片重启/返回主页后不再显示?
问题描述
我正在Android Studio中开发一款移动端猜图游戏,目前遇到的问题是:如何实现已答对的图片在返回主页或退出应用后,再次打开时不再显示。以下是游戏Play Activity的相关代码:
初始化英雄列表与图片映射
heroList.add("abaddon"); heroList.add("alchemist"); heroList.add("axe"); heroList.add("beastmaster"); heroList.add("brewmaster"); map.put(heroList.get(0), R.drawable.ic_s_abaddon); map.put(heroList.get(1), R.drawable.ic_s_alchemist); map.put(heroList.get(2), R.drawable.ic_s_axe); map.put(heroList.get(3), R.drawable.ic_s_beastmaster); map.put(heroList.get(4), R.drawable.ic_s_brewmaster); Collections.shuffle(heroList); generateImage();
生成图片的方法
private void generateImage(int index) { ArrayList<String> heroListTemp = (ArrayList<String>) heroList.clone(); String cAns = heroList.get(index); heroListTemp.remove(cAns); Collections.shuffle(heroListTemp); ArrayList<String> newList = new ArrayList<>(); newList.add(heroListTemp.get(0)); newList.add(heroListTemp.get(1)); newList.add(heroListTemp.get(2)); newList.add(cAns); Collections.shuffle(newList); heroImage.setImageResource(map.get(heroList.get(index))); }
答案校验按钮代码
public void checkAnswer(View view){ String answer = heroAns.getText().toString().toLowerCase().replaceAll("\\s",""); String cAnswer = heroList.get(index); if(answer.equals(cAnswer)){ index++; if(index > heroList.size() - 1){ Toast.makeText(PlayEasy.this,"You Guessed it all!!!!", Toast.LENGTH_SHORT).show(); finish(); } else{ Toast.makeText(PlayEasy.this,"Nice!", Toast.LENGTH_SHORT).show(); heroAns.setText(""); generateImage(); } } else{ Toast.makeText(PlayEasy.this,"Nope -_-", Toast.LENGTH_SHORT).show(); } }
解决方案
核心思路是用SharedPreferences持久化存储已答对的英雄名称,每次启动Play Activity时,先读取存储的已完成列表,过滤掉这些英雄后再初始化游戏列表。
1. 添加SharedPreferences工具方法
在PlayEasy类中新增读取和存储已完成英雄的方法:
// 保存已答对的英雄到本地 private void saveCompletedHero(String heroName) { SharedPreferences sp = getSharedPreferences("GameData", MODE_PRIVATE); Set<String> completedHeroes = sp.getStringSet("completedHeroes", new HashSet<>()); completedHeroes.add(heroName); sp.edit().putStringSet("completedHeroes", completedHeroes).apply(); } // 获取本地存储的已答对英雄集合 private Set<String> getCompletedHeroes() { SharedPreferences sp = getSharedPreferences("GameData", MODE_PRIVATE); return sp.getStringSet("completedHeroes", new HashSet<>()); }
2. 初始化时过滤已完成的英雄
修改初始化代码,先过滤掉已经答对的英雄,只保留未完成的:
// 先定义全量英雄列表 ArrayList<String> allHeroes = new ArrayList<>(); allHeroes.add("abaddon"); allHeroes.add("alchemist"); allHeroes.add("axe"); allHeroes.add("beastmaster"); allHeroes.add("brewmaster"); // 获取已答对的英雄集合 Set<String> completedHeroes = getCompletedHeroes(); // 过滤出未答对的英雄,作为当前游戏的可用列表 heroList = new ArrayList<>(); for (String hero : allHeroes) { if (!completedHeroes.contains(hero)) { heroList.add(hero); } } // 初始化图片映射(避免重复初始化,判断map为空时再执行) if (map.isEmpty()) { map.put("abaddon", R.drawable.ic_s_abaddon); map.put("alchemist", R.drawable.ic_s_alchemist); map.put("axe", R.drawable.ic_s_axe); map.put("beastmaster", R.drawable.ic_s_beastmaster); map.put("brewmaster", R.drawable.ic_s_brewmaster); } // 如果所有英雄都已答对,直接提示并结束页面 if (heroList.isEmpty()) { Toast.makeText(this, "所有英雄都已猜对!", Toast.LENGTH_SHORT).show(); finish(); return; } Collections.shuffle(heroList); generateImage(0); // 传入初始索引0
3. 答对后保存该英雄到本地
修改checkAnswer方法,在答对时调用保存方法:
public void checkAnswer(View view){ String answer = heroAns.getText().toString().toLowerCase().replaceAll("\\s",""); String cAnswer = heroList.get(index); if(answer.equals(cAnswer)){ // 保存当前答对的英雄 saveCompletedHero(cAnswer); index++; if(index > heroList.size() - 1){ Toast.makeText(PlayEasy.this,"所有英雄都猜对了!", Toast.LENGTH_SHORT).show(); finish(); } else{ Toast.makeText(PlayEasy.this,"答对了!", Toast.LENGTH_SHORT).show(); heroAns.setText(""); generateImage(index); } } else{ Toast.makeText(PlayEasy.this,"答错了哦 -_-", Toast.LENGTH_SHORT).show(); } }
4. 补充:重置已完成记录(可选)
如果需要添加重置功能,可新增如下方法:
// 重置所有已答对的记录 private void resetCompletedHeroes() { SharedPreferences sp = getSharedPreferences("GameData", MODE_PRIVATE); sp.edit().remove("completedHeroes").apply(); }
内容的提问来源于stack exchange,提问作者needsHelp
相关产品推荐
相关产品推荐

