双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
相关产品推荐
相关产品推荐

