给出四个数字,要求,在其间添加运算符和括号,使得计算结果等于24。

括号的放置即为决定哪几个数先进行计算。所以,我们先确定首先进行计算的两个相邻的数,计算完成后,就相当于剩下三个数字,仍需要在它们之间添加符号;然后再决定在这三个数中哪两个相邻的数先计算。由此,我们就成功解决了数字的运算次序问题,此时不需要再考虑不同运算符号的优先级问题,因为括号的优先级高于加减乘除。

通过循环,我们可以得到第一第二第三次计算的运算符,再通过计算,就可以得出和,若和等于24,即为所求解。

在输出格式中,由于括号的放置共六种情况,故根据计算先后顺序的不同,输出时在不同地方放置括号;

以下是java源码:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.JOptionPane; public class TwentyFourPoke_Game extends JFrame
{
private JButton jbsolution = new JButton("Find a Solution");
private JButton jbrefresh = new JButton("Refresh");
private JButton jbverify = new JButton("Verify"); private JLabel jlmessage = new JLabel("Enter an expression:"); private JTextField jtsolution = new JTextField();
private JTextField jtexpression = new JTextField(); private ImagePanel pp = new ImagePanel(); private int[] card = new int[4];
private double[] bcard = new double[4]; private double sum;
private double[] temp1 = new double[3];
private double[] temp2 = new double[2];
private char[] sign = {'+','-','*','/'}; public TwentyFourPoke_Game()
{
JPanel p1 = new JPanel(new GridLayout(1,3));
p1.add(jbsolution);
p1.add(jtsolution);
p1.add(jbrefresh);
JPanel p3 = new JPanel(new GridLayout(1,3));
p3.add(jlmessage);
p3.add(jtexpression);
p3.add(jbverify); add(p1,BorderLayout.NORTH);
add(pp,BorderLayout.CENTER);
add(p3,BorderLayout.SOUTH); ButtonListener listener = new ButtonListener();
jbsolution.addActionListener(listener);
jbrefresh.addActionListener(listener);
jbverify.addActionListener(listener);
} class ButtonListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == jbsolution)
{
for(int i = 0;i < 4;i++)
{
bcard[i] = (double)card[i] % 13;
if(card[i] % 13 == 0)
bcard[i] = 13;
}
search();
}
else if(e.getSource() == jbrefresh)
{
pp.sshow(); }
else if(e.getSource() == jbverify)
{
String expression = jtexpression.getText();
int result = evaluateExpression(expression);
if(result == 24)
{
JOptionPane.showMessageDialog(null,"恭喜你!你答对了!","消息框",JOptionPane.INFORMATION_MESSAGE);
}
else
{
JOptionPane.showMessageDialog(null,"抱歉!请再次尝试。","消息框",JOptionPane.INFORMATION_MESSAGE);
}
}
}
} public static double calcute(double a,double b,char c)
{
if(c == '+')
return a+b;
else if(c == '-')
return a-b;
else if(c == '*')
return a*b;
else if(c == '/' && b != 0)
return a/b;
else
return -1;
} public void search()
{
boolean judge = false;
for(int i=0;i<4;i++)
//第一次放置的符号
{
for(int j=0;j<4;j++)
//第二次放置的符号
{
for(int k=0;k<4;k++)
//第三次放置的符号
{
for(int m=0;m<3;m++)
//首先计算的两个相邻数字,共有3种情况,相当于括号的作用
{
if(bcard[m+1]==0 && sign[i]=='/') break;
temp1[m]=calcute(bcard[m],bcard[m+1],sign[i]);
temp1[(m+1)%3]=bcard[(m+2)%4];
temp1[(m+2)%3]=bcard[(m+3)%4];
//先确定首先计算的两个数字,计算完成相当于剩下三个数,按顺序储存在temp数组中
for(int n=0;n<2;n++)
//三个数字选出先计算的两个相邻数字,两种情况,相当于第二个括号
{
if(temp1[n+1]==0 && sign[j]=='/') break;
temp2[n]=calcute(temp1[n],temp1[n+1],sign[j]);
temp2[(n+1)%2]=temp1[(n+2)%3];
//先确定首先计算的两个数字,计算完成相当于剩下两个数,按顺序储存在temp数组中
if(temp2[1]==0 && sign[k]=='/') break;
sum=calcute(temp2[0],temp2[1],sign[k]);
//计算和
if(sum==24)
//若和为24
{
judge=true;
//判断符为1,表示已求得解
if(m==0 && n==0)
{
String sss ="(("+(int)bcard[0]+sign[i]+(int)bcard[1]+")"+sign[j]+(int)bcard[2]+")"+sign[k]+(int)bcard[3]+"="+(int)sum;
jtsolution.setText(sss);
return ;
}
else if(m==0 && n==1)
{
String sss ="("+(int)bcard[0]+sign[i]+(int)bcard[1]+")"+sign[k]+"("+(int)bcard[2]+sign[j]+(int)bcard[3]+")="+(int)sum;
jtsolution.setText(sss);
return ;
}
else if(m==1 && n==0)
{
String sss ="("+(int)bcard[0]+sign[j]+"("+(int)bcard[1]+sign[i]+(int)bcard[2]+"))"+sign[k]+(int)bcard[3]+"="+(int)sum;
jtsolution.setText(sss);
return ;
}
else if(m==2 && n==0)
{
String sss ="("+(int)bcard[0]+sign[j]+(int)bcard[1]+")"+sign[k]+"("+(int)bcard[2]+sign[i]+(int)bcard[3]+")="+(int)sum;
jtsolution.setText(sss);
return ;
}
else if(m==2 && n==0)
{
String sss =(int)bcard[0]+sign[k]+"("+(int)bcard[1]+sign[j]+"("+(int)bcard[2]+sign[i]+(int)bcard[3]+"))="+(int)sum;
jtsolution.setText(sss);
return ;
}
//m=0,1,2 n=0,1表示六种括号放置可能,并按照这六种可能输出相应的格式的计算式 }
}
}
}
}
}
if(judge==false)
jtsolution.setText("No solution!");
//如果没有找到结果,符号位为0
} public static int evaluateExpression(String expression)
{
// Create operandStack to store operands
java.util.Stack<Integer> operandStack = new java.util.Stack<Integer>(); // Create operatorStack to store operators
java.util.Stack<Character> operatorStack = new java.util.Stack<Character>(); // Extract operands and operators
java.util.StringTokenizer tokens = new java.util.StringTokenizer(expression, "()+-/*", true); // Phase 1: Scan tokens
while (tokens.hasMoreTokens())
{
String token = tokens.nextToken().trim(); // Extract a token
if (token.length() == 0) // Blank space
continue; // Back to the while loop to extract the next token
else if (token.charAt(0) == '+' || token.charAt(0) == '-')
{
// Process all +, -, *, / in the top of the operator stack
while (!operatorStack.isEmpty() &&(operatorStack.peek().equals('+') ||operatorStack.peek().equals('-') || operatorStack.peek().equals('*') ||
operatorStack.peek().equals('/')))
{
processAnOperator(operandStack, operatorStack);
}
// Push the + or - operator into the operator stack
operatorStack.push(new Character(token.charAt(0)));
}
else if (token.charAt(0) == '*' || token.charAt(0) == '/')
{
// Process all *, / in the top of the operator stack
while (!operatorStack.isEmpty() && (operatorStack.peek().equals('*') || operatorStack.peek().equals('/')))
{
processAnOperator(operandStack, operatorStack);
} // Push the * or / operator into the operator stack
operatorStack.push(new Character(token.charAt(0)));
}
else if (token.trim().charAt(0) == '(')
{
operatorStack.push(new Character('(')); // Push '(' to stack
}
else if (token.trim().charAt(0) == ')')
{
// Process all the operators in the stack until seeing '('
while (!operatorStack.peek().equals('('))
{
processAnOperator(operandStack, operatorStack);
}
operatorStack.pop(); // Pop the '(' symbol from the stack
}
else
{
// An operand scanned
// Push an operand to the stack
operandStack.push(new Integer(token));
}
} // Phase 2: process all the remaining operators in the stack
while (!operatorStack.isEmpty())
{
processAnOperator(operandStack, operatorStack);
} // Return the result
return ((Integer)(operandStack.pop())).intValue();
} public static void processAnOperator(java.util.Stack<Integer> operandStack,java.util.Stack<Character> operatorStack)
{
if (operatorStack.peek().equals('+'))
{
operatorStack.pop();
int op1 = ((Integer)(operandStack.pop())).intValue();
int op2 = ((Integer)(operandStack.pop())).intValue();
operandStack.push(new Integer(op2 + op1));
}
else if (operatorStack.peek().equals('-'))
{
operatorStack.pop();
int op1 = ((Integer)(operandStack.pop())).intValue();
int op2 = ((Integer)(operandStack.pop())).intValue();
operandStack.push(new Integer(op2 - op1));
}
else if (operatorStack.peek().equals('*'))
{
operatorStack.pop();
int op1 = ((Integer)(operandStack.pop())).intValue();
int op2 = ((Integer)(operandStack.pop())).intValue();
operandStack.push(new Integer(op2 * op1));
}
else if (operatorStack.peek().equals('/'))
{
operatorStack.pop();
int op1 = ((Integer)(operandStack.pop())).intValue();
int op2 = ((Integer)(operandStack.pop())).intValue();
operandStack.push(new Integer(op2 / op1));
}
} class ImagePanel extends JPanel
{
public void sshow()
{
int i;
for(i = 0;i < 4;i++)
{
card[i] = (int)(1 + Math.random() * 52);
}
repaint();
} protected void paintComponent(Graphics g)
{
super.paintComponent(g);
int i;
int w = getWidth() / 4;
int h = getHeight();
int x = 0;
int y = 0;
for(i = 0;i < 4;i++)
{
ImageIcon imageIcon = new ImageIcon("image/card/" + card[i] + ".png");
Image image = imageIcon.getImage();
if(image != null)
{
g.drawImage(image,x,y,w,h,this);
}
x += w;
}
}
} public static void main(String[] args)
{
TwentyFourPoke_Game frame = new TwentyFourPoke_Game();
frame.setTitle("24 Poke Game");
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(368,200);
frame.setVisible(true);
}
}

