📄 twentyfourpoint.java
字号:
package wm.TwentyFourPoint;
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import java.text.*;
import javax.swing.*;
import java.lang.*;
public class TwentyFourPoint extends JFrame implements ActionListener
{
private JPanel ButtonPanel,FillPanel,ShowPanel,NumberPanel;
private JButton ButtonRoll,ButtonInput,ButtonShow,ButtonClear,ButtonDo;
private JTextField NumField[]=new JTextField[4],InputField;
private JLabel label1,label2;
private int i=0,j=0,k=0,m=-1,n=-1,p=0,q=0,x=0;
//private int Number4[]=new int[4];
//num_a=0,num_s=0,num_m=0,num_d=0,
//flag_a=0,flag_s=0,flag_m=0,flag_d=0;
private double numberA[]=new double[5],
numberB[]=new double[5],
number[][]=new double[5][5],result;
private double number4[]=new double[4];
private JTextArea area;
private String status="",string_in="",out="",
StrA[][]=new String[5][5],
StrB[][]=new String[5][5],
Str[][]=new String[5][5],
Str_End[][][]=new String[5][5][5];
private DecimalFormat fourDigits=new DecimalFormat("0.0000");
private Vector vector=new Vector(),
vectorcopy=new Vector(),
vectorstring=new Vector();//存入最终答案
public TwentyFourPoint()
{
super("24Points Game");
Container container=getContentPane();
container.setLayout(new BorderLayout());
NumberPanel=new JPanel();
NumberPanel.setLayout(new GridLayout(1,4,5,5));
FillPanel=new JPanel();
FlowLayout layout=new FlowLayout();
FillPanel.setLayout(layout);
layout.setAlignment(FlowLayout.CENTER);
ButtonPanel=new JPanel();
ButtonPanel.setLayout(new GridLayout(2,1,80,8));
ShowPanel=new JPanel();
ButtonRoll=new JButton("ROLL");
ButtonInput=new JButton("INPUT");
ButtonShow=new JButton("SHOW ANSWER");
ButtonShow.setEnabled(false);
ButtonClear=new JButton("CLEAR");
ButtonDo=new JButton("DONE");
ButtonRoll.addActionListener(this);
ButtonInput.addActionListener(this);
ButtonShow.addActionListener(this);
ButtonClear.addActionListener(this);
ButtonDo.addActionListener(this);
for(int x=0;x<NumField.length;x++)
{
NumField[x]=new JTextField(3);
NumField[x].setEditable(false);
NumField[x].setText("");
NumberPanel.add(NumField[x]);
}
NumberPanel.add(ButtonRoll);
NumberPanel.add(ButtonInput);
label1=new JLabel("请输入您的答案:");
label2=new JLabel("正确的结果:");
InputField=new JTextField(35);
//InputField.setText("");
area=new JTextArea(10,35);
area.setEditable(false);
FillPanel.add(label1);
FillPanel.add(InputField);
FillPanel.add(label2);
FillPanel.add(new JScrollPane(area));
ShowPanel.add(ButtonDo);
ShowPanel.add(ButtonShow);
ShowPanel.add(ButtonClear);
container.add(NumberPanel,BorderLayout.NORTH);
container.add(FillPanel,BorderLayout.CENTER);
container.add(ShowPanel,BorderLayout.SOUTH);
setSize(450,400);
setLocation(150,150);
setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==ButtonRoll)
{
ButtonShow.setEnabled(true);
for( int x=0;x<NumField.length;x++)
{
NumField[x].setEditable(false);
NumField[x].setText(Integer.toString(1+(int)(Math.random()*13)));//随机产生四个数
number4[x]=Double.parseDouble(NumField[x].getText());
}
//随机产生四个数,相当于重新计算,清除以前所有数据
area.setText("");
InputField.setText("");
vector.clear();
vectorcopy.clear();
vectorstring.clear();
}
if(e.getSource()==ButtonInput)
{
for( int x=0;x<NumField.length;x++)
NumField[x].setEditable(true);
ButtonShow.setEnabled(true);
area.setText("");
InputField.setText("");
vector.clear();
vectorcopy.clear();
vectorstring.clear();
}
if(e.getSource()==ButtonShow)
{
//先清空以前所有数据
vector.clear();
vectorcopy.clear();
vectorstring.clear();
status="";
ShowAnswer();
area.setText(status);
for( int x=0;x<NumField.length;x++)
NumField[x].setEditable(false);
}
if(e.getSource()==ButtonClear)
{
for( x=0;x<NumField.length;x++)
{
NumField[x].setText("");
NumField[x].setEditable(false);
}
InputField.setText("");
area.setText("");
vector.clear();
ButtonShow.setEnabled(false);
}
if(e.getSource()==ButtonDo)
{
ShowAnswer();
out="";
if(InputField.getText().equalsIgnoreCase(""))
JOptionPane.showMessageDialog( this,"请输入合适的算法","错误",JOptionPane.ERROR_MESSAGE );
else {match();area.setText(out);}
}
}
/*运用五种运算+(A+B) -(大数减小数) *(A*B) /(A/B) /(B/A)
*因为四个数,运算的时候可以分成两种情况,一种是两个两个配对;第二种是三个一个配对
*假设四个数是abcd,第一种的思路是ab-A,cd-B,AB-24;第二种思路是ab-A,Ac-B,Bd-24
*每一种运算都要进行上述五种运算情况*/
//22情况
public void arithmetic1()
{
for(j=0;j<vector.size();j++)
{
i=0;
m=-1;
if(j!=i)
{
for(k=0;k<4;k++)//4个数
{
if(k!=i&&k!=j&&m==-1)
{m=k;k++;}
if(k!=i&&k!=j&&k!=m)
{n=k;break;}
}
for(k=0;k<5;k++)//5种运算
switch(k)
{
case 0:numberA[k]=(Double)vector.get(i)+(Double)vector.get(j);
numberB[k]=(Double)vector.get(m)+(Double)vector.get(n);
StrA[k][0]=((Double)vector.get(i)).intValue()+"+"+((Double)vector.get(j)).intValue();
StrB[0][k]=((Double)vector.get(m)).intValue()+"+"+((Double)vector.get(n)).intValue();
break;
case 1: if((Double)vector.get(i)>=(Double)vector.get(j))
{
numberA[k]=(Double)vector.get(i)-(Double)vector.get(j);
StrA[k][0]=((Double)vector.get(i)).intValue()+"-"+((Double)vector.get(j)).intValue();
}
else
{
numberA[k]=(Double)vector.get(j)-(Double)vector.get(i);
StrA[k][0]=((Double)vector.get(j)).intValue()+"-"+((Double)vector.get(i)).intValue();
}
if((Double)vector.get(m)>=(Double)vector.get(n))
{
numberB[k]=(Double)vector.get(m)-(Double)vector.get(n);
StrB[0][k]=((Double)vector.get(m)).intValue()+"-"+((Double)vector.get(n)).intValue();
}
else
{
numberB[k]=(Double)vector.get(n)-(Double)vector.get(m);
StrB[0][k]=((Double)vector.get(n)).intValue()+"-"+((Double)vector.get(m)).intValue();
}
break;
case 2: numberA[k]=(Double)vector.get(i)*(Double)vector.get(j);
numberB[k]=(Double)vector.get(m)*(Double)vector.get(n);
StrA[k][0]=((Double)vector.get(i)).intValue()+"*"+((Double)vector.get(j)).intValue();
StrB[0][k]=((Double)vector.get(m)).intValue()+"*"+((Double)vector.get(n)).intValue();
break;
case 3: numberA[k]=(Double)vector.get(i)/(Double)vector.get(j);
numberB[k]=(Double)vector.get(m)/(Double)vector.get(n);
StrA[k][0]=((Double)vector.get(i)).intValue()+"/"+((Double)vector.get(j)).intValue();
StrB[0][k]=((Double)vector.get(m)).intValue()+"/"+((Double)vector.get(n)).intValue();
break;
case 4: numberA[k]=(Double)vector.get(j)/(Double)vector.get(i);
numberB[k]=(Double)vector.get(n)/(Double)vector.get(m);
StrA[k][0]=((Double)vector.get(j)).intValue()+"/"+((Double)vector.get(i)).intValue();
StrB[0][k]=((Double)vector.get(n)).intValue()+"/"+((Double)vector.get(m)).intValue();
break;
}//switch end,for end
for(int p=0;p<numberA.length;p++)
for(int q=0;q<numberB.length;q++)//5×5=25种情况
for(k=0;k<5;k++)
{
switch(k)
{
case 0:result=numberA[p]+numberB[q];
Str[p][q]=StrA[p][0]+"+"+StrB[0][q]+"="+(int)result;//fourDigits.format(result);
if(result>23.9999&&result<24.0001)
vectorstring.addElement(Str[p][q]);
break;
case 1:if(numberA[p]>=numberB[q])
{
result=numberA[p]-numberB[q];
if(q==0||q==1)
Str[p][q]=StrA[p][0]+"-"+"("+StrB[0][q]+")"+"="+(int)result;//fourDigits.format(result);
if(q==2||q==3||q==4)
Str[p][q]=StrA[p][0]+"-"+StrB[0][q]+"="+(int)result;//fourDigits.format(result);
if(result>23.9999&&result<24.0001) vectorstring.addElement(Str[p][q]);
}
else
{
result=numberB[q]-numberA[p];
if(p==0||p==1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -