我有做过这个游戏,请联系[email protected]
解决方案 »
- 同志们 帮我看看 这个代码 就是运行 不起来 帮帮忙 急!!谢谢了
- (高分求助)如何通过JAVA编程实现检测某个进程是否正在运行?
- 初学JAVA,这个程序错在那里,为什么得不到想要得结果!
- html:option 标签中的value值,如何从资源文件中读取数据?超着急......在线等待!!!!!!
- 我在Jbuilder下编辑的java程序(OK的!),为什么在JDK下Compile不过去呢?
- 我难道真是白菜?
- 大家来一下!
- 很奇怪,varchar2类型在sql*plus中可以看到正常的字符串,用java读出来却是二进制?
- 安卓开发环境的搭建
- Java子类和父类中的相同字段,取值时为什么取的是父类的值!
- collection、literator、vector具体用法?
- 求助!!!!!
有6种加括号的方法
有4*4*4的符号组合 64种,总共最多循环24*6*64
那么四张牌算二十四点如果穷举会有几种算法呢?4x4x4x6=384电脑做三百多次的运算各位应该知道吧,所以人是不会比电脑快的。如果你要写这个游戏,那么就要让电脑可以等待游戏者一段时间,这个时间如果是randomed更逼真。
对那些想寻找什么24点算法的人:画蛇添足。
到时候只要到一边查一下即可
效率是log2(解决方案数)
很多细节没想太多,献绌了.我的算法没有考虑四则运算
的运算符优先级,这个不是算法错误,为什么各位想想就
知道了,呵呵package com.wolfsquare;import java.awt.*;
import java.awt.event.*;import java.math.*;import java.util.Vector;import javax.swing.*;
/**
* <p>24点计算程序</p>
* <p>Copyright:wolfsquare Copyright (c) 2002</p>
* 许可:
* 如果转载请注明出处,禁止将本代码用于商业用途.
* 改进或建议可与[email protected]联系
* @author wolfsquare
* @version 1.0
*/
public class Point24 extends JFrame implements Runnable {
private final static double PRECISION = 0.1; // 允许和24的最小的差值精度
private static final String[] fontSettings = {
"CheckBox.font", "Tree.font", "Viewport.font", "ProgressBar.font",
"RadioButtonMenuItem.font", "ToolBar.font", "ColorChooser.font",
"ToggleButton.font", "Panel.font", "TextArea.font", "Menu.font",
"TableHeader.font", "TextField.font", "OptionPane.font", "MenuBar.font",
"Button.font", "Label.font", "PasswordField.font", "ScrollPane.font",
"MenuItem.font", "ToolTip.font", "List.font", "EditorPane.font",
"Table.font", "TabbedPane.font", "RadioButton.font", "CheckBoxMenuItem.font",
"TextPane.font", "PopupMenu.font", "TitledBorder.font",
"InternalFrame.titleFont", "ComboBox.font",
};
Vector listdata = new Vector();
boolean stopFlag = false;
JPanel jPanel2 = new JPanel();
JButton jBtnStart = new JButton();
JButton jBtnStop = new JButton(); /*
String[] listdata = {
"0","1","2","3","4","5","6","7","8","9","10","A","B","C","D","E","F","G"
};
*/
Thread thread = new Thread(this);
String[] op = { "+", "-", "*", "/" };
String[][] ops = null;
int[] allnum;
private JPanel jPanel4 = new JPanel();
private BorderLayout borderLayout1 = new BorderLayout();
private JPanel jPanel1 = new JPanel();
private JList jList1 = new JList(listdata);
private JLabel jLabel = new JLabel("结果:");
private JTextField jTxtOpNum1 = new JTextField();
private JTextField jTxtOpNum2 = new JTextField();
private JTextField jTxtOpNum3 = new JTextField();
private JTextField jTxtOpNum4 = new JTextField();
private JScrollPane jScrollPane1 = new JScrollPane();
private JSplitPane jSplitPane1 = new JSplitPane();
private BorderLayout borderLayout2 = new BorderLayout();
private JProgressBar jProgressBar1 = new JProgressBar();
private GridLayout gridLayout1 = new GridLayout(6, 1);
private JButton jBtnCalculateSingle = new JButton();
private JPanel jPanel3 = new JPanel();
private JLabel jLblMessage = new JLabel(); public Point24() {
try {
jbInit();
} catch (Exception e) {
e.printStackTrace();
} initData();
} public static void setFont() {
Font defaultFont = new Font("宋体", Font.PLAIN, 12); for (int i = 0; i < fontSettings.length; i++) {
UIManager.put(fontSettings[i], defaultFont);
}
} public static void main(String[] args) {
Point24 frame2 = new Point24();
frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame2.show();
} private void jbInit() throws Exception {
setFont();
this.setSize(new Dimension(400, 300));
jBtnStart.setText("Start");
jBtnStart.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
jBtnStart_actionPerformed(e);
}
});
jBtnStop.setText("Stop");
jBtnStop.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
jBtnStop_actionPerformed(e);
}
});
jPanel4.setLayout(borderLayout1);
jPanel1.setLayout(borderLayout2);
jBtnCalculateSingle.setText("计算");
jBtnCalculateSingle.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
jBtnCalculateSingle_actionPerformed(e);
}
});
jPanel3.setLayout(gridLayout1);
jLblMessage.setText("状态");
jPanel2.setBorder(BorderFactory.createEtchedBorder());
this.getContentPane().add(jPanel2, BorderLayout.SOUTH);
jPanel2.add(jBtnStart, null);
jPanel2.add(jBtnStop, null);
this.getContentPane().add(jPanel4, BorderLayout.CENTER);
jPanel4.add(jSplitPane1, BorderLayout.CENTER);
jPanel1.add(jProgressBar1, BorderLayout.SOUTH);
jPanel1.add(jScrollPane1, BorderLayout.CENTER);
jSplitPane1.add(jPanel3, JSplitPane.TOP);
jScrollPane1.getViewport().add(jList1, null);
jSplitPane1.add(jPanel1, JSplitPane.BOTTOM);
jPanel3.add(jLabel, null);
jPanel3.add(jTxtOpNum1, null);
jPanel3.add(jTxtOpNum2, null);
jPanel3.add(jTxtOpNum3, null);
jPanel3.add(jTxtOpNum4, null);
jPanel3.add(jBtnCalculateSingle, null);
jPanel4.add(jLblMessage, BorderLayout.SOUTH);
jSplitPane1.setDividerLocation(200);
this.setTitle("24点计算");
} void jBtnStart_actionPerformed(ActionEvent e) {
thread.start();
} private void initData() {
allnum = new int[13]; for (int i = 0, n = 1; i < 13; i++, n++) {
allnum[i] = n;
} for (int i = 0; i < 13; i++)
System.out.print(" " + allnum[i]); ops = new String[64][3]; for (int i = 0, n = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
for (int k = 0; k < 4; k++, n++) {
ops[n][0] = op[i];
ops[n][1] = op[j];
ops[n][2] = op[k];
}
} public double caculate(int num1, String op1, int num2, String op2, int num3,
String op3, int num4) {
double ret = 0; ret = calTwo(num1, op1, num2);
ret = calTwo(ret, op2, num3);
ret = calTwo(ret, op3, num4); return ret;
}
* 两元计算
* @param num1
* @param op
* @param num2
* @return
*/
private double calTwo(double num1, String op, double num2) {
double ret = 0; if (op.equals("+")) {
ret = num1 + num2;
} else if (op.equals("-")) {
ret = num1 - num2;
} else if (op.equals("*")) {
ret = num1 * num2;
} else {
ret = num1 / num2;
} return ret;
} public void run() {
System.out.println("run");
this.jBtnStart.setEnabled(false); int pos1 = 0;
int pos2 = 1;
int pos3 = 2;
int pos4 = 3;
double val = 0;
StringBuffer strb = new StringBuffer();
jProgressBar1.setMinimum(0);
jProgressBar1.setMaximum(13 * 13 * 13 * 13); int step = 0; if (listdata.size() > 0) {
listdata.removeAllElements();
} int size = 0;
// 穷举法
for (pos1 = 0; (pos1 < 13) && !stopFlag; pos1++)
for (pos2 = 0; (pos2 < 13) && !stopFlag; pos2++)
for (pos3 = 0; (pos3 < 13) && !stopFlag; pos3++)
for (pos4 = 0; (pos4 < 13) && !stopFlag; pos4++) {
for (int i = 0; (i < 64) && !stopFlag; i++) { // 四则运算全排列
val = caculate(allnum[pos1], ops[i][0], allnum[pos2], ops[i][1],
allnum[pos3], ops[i][2], allnum[pos4]); if (Math.abs(Math.abs(val) - 24) < PRECISION) {// 绝对差超过最小精度的不算是整除
strb = new StringBuffer();
strb.append(String.valueOf(allnum[pos1]));
strb.append(ops[i][0]);
strb.append(String.valueOf(allnum[pos2]));
strb.append(ops[i][1]);
strb.append(String.valueOf(allnum[pos3]));
strb.append(ops[i][2]);
strb.append(String.valueOf(allnum[pos4]));
listdata.addElement(strb.toString()); if ((step % 100) == 0) {
jList1.setListData(listdata);
jList1.repaint();
} // System.out.println(strb.toString() );
size++;
strb = new StringBuffer();
strb.append("当前进度:");
strb.append(String.valueOf(step + 1));
strb.append(" 符合个数:");
strb.append(size);
jLblMessage.setText(strb.toString()); break;
}
} jProgressBar1.setValue(step++);
jLblMessage.repaint();
} jList1.setListData(listdata);
jList1.repaint();
System.out.println("end");
this.jBtnStart.setEnabled(true);
} public void stop() {
stopFlag = !stopFlag;
} void jBtnStop_actionPerformed(ActionEvent e) {
stop();
} void jBtnCalculateSingle_actionPerformed(ActionEvent e) {
jBtnCalculateSingle.setEnabled(false); boolean ret = false;
double val = 0;
StringBuffer strb = null;
int[] num = { 0, 0, 0, 0 }; try {
num[0] = Integer.parseInt(jTxtOpNum4.getText());
num[1] = Integer.parseInt(jTxtOpNum3.getText());
num[2] = Integer.parseInt(jTxtOpNum2.getText());
num[3] = Integer.parseInt(jTxtOpNum1.getText());
} catch (Exception ex) {
} int[][] n = new int[24][4];
int count = 0; for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++) {
if (i == j) {
continue;
} for (int k = 0; (i != j) && (k < 4); k++) {
if ((k == i) || (k == j)) {
continue;
} for (int l = 0; l < 4; l++) {
if ((l == i) || (l == j) || (l == k)) {
continue;
} n[count][0] = num[i];
n[count][1] = num[j];
n[count][2] = num[k];
n[count++][3] = num[l];
}
}
} System.out.println("组合数:" + count); listdata.removeAllElements();
jList1.repaint(); for (count--; (count >= 0) && !ret; count--)
for (int i = 0; (i < 64) && !ret; i++) {
val = caculate(n[count][0], ops[i][0], n[count][1], ops[i][1],
n[count][2], ops[i][2], n[count][3]); strb = new StringBuffer();
strb.append(String.valueOf(n[count][0]));
strb.append(ops[i][0]);
strb.append(String.valueOf(n[count][1]));
strb.append(ops[i][1]);
strb.append(String.valueOf(n[count][2]));
strb.append(ops[i][2]);
strb.append(String.valueOf(n[count][3]));
listdata.addElement(strb.toString()); if (Math.abs(Math.abs(val) - 24) < PRECISION) {
jLabel.setText(strb.toString());
ret = true;
}
} jList1.repaint(); if (!ret) {
jLabel.setText(" 结果: 计算不出 " + val);
} jBtnCalculateSingle.setEnabled(true);
}
}