Java代碼片段:
- //import Java.util.Random;
- /*
- * 檢查類,【本游戲的核心算法】
- * ①用於檢查隨機生成的4個1~10的隨機數能否通過運算得到24,
- * 如果不能則再次產生4個隨機數,
- * 直到產生能夠運算得到24的隨機數為止
- * ②檢查用戶輸入的表達式是否合法或運算結果是否正確
- */
- public class Check {
- protected String outputs=new String();
- /*
- * 返回隨機數全排列的方法,
- * 對產生的四個隨機數進行全排列,
- * 共有4*3*2*1=24種情況,
- * 考慮到運行效率,
- * 直接將各種情況羅列出來,
- * 沒有用遞歸全排列的方法,
- * 該方法通過形參i控制選取24種排列的第幾種,
- * 返回四個數的一維浮點型數組
- */
- private float[] number(float [] a,int i){
- final float[] Array = new float[4];
- switch(i){
- case 0 : Array[0]=a[0];Array[1]=a[1];Array[2]=a[2];Array[3]=a[3];break;
- case 1 : Array[0]=a[0];Array[1]=a[1];Array[2]=a[3];Array[3]=a[2];break;
- case 2 : Array[0]=a[0];Array[1]=a[2];Array[2]=a[1];Array[3]=a[3];break;
- case 3 : Array[0]=a[0];Array[1]=a[2];Array[2]=a[3];Array[3]=a[1];break;
- case 4 : Array[0]=a[0];Array[1]=a[3];Array[2]=a[2];Array[3]=a[1];break;
- case 5 : Array[0]=a[0];Array[1]=a[3];Array[2]=a[1];Array[3]=a[2];break;
- case 6 : Array[0]=a[1];Array[1]=a[0];Array[2]=a[2];Array[3]=a[3];break;
- case 7 : Array[0]=a[1];Array[1]=a[0];Array[2]=a[3];Array[3]=a[2];break;
- case 8 : Array[0]=a[1];Array[1]=a[2];Array[2]=a[0];Array[3]=a[3];break;
- case 9 : Array[0]=a[1];Array[1]=a[2];Array[2]=a[3];Array[3]=a[0];break;
- case 10: Array[0]=a[1];Array[1]=a[3];Array[2]=a[2];Array[3]=a[0];break;
- case 11: Array[0]=a[1];Array[1]=a[3];Array[2]=a[0];Array[3]=a[2];break;
- case 12: Array[0]=a[2];Array[1]=a[1];Array[2]=a[0];Array[3]=a[3];break;
- case 13: Array[0]=a[2];Array[1]=a[1];Array[2]=a[3];Array[3]=a[0];break;
- case 14: Array[0]=a[2];Array[1]=a[0];Array[2]=a[1];Array[3]=a[3];break;
- case 15: Array[0]=a[2];Array[1]=a[0];Array[2]=a[3];Array[3]=a[1];break;
- case 16: Array[0]=a[2];Array[1]=a[3];Array[2]=a[0];Array[3]=a[1];break;
- case 17: Array[0]=a[2];Array[1]=a[3];Array[2]=a[1];Array[3]=a[0];break;
- case 18: Array[0]=a[3];Array[1]=a[1];Array[2]=a[2];Array[3]=a[0];break;
- case 19: Array[0]=a[3];Array[1]=a[1];Array[2]=a[0];Array[3]=a[2];break;
- case 20: Array[0]=a[3];Array[1]=a[2];Array[2]=a[1];Array[3]=a[0];break;
- case 21: Array[0]=a[3];Array[1]=a[2];Array[2]=a[0];Array[3]=a[1];break;
- case 22: Array[0]=a[3];Array[1]=a[0];Array[2]=a[2];Array[3]=a[1];break;
- case 23: Array[0]=a[3];Array[1]=a[0];Array[2]=a[1];Array[3]=a[2];break;
- }
- return Array ;
- }
- /*
- * 返回運算符排列的方法,
- * 四個數進行運算時需要三個運算符,
- * 三個運算符的所有可能的排列是4^3=64種,
- * 該方法直接返回64種運算符,
- * 保存在二維字符型數組
- */
- private char [][]Calculate(){
- final char [][] Char=new char [64][3];//返回的運算符數組
- final int [][] ar=new int [64][3];//控制返回三個運算符
- int t=0;
- stop:for(int i=0;i<4;i++){
- for(int j=0;j<4;j++){
- for(int k=0;k<4;k++){
- ar[t][0]=i;
- ar[t][1]=j;
- ar[t][2]=k;
- for(int l=0;l<3;l++){//i,j,k的范圍都是0~3,通過switch,將0~3分別映射為+,—,*,/
- switch(ar[t][l]){
- case 0:Char[t][l]='+';break;
- case 1:Char[t][l]='-';break;
- case 2:Char[t][l]='*';break;
- case 3:Char[t][l]='/';break;
- }
- }
- t++;
- if(t==64)
- break stop; //通過t的自增控制循環的結束
- }
- }
- }
- return Char;
- }
- /*
- * 返回計算結果的方法,
- * 對兩個隨機數進行運算
- */
- private float Run(float a,float b,char c){
- float sum=0f;
- switch(c){
- case '+': sum=a+b;break; //將'+'字符轉換成加法運算
- case '-': sum=a-b;break; //將'-'字符轉換成減法運算
- case '*': sum=a*b;break; //將'*'字符轉換成乘法運算
- case '/': sum=a/b;break; //將'/'字符轉換成除法運算
- }
- return sum;
- }
- /*
- * check方法
- * 如果可以運算得到24,
- * 返回true,
- * 否則返回false
- * 為了節省運行時間,
- * 運算時,
- * 只要某一次運算結果是24就直接返回true
- * 只有產生的隨機數不能運算得到24時才會運行所有情況
- */
- protected boolean check(float[] myStatus){
- float num[]=new float [4];
- char [][] allcha=new char [64][3];
- allcha=Calculate();
- for(int i=0;i<24;i++){
- for(int j=0;j<64;j++){
- float x;
- num=number(myStatus,i);
- /*
- * 注釋解析:
- * ABCD表示四個參與運算的隨機數
- * ①②③表示運算順序
- */
- x=Run(Run(Run(num[0],num[1],allcha[j][0]),num[2],allcha[j][1]),num[3],allcha[j][2]);
- if(x==24.0f){
- //System.out.println("(("+num[0]+allcha[j][0]+num[1]+")"+allcha[j][1]+num[2]+")"+allcha[j][2]+num[3]);
- outputs="(("+(int)num[0]+allcha[j][0]+(int)num[1]+")"+allcha[j][1]+(int)num[2]+")"+allcha[j][2]+(int)num[3];
- System.out.println(outputs);
- return true;
- }
- // 以上運算類型為:((A①B)②C)③D
- x=Run(Run(num[0],num[1],allcha[j][0]),Run(num[2],num[3],allcha[j][2]),allcha[j][1]);
- if(x==24.0f){
- //System.out.println("("+num[0]+allcha[j][0]+num[1]+")"+allcha[j][1]+"("+num[2]+allcha[j][2]+num[3]+")");
- outputs="("+(int)num[0]+allcha[j][0]+(int)num[1]+")"+allcha[j][1]+"("+(int)num[2]+allcha[j][2]+(int)num[3]+")";
- System.out.println(outputs);
- return true;
- }
- //以上運算類型為:(A①B)②(C①D)
- x=Run(Run(num[0],Run(num[1],num[2],allcha[j][1]),allcha[j][0]),num[3],allcha[j][2]);
- if(x==24.0f){
- //System.out.println("("+num[0]+allcha[j][0]+"("+num[1]+allcha[j][1]+num[2]+"))"+allcha[j][2]+num[3]);
- outputs="("+(int)num[0]+allcha[j][0]+"("+(int)num[1]+allcha[j][1]+(int)num[2]+"))"+allcha[j][2]+(int)num[3];
- System.out.println(outputs);
- return true;
- }
- //以上運算類型為:(A②(B①C))③D
- x=Run(num[0],Run(Run(num[1],num[2],allcha[j][1]),num[3],allcha[j][2]),allcha[j][0]);
- if(x==24.0f){
- //System.out.println(num[0]+""+allcha[j][0]+"(("+num[1]+allcha[j][1]+num[2]+")"+allcha[j][2]+num[3]+")");
- outputs=(int)num[0]+""+allcha[j][0]+"(("+(int)num[1]+allcha[j][1]+(int)num[2]+")"+allcha[j][2]+(int)num[3]+")";
- System.out.println(outputs);
- return true;
- }
- //以上運算類型為:A③((B①C)②D)
- x=Run(num[0],Run(num[1],Run(num[2],num[3],allcha[j][2]),allcha[j][1]),allcha[j][0]);
- if(x==24.0f){
- //System.out.println(num[0]+""+allcha[j][0]+"("+num[1]+allcha[j][1]+"("+num[2]+allcha[j][2]+num[3]+"))");
- outputs=(int)num[0]+""+allcha[j][0]+"("+(int)num[1]+allcha[j][1]+"("+(int)num[2]+allcha[j][2]+(int)num[3]+"))";
- System.out.println(outputs);
- return true;
- }
- //以上運算類型為:A③(B②(C①D))
- }
- }
- return false;
- }
- /*
- * 把字符串的數學表達式計算出結果
- */
- protected float string_float(String s0){
- char s[]=new char[s0.length()];
- float sum=0;//計算結果
- float num[]={-1,-1,-1,-1}; //記錄數學表達式中的數
- int calculate_location[]={-1,-1,-1};
- char calculate[]={'a','a','a'};//記錄數學表達式中的運算符
- int calculate_priority[]={3,2,1};//設置優先級
- int abc;
- for(int i=0;i<s.length;i++)
- s[i]=s0.charAt(i);
- for(int i=0,j=0,l=0;i<s.length;i++){//分析字符串
- if(s[i]>='0'&&s[i]<='9')
- {//得到數學表達式中的數
- num[j]=s[i]-48;
- if(i+1<s.length)
- if(s[i+1]>='0'&&s[i+1]<='9')
- {
- num[j]=num[j]*10+s[i+1]-48;
- i++;
- }
- j++;
- continue;
- }
- if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/')//得到表達式中的運算符
- if(calculate_location[l]==-1)
- {
- calculate_location[l]=i;
- calculate[l]=s[i];
- l++;
- }
- }
- for(int i=0,i0=0,j=0;i<s.length;i++)
- {//分析表達式的運算優先級
- if(s[i]==')')
- {// 先算括號裡的表達式
- for(i0=i;s[i0]!='(';i0--)
- if(s[i0]=='+'||s[i0]=='-'||s[i0]=='*'||s[i0]=='/')
- for(j=0;j<3;j++)
- if(calculate_location[j]==i0)
- calculate_priority[j]+=8;
- s[i0]='s';
- }
- if(s[i]=='*'||s[i]=='/')//再算乘除
- for(j=0;j<3;j++)
- if(calculate_location[j]==i)
- calculate_priority[j]+=4;
- }
- /*
- * 此處的if是把剛才分析的運算優先級用一個int的變量abc記錄下來,如123則表示第三個運算符
- * 運算級最高,其實是第二個,最後是第一個
- */
- if(calculate_priority[0]>calculate_priority[1])
- {
- if(calculate_priority[0]>calculate_priority[2])
- calculate_priority[0]=-1;
- else
- calculate_priority[2]=-1;
- }
- else
- {
- if(calculate_priority[1]>calculate_priority[2])
- calculate_priority[1]=-1;
- else
- calculate_priority[2]=-1;
- }
- if(calculate_priority[0]<0)
- {
- if(calculate_priority[1]>calculate_priority[2])
- {
- calculate_priority[1]=-2;
- calculate_priority[2]=-3;
- }
- else
- {
- calculate_priority[1]=-3;
- calculate_priority[2]=-2;
- }
- }
- else
- {
- if(calculate_priority[1]<0)
- {
- if(calculate_priority[0]>calculate_priority[2])
- {
- calculate_priority[0]=-2;
- calculate_priority[2]=-3;
- }
- else
- {
- calculate_priority[0]=-3;
- calculate_priority[2]=-2;
- }
- }
- else
- {
- if(calculate_priority[0]>calculate_priority[1])
- {
- calculate_priority[0]=-2;
- calculate_priority[1]=-3;
- }
- else
- {
- calculate_priority[0]=-3;
- calculate_priority[1]=-2;
- }
- }
- }
- abc=calculate_priority[0]*100+calculate_priority[1]*10+calculate_priority[2];
- abc=-abc;
- //根據剛才分析的運算級,計算出結果,保存在sum裡面
- switch(abc){
- case 123:sum=Run(Run(Run(num[0],num[1],calculate[0]),num[2],calculate[1]),num[3],calculate[2]);break;
- case 132:sum=Run(Run(num[0],num[1],calculate[0]),Run(num[2],num[3],calculate[2]),calculate[1]);break;
- case 213:sum=Run(Run(num[0],Run(num[1],num[2],calculate[1]),calculate[0]),num[3],calculate[2]);break;
- case 231:sum=Run(Run(num[0],num[1],calculate[0]),Run(num[2],num[3],calculate[2]),calculate[1]);break;
- case 312:sum=Run(num[0],Run(Run(num[1],num[2],calculate[1]),num[3],calculate[2]),calculate[0]);break;
- case 321:sum=Run(num[0],Run(num[1],Run(num[2],num[3],calculate[2]),calculate[1]),calculate[0]);break;
- }
- return sum;//返回結果
- }
- //測試區
- /* public static void main(String[]args){
- Check c=new Check();
- Float [] test=new Float [4];
- Random ran=new Random();
- for(int i=0;i<4;i++)
- test[i]=(float) ((int)(ran.nextFloat()*10+1));
- //c.check(test);
- System.out.println(test[0]+" "+test[1]+" "+test[2]+" "+test[3]+" "+c.check(test));
- test[0]=5.0f;
- test[1]=10.0f;
- test[2]=2.0f;
- test[3]=10.0f;
- //c.check(test);
- System.out.println(test[0]+" "+test[1]+" "+test[2]+" "+test[3]+" "+c.check(test));
- }*/
- }
Java代碼片段:
- import Java.awt.BorderLayout;
- import Java.awt.event.ActionEvent;
- import Java.awt.event.ActionListener;
- import Javax.swing.JButton;
- import Javax.swing.JFrame;
- import Javax.swing.JLabel;
- import Javax.swing.JPanel;
- @SuppressWarnings("serial")
- public class MasgDlg extends JFrame implements ActionListener {
- Calculate24 bp=new Calculate24();
- protected MasgDlg( Calculate24 btp,String strMsg){
- this.setTitle("提示窗口");
- bp=btp;
- JPanel textp=new JPanel();
- JPanel btnp=new JPanel();
- JLabel label=new JLabel();
- this.setLayout(new BorderLayout());
- this.add(textp,BorderLayout.NORTH);
- this.add(btnp,BorderLayout.SOUTH);
- textp.add(label,BorderLayout.CENTER);
- label.setText(strMsg);
- this.setSize(580,100);
- this.setLocation(400,300);
- JButton btnOk=new JButton("確定");
- JButton btnquit=new JButton("退出");
- btnOk.setActionCommand("restart");
- btnOk.addActionListener(this);
- btnquit.setActionCommand("quit");
- btnquit.addActionListener(this);
- btnp.add(btnOk);
- btnp.add(btnquit);
- this.setVisible(true);//顯示對話框
- this.setAlwaysOnTop(true);
- bp.btnStart.setEnabled(false);
- }
- public void actionPerformed(ActionEvent e) {
- if(e.getActionCommand().equals("restart")){
- this.dispose();
- bp.btnStart.setEnabled(true);
- }
- else if(e.getActionCommand().equals("quit")){
- System.exit(0);
- //隱藏對話框
- }
- }
- //測試區
- /*public static void main(String []args){
- new MsgDlg("歡迎再次使用");
- }*/
- }
Java代碼片段:
- import Java.awt.BorderLayout;
- import Java.awt.event.ActionEvent;
- import Java.awt.event.ActionListener;
- import Javax.swing.JButton;
- import Javax.swing.JFrame;
- import Javax.swing.JLabel;
- import Javax.swing.JPanel;
- @SuppressWarnings("serial")
- public class MsgDlg extends JFrame implements ActionListener {
- Calculate24 tempCal24;
- protected MsgDlg(String strMsg,Calculate24 Cal24){
- //super();
- this.setTitle("提示窗口");
- JPanel textp=new JPanel();
- JPanel btnp=new JPanel();
- JLabel label=new JLabel();
- this.setLayout(new BorderLayout());
- this.add(textp,BorderLayout.NORTH);
- this.add(btnp,BorderLayout.SOUTH);
- textp.add(label,BorderLayout.CENTER);
- label.setText(strMsg);
- this.setSize(580,100);
- this.setLocation(400,300);
- JButton btnOk=new JButton("確定");
- tempCal24=Cal24;
- btnOk.addActionListener(this);
- btnp.add(btnOk);
- this.toFront();
- tempCal24.btnOk.setEnabled(false);//使確定按鈕不可用
- this.setVisible(true);//顯示對話框
- }
- public void actionPerformed(ActionEvent e) {
- this.dispose();//隱藏對話框
- tempCal24.btnOk.setEnabled(true);//激活確定按鈕
- }
- //測試區
- /*public static void main(String []args){
- new MsgDlg("歡迎再次使用");
- }*/
- }
Java代碼片段:
- import Javax.swing.*;
- import Java.awt.event.*;
- /*
- * 時間顯示類
- */
- @SuppressWarnings("serial")
- public class MyTimer extends JPanel
- {
- protected int usedTime = 0;//定義初始時間為0
- public Timer timer;
- public JLabel usedTimeLabel = new JLabel("用時:");
- public JTextFIEld timeText = new JTextFIEld(5);
- protected MyTimer()
- {
- timeText.setEditable(false);
- timeText.setText("0分0秒");
- setVisible(true);
- timer = new Timer(1000,new TimerListener());
- }
- class TimerListener implements ActionListener//時間顯示監聽
- {
- public void actionPerformed(ActionEvent e)
- {
- usedTime++;
- timeText.setText(usedTime/60+"分"+usedTime%60+"秒"); //顯示所用時間,分秒
- }
- }
- }
效果圖片:
下載地址:http://down.51cto.com/data/318971#