首页 > 编程 > Java > 正文

Java编写的24点纸牌游戏

2019-11-26 15:14:12
字体:
来源:转载
供稿:网友

任意4个1-13数字,加减乘除计算24点。

实现原理:

1)排列组合4个数字
2)计算每次排列组合的可能性

Cal24.java

import java.util.HashSet;import java.util.Set;  public class Cal24 {   private static final double precision = 0.00001;  private static final int target = 24;      public String[] execute(String[] inputs) {    int[] digits = new int[4];    for (int i = 0; i < inputs.length; i++) {      digits[i] = Integer.valueOf(inputs[i]);    }    return new String[]{calc(digits)};  }         private String calc(final int data[]){    final Set<String> out = new HashSet<String>();    Combination digit = new Combination() {             @Override      protected void handle(int[] result) {        final int[] r = result;         Combination oper = new Combination(){          @Override          protected void handle(int[] c) {            double x = r[0];            for (int i = 0; i < r.length - 1; i++) {              x = doCalculate(x, r[i + 1], c[i]);            }            if(Math.abs(Math.abs(x) - target) < precision || Math.abs(Math.abs(1/x) - target) < precision){              StringBuilder sb = new StringBuilder();              for (int j = 0; j < r.length; j++) {                sb.append(r[j]);                if(j != r.length - 1){                  sb.append(getOperation(c[j]));                }              }              out.add(sb.toString());            }                       }        };        oper.combine(new int[]{0, 1, 2, 3}, data.length - 1, true);               }    };         digit.combine(data);         StringBuilder sb = new StringBuilder();    for (String string : out) {      sb.append(string);      sb.append("/n");    }    return sb.toString();  }              private double doCalculate(double x, double y, int operation){    switch (operation) {    case 0:      return x + y;    case 1:      return x - y;    case 2:      return x * y;    case 3:      return x / y;    default:      return 0;    }  }     private static String getOperation(int operation){    switch (operation) {    case 0:      return "+";    case 1:      return "-";    case 2:      return "*";    case 3:      return "/";    default:      return "";    }  }    public static void main(String[] args) {    System.out.println(new Cal24().calc(new int[]{1, 5, 5, 5}));  }}

Combination.java

public abstract class Combination {  private boolean repeat;  private int total = 0;     public void combine(int data[]){    combine(data, data.length, false);  }     public void combine(int data[], int count){    combine(data, count, false);  }     public void combine(int data[], int count, boolean repeat){    this.repeat = repeat;    int times = data.length;    int size = (int)Math.pow(times, count);    for (int i = 0; i < size; i++) {      int[] result = toArray(data, i, count);      if(result != null){        handle(result);        total ++;      }    }  }        private int[] toArray(int data[], int i, int count){    int [] indices = new int[count];    int times = data.length;    for (int j = 0; j < count; j++) {      int temp = 0;      if(i > 0){        temp = i%times;        i = (i - temp)/times;      }      indices[j] = temp;    }              if(!repeat){      //remove repetition      for (int x = 0; x < count; x++) {        for(int y = 0; y < count; y++){          if(x != y){            if(indices[x] == indices[y])              return null;          }        }      }    }         int [] result = new int[count];    for (int x = 0; x < count; x++) {      int selected = data[indices[x]];      result[x] = selected;    }         return result;  }     public int getTotal() {    return total;  }  protected abstract void handle(int[] result);}

以上所述就是本文的全部内容了,希望大家能够喜欢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表