Java编写的24点纸牌游戏

网友投稿 197 2023-08-03


Java编写的24点纸牌游戏

任意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 out = new HashSet();

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);

}

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:十个最常见的Java字符串问题(翻译)
下一篇:java实现菜单滑动效果
相关文章

 发表评论

暂时没有评论,来抢沙发吧~