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

双N-Back游戏开发:按钮随机变色及状态保存技术问询

双N-Back游戏按钮视觉状态实现方案

1. 定义状态存储与颜色常量

首先需要新增存储历史视觉状态的集合,以及统一管理按钮颜色:

// 保存每一步激活的按钮索引,用于N步回溯对比
List<Integer> visualHistory = new ArrayList<>();
// 定义固定颜色常量,避免重复编写Color值
private static final int DEFAULT_BLUE = Color.BLUE;
private static final int DARK_BLUE = Color.parseColor("#00008B");
private Handler gameHandler = new Handler();
private int currentStep = 0;
private static final int STEP_INTERVAL = 3000; // 每轮间隔3秒,与音频同步

2. 重构按钮随机切换与状态保存逻辑

修改run()方法,实现循环触发的按钮状态切换,同时修正原音频代码的重复初始化问题:

@Override
public void run() {
    // 重置所有按钮为默认蓝色
    for (Button btn : listaBotoes) {
        btn.setBackgroundColor(DEFAULT_BLUE);
    }

    // 随机选中一个按钮切换为深蓝色
    int randomBtnIndex = aleatorio.nextInt(listaBotoes.size());
    listaBotoes.get(randomBtnIndex).setBackgroundColor(DARK_BLUE);

    // 将当前激活的按钮索引存入历史记录
    visualHistory.add(randomBtnIndex);

    // 播放随机字母音频(复用已初始化的TextToSpeech实例)
    if (letrasFaladas != null) {
        String randomLetter = letras[aleatorio.nextInt(letras.length)];
        letrasFaladas.speak(randomLetter, TextToSpeech.QUEUE_FLUSH, null);
    }

    // 触发下一轮状态切换
    currentStep++;
    gameHandler.postDelayed(this, STEP_INTERVAL);
}

3. 优化TextToSpeech初始化流程

原代码中重复创建TextToSpeech实例的逻辑错误,改为在onCreate中仅初始化一次:

@Override
protected void onCreate(Bundle b) {
    super.onCreate(b);
    setContentView(R.layout.activity_dual);
    // ... 原有按钮初始化、添加到listaBotoes的代码 ...

    // 统一设置初始按钮颜色
    for (Button btn : listaBotoes) {
        btn.setBackgroundColor(DEFAULT_BLUE);
    }

    // 初始化TextToSpeech,完成后启动游戏循环
    letrasFaladas = new TextToSpeech(Dual.this, status -> {
        if (status == TextToSpeech.SUCCESS) {
            letrasFaladas.setLanguage(new Locale("pt", "BR"));
            gameHandler.postDelayed(Dual.this, STEP_INTERVAL);
        }
    });
}

4. N-Back对比逻辑实现

添加用于检查当前状态与N步前状态是否匹配的方法,供用户交互时调用:

// 检查当前步骤与n步前的视觉状态是否一致
private boolean isVisualNBackMatch(int n) {
    if (currentStep < n) return false; // 步数不足,无法对比
    int currentIndex = visualHistory.get(currentStep - 1);
    int nBackIndex = visualHistory.get(currentStep - 1 - n);
    return currentIndex == nBackIndex;
}

// 示例:用户点击"匹配"按钮时的统计逻辑
public void onMatchButtonClick(View view) {
    boolean isCorrect = isVisualNBackMatch(nivel);
    if (isCorrect) {
        clicksVisaoCorretos++;
    } else {
        clicksVisaoIncorretos++;
    }
    // 可在此更新UI展示统计数据
}

5. 资源释放(避免内存泄漏)

在Activity销毁时清理Handler回调与TextToSpeech资源:

@Override
protected void onDestroy() {
    super.onDestroy();
    if (letrasFaladas != null) {
        letrasFaladas.stop();
        letrasFaladas.shutdown();
    }
    gameHandler.removeCallbacks(this);
}

内容的提问来源于stack exchange,提问作者andrellima

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 01:12:04