我有做过这个游戏,请联系[email protected]

解决方案 »

  1.   

    A B C D   有24种顺序组合
    有6种加括号的方法
    有4*4*4的符号组合 64种,总共最多循环24*6*64
      

  2.   

    喂,二十四点是对四张牌进行运算,不是十三张,更不是52张。
    那么四张牌算二十四点如果穷举会有几种算法呢?4x4x4x6=384电脑做三百多次的运算各位应该知道吧,所以人是不会比电脑快的。如果你要写这个游戏,那么就要让电脑可以等待游戏者一段时间,这个时间如果是randomed更逼真。
    对那些想寻找什么24点算法的人:画蛇添足。
      

  3.   

    to wlz_bj:加一对括号是六种方法,你有没考虑加两对呢?
      

  4.   

    你可以把它做成互联游戏,j2me方面好一些,有前景吧,两个人拿手机比,有点联众游戏的感觉,我觉得做网络游戏比单机游戏有发展前途,与电脑比,晕,电脑是计算工作,可以做裁判,提供平台,让人来玩,不要与电脑玩,这个不是下五子棋,是要比快,还是向网络游戏方面发展好一些,哈,我只是说说,不会做,谁做出来给我一份吧,最好是jdk1.4.X+smtk+6688i模拟器的,这样我也可以玩呀,哈,给我源码呀,我研究一下,可以商用呀,哈哈
      

  5.   

    穷举然后把所有的解决方案存下来
    到时候只要到一边查一下即可
    效率是log2(解决方案数)
      

  6.   

    给出我的代码,差不多一年了,由于只是一时兴起写的,
    很多细节没想太多,献绌了.我的算法没有考虑四则运算
    的运算符优先级,这个不是算法错误,为什么各位想想就
    知道了,呵呵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;
      }
      

  7.   

    // -------- 接着第二部分  /**
       * 两元计算
       * @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);
      }
    }