程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 代碼分享:心算24小游戲(2)

代碼分享:心算24小游戲(2)

編輯:關於JAVA

Java代碼片段:

  1. //import Java.util.Random;
  2. /*
  3. * 檢查類,【本游戲的核心算法】
  4. * ①用於檢查隨機生成的4個1~10的隨機數能否通過運算得到24,
  5. * 如果不能則再次產生4個隨機數,
  6. * 直到產生能夠運算得到24的隨機數為止
  7. * ②檢查用戶輸入的表達式是否合法或運算結果是否正確
  8. */
  9. public class Check {
  10. protected String outputs=new String();
  11. /*
  12. * 返回隨機數全排列的方法,
  13. * 對產生的四個隨機數進行全排列,
  14. * 共有4*3*2*1=24種情況,
  15. * 考慮到運行效率,
  16. * 直接將各種情況羅列出來,
  17. * 沒有用遞歸全排列的方法,
  18. * 該方法通過形參i控制選取24種排列的第幾種,
  19. * 返回四個數的一維浮點型數組
  20. */
  21. private float[] number(float [] a,int i){
  22. final float[] Array = new float[4];
  23. switch(i){
  24. case 0 : Array[0]=a[0];Array[1]=a[1];Array[2]=a[2];Array[3]=a[3];break;
  25. case 1 : Array[0]=a[0];Array[1]=a[1];Array[2]=a[3];Array[3]=a[2];break;
  26. case 2 : Array[0]=a[0];Array[1]=a[2];Array[2]=a[1];Array[3]=a[3];break;
  27. case 3 : Array[0]=a[0];Array[1]=a[2];Array[2]=a[3];Array[3]=a[1];break;
  28. case 4 : Array[0]=a[0];Array[1]=a[3];Array[2]=a[2];Array[3]=a[1];break;
  29. case 5 : Array[0]=a[0];Array[1]=a[3];Array[2]=a[1];Array[3]=a[2];break;
  30. case 6 : Array[0]=a[1];Array[1]=a[0];Array[2]=a[2];Array[3]=a[3];break;
  31. case 7 : Array[0]=a[1];Array[1]=a[0];Array[2]=a[3];Array[3]=a[2];break;
  32. case 8 : Array[0]=a[1];Array[1]=a[2];Array[2]=a[0];Array[3]=a[3];break;
  33. case 9 : Array[0]=a[1];Array[1]=a[2];Array[2]=a[3];Array[3]=a[0];break;
  34. case 10: Array[0]=a[1];Array[1]=a[3];Array[2]=a[2];Array[3]=a[0];break;
  35. case 11: Array[0]=a[1];Array[1]=a[3];Array[2]=a[0];Array[3]=a[2];break;
  36. case 12: Array[0]=a[2];Array[1]=a[1];Array[2]=a[0];Array[3]=a[3];break;
  37. case 13: Array[0]=a[2];Array[1]=a[1];Array[2]=a[3];Array[3]=a[0];break;
  38. case 14: Array[0]=a[2];Array[1]=a[0];Array[2]=a[1];Array[3]=a[3];break;
  39. case 15: Array[0]=a[2];Array[1]=a[0];Array[2]=a[3];Array[3]=a[1];break;
  40. case 16: Array[0]=a[2];Array[1]=a[3];Array[2]=a[0];Array[3]=a[1];break;
  41. case 17: Array[0]=a[2];Array[1]=a[3];Array[2]=a[1];Array[3]=a[0];break;
  42. case 18: Array[0]=a[3];Array[1]=a[1];Array[2]=a[2];Array[3]=a[0];break;
  43. case 19: Array[0]=a[3];Array[1]=a[1];Array[2]=a[0];Array[3]=a[2];break;
  44. case 20: Array[0]=a[3];Array[1]=a[2];Array[2]=a[1];Array[3]=a[0];break;
  45. case 21: Array[0]=a[3];Array[1]=a[2];Array[2]=a[0];Array[3]=a[1];break;
  46. case 22: Array[0]=a[3];Array[1]=a[0];Array[2]=a[2];Array[3]=a[1];break;
  47. case 23: Array[0]=a[3];Array[1]=a[0];Array[2]=a[1];Array[3]=a[2];break;
  48. }
  49. return Array ;
  50. }
  51. /*
  52. * 返回運算符排列的方法,
  53. * 四個數進行運算時需要三個運算符,
  54. * 三個運算符的所有可能的排列是4^3=64種,
  55. * 該方法直接返回64種運算符,
  56. * 保存在二維字符型數組
  57. */
  58. private char [][]Calculate(){
  59. final char [][] Char=new char [64][3];//返回的運算符數組
  60. final int [][] ar=new int [64][3];//控制返回三個運算符
  61. int t=0;
  62. stop:for(int i=0;i<4;i++){
  63. for(int j=0;j<4;j++){
  64. for(int k=0;k<4;k++){
  65. ar[t][0]=i;
  66. ar[t][1]=j;
  67. ar[t][2]=k;
  68. for(int l=0;l<3;l++){//i,j,k的范圍都是0~3,通過switch,將0~3分別映射為+,—,*,/
  69. switch(ar[t][l]){
  70. case 0:Char[t][l]='+';break;
  71. case 1:Char[t][l]='-';break;
  72. case 2:Char[t][l]='*';break;
  73. case 3:Char[t][l]='/';break;
  74. }
  75. }
  76. t++;
  77. if(t==64)
  78. break stop; //通過t的自增控制循環的結束
  79. }
  80. }
  81. }
  82. return Char;
  83. }
  84. /*
  85. * 返回計算結果的方法,
  86. * 對兩個隨機數進行運算
  87. */
  88. private float Run(float a,float b,char c){
  89. float sum=0f;
  90. switch(c){
  91. case '+': sum=a+b;break; //將'+'字符轉換成加法運算
  92. case '-': sum=a-b;break; //將'-'字符轉換成減法運算
  93. case '*': sum=a*b;break; //將'*'字符轉換成乘法運算
  94. case '/': sum=a/b;break; //將'/'字符轉換成除法運算
  95. }
  96. return sum;
  97. }
  98. /*
  99. * check方法
  100. * 如果可以運算得到24,
  101. * 返回true,
  102. * 否則返回false
  103. * 為了節省運行時間,
  104. * 運算時,
  105. * 只要某一次運算結果是24就直接返回true
  106. * 只有產生的隨機數不能運算得到24時才會運行所有情況
  107. */
  108. protected boolean check(float[] myStatus){
  109. float num[]=new float [4];
  110. char [][] allcha=new char [64][3];
  111. allcha=Calculate();
  112. for(int i=0;i<24;i++){
  113. for(int j=0;j<64;j++){
  114. float x;
  115. num=number(myStatus,i);
  116. /*
  117. * 注釋解析:
  118. * ABCD表示四個參與運算的隨機數
  119. * ①②③表示運算順序
  120. */
  121. x=Run(Run(Run(num[0],num[1],allcha[j][0]),num[2],allcha[j][1]),num[3],allcha[j][2]);
  122. if(x==24.0f){
  123. //System.out.println("(("+num[0]+allcha[j][0]+num[1]+")"+allcha[j][1]+num[2]+")"+allcha[j][2]+num[3]);
  124. outputs="(("+(int)num[0]+allcha[j][0]+(int)num[1]+")"+allcha[j][1]+(int)num[2]+")"+allcha[j][2]+(int)num[3];
  125. System.out.println(outputs);
  126. return true;
  127. }
  128. // 以上運算類型為:((A①B)②C)③D
  129. x=Run(Run(num[0],num[1],allcha[j][0]),Run(num[2],num[3],allcha[j][2]),allcha[j][1]);
  130. if(x==24.0f){
  131. //System.out.println("("+num[0]+allcha[j][0]+num[1]+")"+allcha[j][1]+"("+num[2]+allcha[j][2]+num[3]+")");
  132. outputs="("+(int)num[0]+allcha[j][0]+(int)num[1]+")"+allcha[j][1]+"("+(int)num[2]+allcha[j][2]+(int)num[3]+")";
  133. System.out.println(outputs);
  134. return true;
  135. }
  136. //以上運算類型為:(A①B)②(C①D)
  137. x=Run(Run(num[0],Run(num[1],num[2],allcha[j][1]),allcha[j][0]),num[3],allcha[j][2]);
  138. if(x==24.0f){
  139. //System.out.println("("+num[0]+allcha[j][0]+"("+num[1]+allcha[j][1]+num[2]+"))"+allcha[j][2]+num[3]);
  140. outputs="("+(int)num[0]+allcha[j][0]+"("+(int)num[1]+allcha[j][1]+(int)num[2]+"))"+allcha[j][2]+(int)num[3];
  141. System.out.println(outputs);
  142. return true;
  143. }
  144. //以上運算類型為:(A②(B①C))③D
  145. x=Run(num[0],Run(Run(num[1],num[2],allcha[j][1]),num[3],allcha[j][2]),allcha[j][0]);
  146. if(x==24.0f){
  147. //System.out.println(num[0]+""+allcha[j][0]+"(("+num[1]+allcha[j][1]+num[2]+")"+allcha[j][2]+num[3]+")");
  148. outputs=(int)num[0]+""+allcha[j][0]+"(("+(int)num[1]+allcha[j][1]+(int)num[2]+")"+allcha[j][2]+(int)num[3]+")";
  149. System.out.println(outputs);
  150. return true;
  151. }
  152. //以上運算類型為:A③((B①C)②D)
  153. x=Run(num[0],Run(num[1],Run(num[2],num[3],allcha[j][2]),allcha[j][1]),allcha[j][0]);
  154. if(x==24.0f){
  155. //System.out.println(num[0]+""+allcha[j][0]+"("+num[1]+allcha[j][1]+"("+num[2]+allcha[j][2]+num[3]+"))");
  156. outputs=(int)num[0]+""+allcha[j][0]+"("+(int)num[1]+allcha[j][1]+"("+(int)num[2]+allcha[j][2]+(int)num[3]+"))";
  157. System.out.println(outputs);
  158. return true;
  159. }
  160. //以上運算類型為:A③(B②(C①D))
  161. }
  162. }
  163. return false;
  164. }
  165. /*
  166. * 把字符串的數學表達式計算出結果
  167. */
  168. protected float string_float(String s0){
  169. char s[]=new char[s0.length()];
  170. float sum=0;//計算結果
  171. float num[]={-1,-1,-1,-1}; //記錄數學表達式中的數
  172. int calculate_location[]={-1,-1,-1};
  173. char calculate[]={'a','a','a'};//記錄數學表達式中的運算符
  174. int calculate_priority[]={3,2,1};//設置優先級
  175. int abc;
  176. for(int i=0;i<s.length;i++)
  177. s[i]=s0.charAt(i);
  178. for(int i=0,j=0,l=0;i<s.length;i++){//分析字符串
  179. if(s[i]>='0'&&s[i]<='9')
  180. {//得到數學表達式中的數
  181. num[j]=s[i]-48;
  182. if(i+1<s.length)
  183. if(s[i+1]>='0'&&s[i+1]<='9')
  184. {
  185. num[j]=num[j]*10+s[i+1]-48;
  186. i++;
  187. }
  188. j++;
  189. continue;
  190. }
  191. if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/')//得到表達式中的運算符
  192. if(calculate_location[l]==-1)
  193. {
  194. calculate_location[l]=i;
  195. calculate[l]=s[i];
  196. l++;
  197. }
  198. }
  199. for(int i=0,i0=0,j=0;i<s.length;i++)
  200. {//分析表達式的運算優先級
  201. if(s[i]==')')
  202. {// 先算括號裡的表達式
  203. for(i0=i;s[i0]!='(';i0--)
  204. if(s[i0]=='+'||s[i0]=='-'||s[i0]=='*'||s[i0]=='/')
  205. for(j=0;j<3;j++)
  206. if(calculate_location[j]==i0)
  207. calculate_priority[j]+=8;
  208. s[i0]='s';
  209. }
  210. if(s[i]=='*'||s[i]=='/')//再算乘除
  211. for(j=0;j<3;j++)
  212. if(calculate_location[j]==i)
  213. calculate_priority[j]+=4;
  214. }
  215. /*
  216. * 此處的if是把剛才分析的運算優先級用一個int的變量abc記錄下來,如123則表示第三個運算符
  217. * 運算級最高,其實是第二個,最後是第一個
  218. */
  219. if(calculate_priority[0]>calculate_priority[1])
  220. {
  221. if(calculate_priority[0]>calculate_priority[2])
  222. calculate_priority[0]=-1;
  223. else
  224. calculate_priority[2]=-1;
  225. }
  226. else
  227. {
  228. if(calculate_priority[1]>calculate_priority[2])
  229. calculate_priority[1]=-1;
  230. else
  231. calculate_priority[2]=-1;
  232. }
  233. if(calculate_priority[0]<0)
  234. {
  235. if(calculate_priority[1]>calculate_priority[2])
  236. {
  237. calculate_priority[1]=-2;
  238. calculate_priority[2]=-3;
  239. }
  240. else
  241. {
  242. calculate_priority[1]=-3;
  243. calculate_priority[2]=-2;
  244. }
  245. }
  246. else
  247. {
  248. if(calculate_priority[1]<0)
  249. {
  250. if(calculate_priority[0]>calculate_priority[2])
  251. {
  252. calculate_priority[0]=-2;
  253. calculate_priority[2]=-3;
  254. }
  255. else
  256. {
  257. calculate_priority[0]=-3;
  258. calculate_priority[2]=-2;
  259. }
  260. }
  261. else
  262. {
  263. if(calculate_priority[0]>calculate_priority[1])
  264. {
  265. calculate_priority[0]=-2;
  266. calculate_priority[1]=-3;
  267. }
  268. else
  269. {
  270. calculate_priority[0]=-3;
  271. calculate_priority[1]=-2;
  272. }
  273. }
  274. }
  275. abc=calculate_priority[0]*100+calculate_priority[1]*10+calculate_priority[2];
  276. abc=-abc;
  277. //根據剛才分析的運算級,計算出結果,保存在sum裡面
  278. switch(abc){
  279. case 123:sum=Run(Run(Run(num[0],num[1],calculate[0]),num[2],calculate[1]),num[3],calculate[2]);break;
  280. case 132:sum=Run(Run(num[0],num[1],calculate[0]),Run(num[2],num[3],calculate[2]),calculate[1]);break;
  281. case 213:sum=Run(Run(num[0],Run(num[1],num[2],calculate[1]),calculate[0]),num[3],calculate[2]);break;
  282. case 231:sum=Run(Run(num[0],num[1],calculate[0]),Run(num[2],num[3],calculate[2]),calculate[1]);break;
  283. case 312:sum=Run(num[0],Run(Run(num[1],num[2],calculate[1]),num[3],calculate[2]),calculate[0]);break;
  284. case 321:sum=Run(num[0],Run(num[1],Run(num[2],num[3],calculate[2]),calculate[1]),calculate[0]);break;
  285. }
  286. return sum;//返回結果
  287. }
  288. //測試區
  289. /* public static void main(String[]args){
  290. Check c=new Check();
  291. Float [] test=new Float [4];
  292. Random ran=new Random();
  293. for(int i=0;i<4;i++)
  294. test[i]=(float) ((int)(ran.nextFloat()*10+1));
  295. //c.check(test);
  296. System.out.println(test[0]+" "+test[1]+" "+test[2]+" "+test[3]+" "+c.check(test));
  297. test[0]=5.0f;
  298. test[1]=10.0f;
  299. test[2]=2.0f;
  300. test[3]=10.0f;
  301. //c.check(test);
  302. System.out.println(test[0]+" "+test[1]+" "+test[2]+" "+test[3]+" "+c.check(test));
  303. }*/
  304. }

