10.2.2 游戏算法封装
从猜数字游戏的处理流程来看,主要涉及的算法包括:验证不重复的4位数字、生成不重复的4位随机数和计算猜测结果(xAyB)。笔者将这些算法的实现统一封装到工具类GameUtil中,该类的完整代码如下:
- package org.liufeng.course.util;
- import java.text.DateFormat;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.Random;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- /**
- * 猜数字游戏的工具类
- *
- * @author liufeng
- * @date 2013-11-21
- */
- public class GameUtil {
- /**
- * 验证是不是4位纯数字
- *
- * @param number
- * @return
- */
- public static boolean verifyNumber(String number) {
- boolean result = false;
- // 正则表达式规则:0~9内的数字连续出现4次
- Pattern pattern = Pattern.compile("[0-9]{4}");
- Matcher matcher = pattern.matcher(number);
- // 匹配成功就表明是纯数字
- if (matcher.matches())
- result = true;
- return result;
- }
- /**
- * 验证是否有重复字符
- *
- * @param number
- * @return
- */
- public static boolean verifyRepeat(String number) {
- boolean result = false;
- // 从第2位数开始,每位都与其前面的所有数比较一遍
- for (int i = 1; i < number.length(); i++) {
- for (int j = 0; j < i; j++) {
- if (number.charAt(i) == number.charAt(j)) {
- result = true;
- break;
- }
- }
- }
- return result;
- }
- /**
- * 生成不重复的4位随机数
- *
- * @return String
- */
- public static String generateRandNumber() {
- StringBuffer randBuffer = new StringBuffer();
- String scopeStr = "0123456789";
- Random random = new Random();
- for (int i = 0; i < 4; i++) {
- int num = random.nextInt(scopeStr.length());
- randBuffer.append(scopeStr.charAt(num));
- // 将每次获取到的随机数从scopeStr中移除
- scopeStr = scopeStr.replace(String.valueOf(scopeStr.charAt(num)), "");
- }
- return randBuffer.toString();
- }
- /**
- * 计算猜测结果
- *
- * @param answer 正确答案
- * @param number 猜测的数字
- * @return xAyB
- */
- public static String guessResult(String answer, String number) {
- // 位置与数字均相同
- int rightA = 0;
- // 数字存在但位置不对
- int rightB = 0;
- // 计算"A"的个数
- for (int i = 0; i < 4; i++) {
- // 位置与数字均相同
- if (number.charAt(i) == answer.charAt(i)) {
- rightA++;
- }
- }
- // 计算"B"的个数
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 4; j++) {
- // 位置不相同
- if (i != j) {
- if (number.charAt(i) == answer.charAt(j)) {
- rightB++;
- }
- }
- }
- }
- return String.format("%sA%sB", rightA, rightB);
- }
- /**
- * 获取标准格式的时间
- *
- * @return yyyy-MM-dd hh:mm:ss
- */
- public static String getStdDateTime() {
- DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- return df.format(new Date());
- }
- }
verifyNumber()方法用于验证是不是4位纯数字,verifyRepeat()用于验证字符串中是否有重复字符,将这两个方法结合起来,就能够验证某字符串是否由不重复的4位数字组成,用法示例如下:
- String number = "5269";
- // 验证是否由不重复的4位数字组成
- boolean result = verifyNumber(number) && !verifyRepeat(number);
- // 输出结果:true
- System.out.println(result);
GameUtil类中的guessResult()是猜数字游戏最核心的算法,用于计算猜测结果。算法的实现并不复杂,读者结合代码中的注释很容易理解。