24点扑克牌游戏——(含java源码)(GUI实现)的更多相关文章

  1. 【JDK命令行 一】手动编译Java源码与执行字节码命令合集(含外部依赖引用)

    写作目标 记录常见的使用javac手动编译Java源码和java手动执行字节码的命令,一方面用于应对 Maven 和 Gradle 暂时无法使用的情况,临时生成class文件(使用自己的jar包):另 ...

  2. Programming a Spider in Java 源码帖

    Programming a Spider in Java 源码帖 Listing 1: Finding the bad links (CheckLinks.java) import java.awt. ...

  3. 解密随机数生成器(二)——从java源码看线性同余算法

    Random Java中的Random类生成的是伪随机数,使用的是48-bit的种子,然后调用一个linear congruential formula线性同余方程(Donald Knuth的编程艺术 ...

  4. java源码——0~9十个数字不重复地使用使加法表达式成立

    这个问题是在我写个的几个博客里较为复杂的一个.首先,先看看整个问题的表述. 星号表示0~9的一个数字,而且不允许重复,使得下面的加法表达式成立.输出所有结果. ※ ※ ※ ※ ※    +  2   ...

  5. 如何阅读Java源码 阅读java的真实体会

    刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心.   说到技术基础,我打个比 ...

  6. Android反编译(一)之反编译JAVA源码

    Android反编译(一) 之反编译JAVA源码 [目录] 1.工具 2.反编译步骤 3.实例 4.装X技巧 1.工具 1).dex反编译JAR工具  dex2jar   http://code.go ...

  7. 如何阅读Java源码

    刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动.源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比方吧, ...

  8. Java 源码学习线路————_先JDK工具包集合_再core包,也就是String、StringBuffer等_Java IO类库

    http://www.iteye.com/topic/1113732 原则网址 Java源码初接触 如果你进行过一年左右的开发,喜欢用eclipse的debug功能.好了,你现在就有阅读源码的技术基础 ...

  9. Java--Eclipse关联Java源码

    打开Eclipse,Window->Preferences->Java 点Edit按钮后弹出: 点Source Attachment后弹出: 选择Java安装路径下的src.zip文件即可 ...