Java代碼片段:

  1. import Java.awt.BorderLayout;
  2. import Java.awt.event.ActionEvent;
  3. import Java.awt.event.ActionListener;
  4. import Javax.swing.JButton;
  5. import Javax.swing.JFrame;
  6. import Javax.swing.JLabel;
  7. import Javax.swing.JPanel;
  8. @SuppressWarnings("serial")
  9. public class MasgDlg extends JFrame implements ActionListener {
  10. Calculate24 bp=new Calculate24();
  11. protected MasgDlg( Calculate24 btp,String strMsg){
  12. this.setTitle("提示窗口");
  13. bp=btp;
  14. JPanel textp=new JPanel();
  15. JPanel btnp=new JPanel();
  16. JLabel label=new JLabel();
  17. this.setLayout(new BorderLayout());
  18. this.add(textp,BorderLayout.NORTH);
  19. this.add(btnp,BorderLayout.SOUTH);
  20. textp.add(label,BorderLayout.CENTER);
  21. label.setText(strMsg);
  22. this.setSize(580,100);
  23. this.setLocation(400,300);
  24. JButton btnOk=new JButton("確定");
  25. JButton btnquit=new JButton("退出");
  26. btnOk.setActionCommand("restart");
  27. btnOk.addActionListener(this);
  28. btnquit.setActionCommand("quit");
  29. btnquit.addActionListener(this);
  30. btnp.add(btnOk);
  31. btnp.add(btnquit);
  32. this.setVisible(true);//顯示對話框
  33. this.setAlwaysOnTop(true);
  34. bp.btnStart.setEnabled(false);
  35. }
  36. public void actionPerformed(ActionEvent e) {
  37. if(e.getActionCommand().equals("restart")){
  38. this.dispose();
  39. bp.btnStart.setEnabled(true);
  40. }
  41. else if(e.getActionCommand().equals("quit")){
  42. System.exit(0);
  43. //隱藏對話框
  44. }
  45. }
  46. //測試區
  47. /*public static void main(String []args){
  48. new MsgDlg("歡迎再次使用");
  49. }*/
  50. }

