安卓猜图游戏随机无重复加载及答案比对实现方案咨询
安卓猜图游戏答案校验方案建议
两种方案的优劣对比
不推荐使用图片路径匹配
- 安卓打包后drawable资源对应的是编译生成的
R.drawable.xxx整型id,无法直接获取稳定的原始图片路径,通过反射拿资源名的方式性能差,且只要你后续修改了图片的文件名,整个匹配逻辑会完全失效,维护成本极高。
优先选择答案映射方案,不推荐单独用答案数组
单独的答案数组和图片资源数组分开存储很容易出现下标错位问题,后续增删图片时如果漏改答案数组的对应位置,会出现答案和图片不匹配的bug,更稳妥的实现方式是先创建实体类将图片资源和答案绑定:
// 自定义实体类绑定图片资源与对应答案 public class GuessRoleItem { private int imgResId; private String roleName; public GuessRoleItem(int imgResId, String roleName) { this.imgResId = imgResId; this.roleName = roleName; } // 按需添加getter方法 public int getImgResId() { return imgResId; } public String getRoleName() { return roleName; } }
你原来的随机加载逻辑可以调整为操作GuessRoleItem类型的列表:
// 初始化所有题目数据 ArrayList<GuessRoleItem> questionList = new ArrayList<>(); questionList.add(new GuessRoleItem(R.drawable.role1, "角色1名称")); questionList.add(new GuessRoleItem(R.drawable.role2, "角色2名称")); // 剩余148个同理添加 // 随机抽取题目逻辑 Random random = new Random(); int randomPos = random.nextInt(questionList.size()); GuessRoleItem currentQuestion = questionList.get(randomPos); // 设置图片 imageViewObject.setImageResource(currentQuestion.getImgResId()); // 抽取后移除该题避免重复 questionList.remove(randomPos);
校验用户输入的逻辑也很简单,建议统一输入格式后再比对,避免大小写、前后空格导致的误判:
String userInput = editText.getText().toString().trim().toLowerCase(); String correctAnswer = currentQuestion.getRoleName().trim().toLowerCase(); if (userInput.equals(correctAnswer)) { // 校验通过,触发下一题逻辑 }
该方案的优势
- 图片资源和答案强绑定,不会出现下标错位的问题,后续增删改题目只需要调整初始化的
questionList即可,维护成本极低 - 逻辑稳定不受资源文件名、编译后资源id变更的影响
- 扩展性强,后续需要加题目提示、角色介绍等功能,直接在
GuessRoleItem类中新增对应字段即可
内容的提问来源于stack exchange,提问作者Topaholic
相关产品推荐
相关产品推荐

