Java扑克牌速算24的方法

网友投稿 369 2022-12-12


Java扑克牌速算24的方法

已知一副扑克牌有54张,去除大王和小王,剩余52张。在其中随机抽取4张牌,利用加减乘除进行计算得到24. 从A到10,他们的值分别为1到10. 从J到K,他们对应的值是减去10以后的值。编写程序生成一副扑克牌,随机抽取4张,进行计算是否能得到24. 如果可以,列出可能的计算表达式,可能有多种计算形式。

主要思想就是先生成除去大小王的52张扑克牌,然后从中随机抽取四张。接着用排列组合的方式找到能计算得到24的表达式。

package Poker;

import java.util.Random;

import java.util.Stack;

public class Poker {

static int count = 0;

static int count_2 = 0;

public static Stack stack = new Stack();

public static Stack stack_temp = new Stack();

public static Stack stack_collection = new Stack();

public static void main(String[] args) {

System.out.println("Poker World");

// 生成扑克牌

int poker[][] = new int[4][13];

for(int i = 0; i < 4; i++) {

for(int j = 0; j < 13; j++) {

if(j + 1 < 11) {

poker[i][j] = j+1;

}

else {

poker[i][j] = j-9;

}

}

}

Random r = new Random();

int randomPoker[] = new int[4];

for(int i = 0; i < 4; i++) {

randomPoker[i] = poker[r.nextInt(3)][r.nextInt(12)];

stack_temp.add(randomPoker[i]);

}

System.out.print("抽到的扑克牌:");

for(int element: randomPoker) {

System.outgCDmmaXmE.printf("%d ", element);

}

System.out.print("\n");

order(randomPoker, 4, 0);

//System.out.printf("%d\n",count_2);

if(count != 0) {

System.out.printf("共有%d种计算方法", count);

}

else {

System.out.print("无法计算得到24");

}

}

private static void order(int[] poker, int targ, int cur) {

// TODO Auto-generated method stub

if(cur == targ) {

String str = stack.toString();

if(!stack_collection.contains(str)) {

stack_collection.add(str);

count_2 += 1;

int new_poker[] = new int[4];

for(int i = 0; i < 4; i++) {

new_poker[i] = stack.pop();

}

for(int i = 3; i >= 0; i--) {

stack.push(new_poker[i]);

}

do24(new_poker);

}

return;

}

for(int i = 0; i < poker.length; i++) {

if(stack_temp.contains(poker[i])) {

stack.add(poker[i]);

for(int j = 0; j < stack_temp.size(); j++) {

if(stack_temp.get(j) == poker[i]) {

stack_temp.remove(j);

break;

}

}

order(poker, targ, cur+1);

stack.pop();

stack_temp.add(poker[i]);

}

}

}

public static void do24(int[] poker){

// 四个数字中间有三个运算符,因此用三重循环遍历。其中0表示+,1表示-,2表示x,3表示

int test[] = {1,2,3,4};

for(int i=0;i<4;i++){

for(int j=0;j<4;j++){

for(int k=0;k<4;k++){

operate(poker,i,j,k);

//operate(test,i,j,k);

}

}

}

}

/*

* 分类讨论

*/

public static void operate(int[] poker, int op1, int op2, int op3) {

int num1 = poker[0];

int num2 = poker[1];

int num3 = poker[2];

int num4 = poker[3];

if((cal(cal(cal(num1,num2,op1),num3,op2),num4,op3) == 24)) {

if((((op2 == 0) || (op2 == 1))&&((op3 == 0) || (op3 == 1)))||((op2 != 0) && (op2 != 1))) {

System.out.println("("+num1+symbol(op1)+num2+")"+symbol(op2)+num3+symbol(op3)+num4);

count++;

}

}

else if(cal(cal(num1,cal(num2,num3,op2),op1),num4,op3) == 24) {

if((((op1 == 0) || (op1 == 1))&&((op3 == 0) || (op3 == 1)))||((op1 != 0) && (op1 != 1))) {

System.out.println(num1+symbol(op1)+"("+num2+symbol(op2)+num3+")"+symbol(op3)+num4);

count++;

}

else {

System.out.println("["+num1+symbol(op1)+"("+num2+symbol(op2)+num3+")]"+symbol(op3)+num4);

count++;

}

}

else if(cal(cal(num1,num2,op1),cal(num3,num4,op3),op2) == 24) {

if((((op1 == 0) || (op1 == 1))&&((op2 == 0) || (op2 == 1)))||((op1 != 0) && (op1 != 1))) {

System.out.println(num1+symbol(op1)+num2+symbol(op2)+"("+num3+symbol(op3)+num4+")");

count++;

}

else {

System.out.println("("+num1+symbol(op1)+num2+")"+symbol(op2)+"("+num3+symbol(op3)+num4+")");

count++;

}

}

else if(cal(cal(cal(num1,num2,op1),num3,op2),num4,op3) == 24) {

if((((op1 == 0) || (op1 == 1))&&((op2 == 0) || (op2 == 1)))||((op1 != 0) && (op1 != 1))) {

System.out.println("("+num1+symbol(op1)+num2+symbol(op2)+num3+")"+symbol(op3)+num4);

count++;

}

else {

System.out.println("[("+num1+symbol(op1)+num2+")"+symbol(op2)+num3+"]"+symbol(op3)+num4);

http://count++;

}

}

else if(cal(num1,cal(cal(num2,num3,op2),num4,op3),op1) == 24) {

if((((op2 == 0) || (op2 == 1))&&((op3 == 0) || (op3 == 1)))||((op2 != 0) && (op2 != 1))) {

System.out.println(num1+symbol(op1)+"("+num2+symbol(op2)+num3+symbol(op3)+num4+")");

count++;

}

else {

System.out.println(num1+symbol(op1)+"[("+num2+symbol(op2)+num3+")"+symbol(op3)+num4+"]");

count++;

}

}

else if(cal(num1,cal(num2,cal(num3,num4,op3),op2),op1) == 24) {

System.out.println(num1+symbol(op1)+"["+num2+symbol(op2)+"("+num3+symbol(op3)+num4+")]");

count++;

}

}

/*

* 按顺序计算

*/

public static double cal(double num1,double num2,int num){

double sum=0.0;

switch(num) {

case 0:

sum = num1 + num2;

break;

case 1:

sum = num1 - num2;

break;

case 2:

sum = num1 * num2;

break;

case 3:

if(num1 % num2 == 0) {

sum = num1 / num2;

}

else {

sum = 999;

}

break;

default:

break;

}

return sum;

}

/*

* 将代表计算符号的数字转换成字符存入String数组并返回

*/

public static String symbol(int symbolNum){

String symbol = "";

switch (symbolNum) {

case 0:

symbol="+";

break;

case 1:

symbol="-";

break;

case 2:

symbol="x";

break;

case 3:

symbol="";

break;

default:

break;

}

return symbol;

}

}


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

上一篇:Spring Boot Admin Server管理客户端过程详解
下一篇:Spring Boot Rest控制器单元测试过程解析
相关文章

 发表评论

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