Java代碼片段:

  1. import Java.awt.BorderLayout;
  2. import Java.awt.event.ActionEvent;
  3. import Java.awt.event.ActionListener;
  4. import Javax.swing.JButton;
  5. import Javax.swing.JFrame;
  6. import Javax.swing.JLabel;
  7. import Javax.swing.JPanel;
  8. @SuppressWarnings("serial")
  9. public class MsgDlg extends JFrame implements ActionListener {
  10. Calculate24 tempCal24;
  11. protected MsgDlg(String strMsg,Calculate24 Cal24){
  12. //super();
  13. this.setTitle("提示窗口");
  14. JPanel textp=new JPanel();
  15. JPanel btnp=new JPanel();
  16. JLabel label=new JLabel();
  17. this.setLayout(new BorderLayout());
  18. this.add(textp,BorderLayout.NORTH);
  19. this.add(btnp,BorderLayout.SOUTH);
  20. textp.add(label,BorderLayout.CENTER);
  21. label.setText(strMsg);
  22. this.setSize(580,100);
  23. this.setLocation(400,300);
  24. JButton btnOk=new JButton("確定");
  25. tempCal24=Cal24;
  26. btnOk.addActionListener(this);
  27. btnp.add(btnOk);
  28. this.toFront();
  29. tempCal24.btnOk.setEnabled(false);//使確定按鈕不可用
  30. this.setVisible(true);//顯示對話框
  31. }
  32. public void actionPerformed(ActionEvent e) {
  33. this.dispose();//隱藏對話框
  34. tempCal24.btnOk.setEnabled(true);//激活確定按鈕
  35. }
  36. //測試區
  37. /*public static void main(String []args){
  38. new MsgDlg("歡迎再次使用");
  39. }*/
  40. }

Java代碼片段:

  1. import Javax.swing.*;
  2. import Java.awt.event.*;
  3. /*
  4. * 時間顯示類
  5. */
  6. @SuppressWarnings("serial")
  7. public class MyTimer extends JPanel
  8. {
  9. protected int usedTime = 0;//定義初始時間為0
  10. public Timer timer;
  11. public JLabel usedTimeLabel = new JLabel("用時:");
  12. public JTextFIEld timeText = new JTextFIEld(5);
  13. protected MyTimer()
  14. {
  15. timeText.setEditable(false);
  16. timeText.setText("0分0秒");
  17. setVisible(true);
  18. timer = new Timer(1000,new TimerListener());
  19. }
  20. class TimerListener implements ActionListener//時間顯示監聽
  21. {
  22. public void actionPerformed(ActionEvent e)
  23. {
  24. usedTime++;
  25. timeText.setText(usedTime/60+"分"+usedTime%60+"秒"); //顯示所用時間,分秒
  26. }
  27. }
  28. }

效果圖片:

下載地址:http://down.51cto.com/data/318971#

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved