You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 01:40:29