24点游戏是经典的纸牌益智游戏
游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
思路:
先产生随机数,穷举出所有的可能的表达式组合。然后将随机数进行四个一组排列组合,最后将这四个数与加减乘除相匹配输出结果。
表达式的生成:
package chapter1;
import java.util.Arrays;
import java.util.Random;
public class Point {
static int num=0;
public static void main(String[] args) {
Random r = new Random();
int [] c = new int[4];
for (int i = 0; i < c.length; i++) {
c[i] = 1 + r.nextInt(13);
System.out.println("产生的四位随机数为:"+c[i]);
}
Anagram.permute(c, 0);
int[] re = Anagram.getResult();
int [] num = new int [4];
int idx = 0;
for (int i = 0; i < re.length; i++) {
num[idx++] = re[i];
if((i+1)%4==0){
idx = 0;
opertor(num);
}
}
}
public static void opertor(int[]cards){
double sum=0;
for(int i=0;i<4;i++){
double sum1=code(cards[0],cards[1],i);
for(int j=0;j<4;j++){
double sum2=code(sum1,cards[2],j);
for(int k=0;k<4;k++){
sum=code(sum2,cards[3],k);
int[] symbolNum={i,j,k};
String[] symbol=new String[4];
symbol=symbol(symbolNum);
if(sum==24){
num++;
System.out.println("["+"("+cards[0]+" "+symbol[0]+" "+cards[1]+")"+" "+symbol[1]+" "+cards[2]+"]"+" "+symbol[2]+" "+cards[3]);
}
}
}
}
}
public static double code(double num1,double num2,int num){
double sum=0.0;
if(num==0){
sum=num1+num2;
}
else if(num==1){
sum=num1-num2; }
else if(num==2){
sum=num1*num2;
}
else{
sum=num1/num2;
}
return sum;
}
/* * 将代表计算符号的数字转换成字符存入Sring数组并返回 */
public static String[] symbol(int[] symbolNum){
String[] symbol=new String[4];
for(int i=0;i<3;i++){
int sym=symbolNum[i];
switch (sym) {
case 0: symbol[i]="+"; break;
case 1: symbol[i]="-"; break;
case 2: symbol[i]="*"; break;
case 3: symbol[i]="/"; break;
default: break;
}
}
return symbol; }
}
四个随机数的生成:
package chapter1;
import java.util.Arrays;
public class Anagram {
static int [] result = new int [96];
static int index = 0;
public static int[] getResult() {
return result;
}
//s表示,从array[start]后的数据进行全排列
public static void permute(int[] array,int start){
if(start==array.length){
// 输出
for (int i : array) {
result[index++] = i;
}
} else
for(int i=start;i<array.length;++i){
swap(array,start,i); // 交换元素
permute(array,start+1); //交换后,再进行全排列算法
swap(array,start,i); //还原成原来的数组,便于下一次的全排列
}
}
private static void swap(int[] array,int s,int i){
int t=array[s];
array[s]=array[i];
array[i]=t;
}
public static void main(String[] args) {
int[] array=new int[]{3,4,5,6};
permute(array, 0);
int[] re = Anagram.getResult();
int [] num = new int [4];
int idx = 0;
for (int i = 0; i < re.length; i++) {
num[idx++] = re[i];
System.out.print(re[i]+" ");
if((i+1)%4==0){
idx = 0;
System.out.println(Arrays.toString(num));
}
}
}
// TODO Auto-generated method stub
}
算法设计思路
运行结果图