随机推荐

  1. AT89C51的内部4K flash,

    AT89C51的内部4K flash, 是用来下载程序代码的,程序运行时只能做读取数据操作,不能写入.单片机断电时需要候保存数据,可以选择 带EEPROM的单片机 就可以,如STC 系列的单片机有内部 ...

  2. [转帖]学习一下centos7 新地方

    总结的挺好  copy一下 慢慢学习: http://blog.itpub.net/312079/viewspace-2214440/ Centos7 单用户模式 centos7里不再有0-6启动级别 ...

  3. UVA10047_The Monocycle

    这题....有点奇葩,但是不难. 在矩形方阵里,某人可以往前走或者左拐右拐.都需要消耗一个单位时间. 问某人从一个点走向另一个点的最短时间,并且走过的路程是5的倍数. 由于n,m都小,直接f[n][m ...

  4. myeclipse8.6 注册码

    MyEclipse8.6 注册码 别处找的均是8.6版本,可以使用到2014年一:MyEclipse Standard Edition: zhucemLR7ZL-655954-695876566190 ...

  5. oracle 月份中日的值必须介于 1 和当月最后一日之间

    解决方法: 1.用时间字段去关联字符串字段导致此错误.. 如果1.解决不了就看 2.把date'2017-01-01'  换成 to_date('2017-01-01','yyyy-mm-dd')

  6. PowerDesigner在生成SQL时报错Generation aborted due to errors detected during the verification of the mod

    一.本章节要用到  ODBC连接数据库直接创建表,请先创建连接库的ODBC 请参考  新建  http://www.cnblogs.com/wdw31210/p/7580286.html 二.生成 去 ...

  7. # DZY Love Math 系列

    DZY Love Math 系列 [BOZJ3309] DZY Loves Math 顺着套路就能得到:\(Ans = \sum_{T=1}\lfloor \frac{n}{T} \rfloor \l ...

  8. 解题:AHOI2017/HNOI2017 礼物

    题面 先不管旋转操作,只考虑增加亮度这个操作.显然这个玩意的影响是相对于$x,y$固定的,所以可以枚举增加的亮度然后O(1)算出来.为了方便我们把这个操作换种方法表示,只让一个手环改变$[-m,m]$ ...

  9. 解题:POI 2015 PUS

    题面 还以为是差分约束,原来拓扑排序也能解决这样的问题=.= 类似差分约束的建图方式,我们把大小关系看做有向边.这样一来图上是不允许存在环的,于是我们可以做拓扑排序.然后问题来了,边数非常大,根本建不 ...

  10. 解题:USACO12FEB Nearby Cows

    题面 比较简单的树形dp(递推?) 设$dp[i][j]$表示距离$i$距离为$j$的点的数目,先预处理$g[i][j]$表示点$i$的子树中距离这个点距离为$j$的点的数目(猫老师讲过,用一个栈维护 ...