国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - java實現24點游戲

java實現24點游戲

2021-07-12 15:10m_target Java教程

每次取出4張牌,使用加減乘除,第一個能得出24者為贏,這篇文章主要就為大家詳細介紹了java實現24點游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下

游戲規則

從撲克中每次取出4張牌。使用加減乘除,第一個能得出24者為贏。(其中,j代表11,q代表12,k代表13,a代表1),按照要求編程解決24點游戲。

基本要求

  • 隨機生成4個代表撲克牌牌面的數字字母,程序自動列出所有可能算出24的表達式
  • 列出表達式無重復
  • 用戶初始生命值為一給定值(比如3),初始分數為0。隨機生成4個代表撲克牌牌面的數字或字母,由用戶輸入包含這4個數字或字母的運算表達式(可包含括號),如果表達式計算結果為24則代表用戶贏了此局。
  • 使用計時器要求用戶在規定時間內輸入表達式,如果規定時間內運算正確則加分,超時或運算錯誤則進入下一題并減少生命值(不扣分)。
  • 所有成績均可記錄在toplist.txt文件中。

解表達式基本思路

采用窮舉法列舉每一種存在的可能,接著判斷是否值為24,如果等于24,則將表達式存入set集合,最終遍歷set集合即可得到所有表達式。具體思路如下:

1.采用隨機數生成4個符合要求的數據,假設四個數據為n1,n2,n3,n4 。
2.把數據相互組合可以得到如下組合:n1和n2 ,n1和n3,n1和n4,n2和n3,n2和n4,n3和n4
3.將上面的組合進行各種可能的運算例如:n1+n2,n1-n2,n2-n1,n1*n2,n1/n2,n2/n1等等。
4.把上面組合計算出來的結果存入進對應的數組中例如:組合相加的結果存入add數組,相減的結果存入sub數組……最終將這些數組存入一個list集合中,目的是為了方便通過循環遍歷出每一種組合。
5.通過循環去遍歷每一種組合,把這些組合在一起進行相加,相減等運算,記錄結果為24的表達式。在這里需要注意的是,因為數組得值為兩個數字的運算結果,所以需要根據當前循環變量的值和list集合以及數組存入數據的順序去把表達式格式化成四個數字組成的表達式,否則表達式只有兩個數字。

  • 需要注意的是:在遍歷集合的過程中,由于集合中存入的數組的數據為兩個數據組合的形式,所以遍歷是只需要控制好下標,使的每一個表達式中只有n1,n2,n3,n4這四個數據,而不會出現類似于n1,n2,n1,n3 這種組合的方式。
  • 具體的流程圖入下圖所示:

java實現24點游戲

玩家運算基本思路

在java中使用timer和canender即可實現定時的功能,而判斷表達式是否正確,在java中使用script引擎調用eval方法即可判斷表達式的值是否正確,具體思路如下:

1.初始化生命值,和分數
2.由系統給出四個數字
3.玩家給出答案
4.判斷給出的答案中的數字和系統給出的數字是否吻合,如果吻合進入5,否則,生命值減一。
5.借助timer類的schedule()判斷是否超時,如果沒有超時,進入6,否則,生命值減一。
6.借助script引擎的eval()方法可以判斷表達式是否正確,如果正確,分數加一,否則,生命值減一。
當生命值大于0時執行2,3,4,5,6操做,否則將當前分數寫入文件。

流程圖如下圖所示

java實現24點游戲

編碼

game類,主要實現由系統隨機生成數據,并計算可能的表達式

為了避免除零異常采用了float類型的數組進行存儲

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
import java.io.ioexception;
import java.util.arraylist;
import java.util.hashset;
import java.util.list;
import java.util.random;
import java.util.scanner;
import java.util.set;
 
/**
 *
 * title: test description: 1. 采用隨機數生成4個符合要求的數據,假設四個數據為n1,n2,n3,n4 。
 * 2.把數據相互組合可以得到如下組合:n1和n2 ,n1和n3,n1和n4,n2和n3,n2和n4。
 * 3.將上面的組合進行各種可能的運算例如:n1+n2,n1-n2,n2-n1,n1*n2,n1/n2,n2/n1等等。
 * 4.把上面組合計算出來的結果存入進對應的數組中例如:組合相加的結果存入add數組,相減的結果存入sub數組……最終將這些數組存入一個list集合中,目的是為了方便通過循環遍歷出每一種組合。
 * 5.通過循環去遍歷每一種組合,把這些組合在一起進行相加,相減等運算,記錄結果為24的表達式
 * @author jianglei
 */
public class game {
 static set<string> set = new hashset<string>();// 使用set存儲算式表達式可以避免有重復的結果
 float[] data = new float[4];// 存放數據的集合
 float[] add = new float[6];// 存放組合相加的結果的集合
 float[] sub1 = new float[6];// 存放相減的結果(兩個數相減的結果存在兩種可能)
 float[] sub2 = new float[6];// 存放相減的結果
 float[] mul = new float[6];// 存放相乘
 float[] div1 = new float[6];// 存放相除(兩個數相除的結果存在兩種可能)
 float[] div2 = new float[6];// 存放相除
 list<float[]> list = new arraylist<float[]>();// 存放組合結果運算的集合
 
 /**
 *
 * title: combine
 * </p>
 * description: 該方法用來獲取每兩個數字的組合組合, 用1代表第一個數字,2代表第二個數字....共有六種組合方式,分別如下:
 * 1和2,1和3,1和 4,2和 3,2和 4,3和 4 在上面的組合中,每一種組合都對應著 加減乘除 這四種運算
 * 將上述的組合的每種計算結果存入上面聲明的集合
 */
 public void conbine(float n1, float n2, float n3, float n4) {
 add[0] = n1 + n2;
 add[1] = n1 + n3;
 add[2] = n1 + n4;
 add[3] = n2 + n3;
 add[4] = n2 + n4;
 add[5] = n3 + n4;
 
 sub1[0] = n1 - n2;
 sub1[1] = n1 - n3;
 sub1[2] = n1 - n4;
 sub1[3] = n2 - n3;
 sub1[4] = n2 - n4;
 sub1[5] = n3 - n4;
 sub1[5] = n3 + n4;
 
 sub2[0] = n2 - n1;
 sub2[1] = n3 - n1;
 sub2[2] = n4 - n1;
 sub2[3] = n3 - n2;
 sub2[4] = n4 - n2;
 sub2[5] = n4 - n3;
 
 mul[0] = n2 * n1;
 mul[1] = n3 * n1;
 mul[2] = n4 * n1;
 mul[3] = n3 * n2;
 mul[4] = n4 * n2;
 mul[5] = n4 * n3;
 
 div1[0] = n1 / n2;
 div1[1] = n1 / n3;
 div1[2] = n1 / n4;
 div1[3] = n2 / n3;
 div1[4] = n2 / n4;
 div1[5] = n3 / n4;
 
 div2[0] = n2 / n1;
 div2[1] = n3 / n1;
 div2[2] = n4 / n1;
 div2[3] = n3 / n2;
 div2[4] = n4 / n2;
 div2[5] = n4 / n3;
 
 list.add(add);// 把各種組合加入到list集合中,方便通過循環來遍歷每一種組合方式
 list.add(sub1);
 list.add(sub2);
 list.add(mul);
 list.add(div1);
 list.add(div2);
 }
 
 public void getdata() {
 random r = new random();
 // 獲取1——13的的數字的集合
 data[0] = r.nextint(12) + 1;
 data[1] = r.nextint(12) + 1;
 data[2] = r.nextint(12) + 1;
 data[3] = r.nextint(12) + 1;
 system.out.print("四個數字為:");
 for (float f : data)
 switch ((int) f) {// 將11,12,13,1變成j,q,k,a
 case 1:
 system.out.print("a" + " ");
 break;
 case 11:
 system.out.print("j" + " ");
 break;
 case 12:
 system.out.print("o" + " ");
 break;
 case 13:
 system.out.print("k" + " ");
 break;
 default:
 system.out.print((int) f + " ");
 break;
 }
 system.out.println();
 boolean flag = false;// 通過該變量去判斷是否存在表達式
 conbine(data[0], data[1], data[2], data[3]);
 for (int a = 0; a < 3; a++) {// 有種組合方式,分別遍歷每一種組合方法
 for (int b = 0; b < 6; b++) {// 窮舉每一個組合和他們之間的運算
 for (int c = 0; c < 6; c++) {// 判斷每一種組合的每一種運算結果是否等于24
 if ((list.get(b)[a] + list.get(c)[5 - a]) == 24) {
 dataformat.judge(a, b, c, data, "+", set);
 flag = true;
 }
 // 減法
 if ((list.get(b)[a] - list.get(c)[5 - a]) == 24) {
 dataformat.judge(a, b, c, data, "-", set);
 }
 if ((list.get(b)[5 - a] - list.get(c)[a]) == 24) {
 dataformat.judge(a, b, c, data, "-", set);
 flag = true;
 }
 // 乘法
 if ((list.get(b)[a] * list.get(c)[5 - a]) == 24) {
 dataformat.judge(a, b, c, data, "*", set);
 flag = true;
 }
 // 除法
 if ((list.get(b)[a] / list.get(c)[5 - a]) == 24) {
 dataformat.judge(a, b, c, data, "/", set);
 flag = true;
 }
 if ((list.get(b)[5 - a] / list.get(c)[a]) == 24) {
 dataformat.judge(a, b, c, data, "/", set);
 flag = true;
 }
 }
 }
 }
 if (!flag)
 system.out.println("沒有表達式滿足條件");
 }

autogame類主要實現由系統給定數值,用戶輸入表達式來根據結過進行計分,并將分數寫入文件

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
import java.io.bufferedoutputstream;
import java.io.fileoutputstream;
import java.io.ioexception;
import java.util.calendar;
import java.util.date;
import java.util.random;
import java.util.scanner;
import java.util.timer;
import java.util.timertask;
 
import javax.script.scriptengine;
import javax.script.scriptenginemanager;
import javax.script.scriptexception;
 
public class autogame {
 static boolean flag = true;//該變量標識是否超時
 static int life = 3;//初始化生命值
 static int score=0;//初始化分數
 
 /**
 *開始游戲的方法,該方法通過當前生命值判斷是否結束
 */
 public void start() throws ioexception {
 calendar date = calendar.getinstance();//實例化calendar對象
 while(life>0) {//當生命值大于0才會進行
 flag=true;//初始化分數標記
 date.settime(new date());
 date.add(calendar.second, 20);//設置限定時間
 timer timer = new timer();
 //當達到限定時間將會執行run()方法,即把全局變量flag變為false
 timer.schedule(new remindtask(), date.gettime());
 int answer = answer();
 switch(answer) {
 case -1:
 system.out.println("表達式錯誤!! 當前生命值為"+life+" 分數為:"+score);
 break;
 case -2:
 system.out.println("輸入超時!! 當前生命值為"+life+" 分數為:"+score);
 break;
 case -3:
 system.out.println("結果錯誤!! 當前生命值為"+life+" 分數為:"+score);
 break;
 case 1:
 system.out.println("正確,得到1分獎勵!! 當前生命值為"+life+" 分數為:"+score);
 break;
 }
 system.out.println("----------");
 }
 system.out.println("游戲結束……分數為: "+score);//循環結束也就是生命值為0,打印游戲結束
 savescore(score);//將玩家當前分數存入文件
 return;
 }
/**
 *
 * title: getdata</p>
 * description:給定任意的數據
 * @return
 */
 private float[] getdata() {
 float[] data = new float[4];
 random r = new random();//隨機生成四個數據存入數組中
 data[0] = r.nextint(12) + 1;
 data[1] = r.nextint(12) + 1;
 data[2] = r.nextint(12) + 1;
 data[3] = r.nextint(12) + 1;
 system.out.print("四個數字為:");
 for (float f : data)
 switch ((int) f) {
 case 1:
 system.out.print("a" + " ");
 break;
 case 11:
 system.out.print("j" + " ");
 break;
 case 12:
 system.out.print("o" + " ");
 break;
 case 13:
 system.out.print("k" + " ");
 break;
 default:
 system.out.print((int) f + " ");
 break;
 }
 system.out.println("請開始作答,時間20秒");
 return data;
 }
 
 /**
 *
 * title: answer</p>
 * description:根據用戶輸入返回false或true
 * 1.輸入不含給定值,返回false
 * 2.輸入超時,返回false
 * 3.輸入表達式的值不為24,返回false
 * 否則,返回true
 * @return -1代表輸入的表達式與系統給出的數字不吻合
 * @return -2代表用戶計算結果超時
 * @return -3代表結果錯誤
 * @return 1代表用戶計算正確
 */
 public int answer() {
 scanner sc = new scanner(system.in);
 float[] data = getdata();//獲取給定的數據
 //獲取script引擎,調用eval()方法來判斷表達式是否正確
 scriptenginemanager scriptenginemanager = new scriptenginemanager();
 scriptengine scriptengine = scriptenginemanager.getenginebyname("nashorn");
 string exper = sc.next();
 try {
 string res = string.valueof(scriptengine.eval(exper));
 for (int i = 0; i < data.length; i++)
 if (!exper.contains(data[i] + "")) {//輸入的表達式不含給定的值
 life--;
 return -1;
 }
 if(!flag) {//判斷超時
 life--;
 return -2;
 }
 if (res.equals("24")) {//回答正確并且沒有超時
 score++;//分數加一
 return 1;
 }
 life--;
 } catch (scriptexception e) {
 system.out.println("表達式輸入不合法");
 }
 return -3;
 
 }
 /**
 * title: savescore</p>
 * description: 該方法表示將玩家當前分數存入toplist.txt文件
 * @param score 需要存入的分數
 * @throws ioexception
 */
 public static void savescore(int score) throws ioexception {
 fileoutputstream fos = new fileoutputstream("e:/toplist.txt");
 bufferedoutputstream bos = new bufferedoutputstream(fos);
 bos.write((score+"").getbytes());//把分數寫入文件
 bos.close();
 
 }
 public static void main(string[] args) throws ioexception {
 savescore(1);
 }
}
/**
 *
* title: remindtask
* description:該timertask并且重寫run()可以實現在指定的定時時間執行run方法的內容
* @author jianglei
 */
class remindtask extends timertask {
 
 @override
 public void run() {
 autogame.flag = false;//當超時會把全局變量flag變為false
 }
 
}

dataformat類根據a b c是三個循環變量將兩個組合數字的運算格式化成四個數字的表達式

由于代碼比較長,在這里只留一種情況的,其余的情況與它類似

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.util.set;
/**
 *
* title: getfoamat
* description: 該類通過在循環中的a b c的值判斷出當前所參與運算的值與參加運算的符號,假設四個值為n0,n1,n2,n3
* 形參 a、b、c為循環變量,形參n數組為參與運算的四個數字,形參op表示當前進行的運算類型,形參set為存儲結果的容器
 
 */
public class dataformat {
 public static void judge(int a,int b,int c,float[]n,string op,set<string> set) {
 stringbuilder sb = new stringbuilder();
 if(a==0) {//n0和n1 與n2和n3之間的運算
 if(b==0) {//n0+n1
 if(c==0) {//n2+n3
 sb.append("(").append(n[0]).append("+").append(n[1]).append(")").append(op).append("(").append(n[2]).append("+").append(n[3]).append(")").append("=24");
 }if(c==1) {//n2-n3
 sb.append("(").append(n[0]).append("+").append(n[1]).append(")").append(op).append("(").append(n[2]).append("-").append(n[3]).append(")").append("=24");
 }if(c==2) {//n3-n2
 sb.append("(").append(n[0]).append("+").append(n[1]).append(")").append(op).append("(").append(n[3]).append("-").append(n[2]).append(")").append("=24");
 }if(c==3) {// n2*n3
 sb.append("(").append(n[0]).append("+").append(n[1]).append(")").append(op).append("(").append(n[2]).append("*").append(n[3]).append(")").append("=24");
 }if(c==4) {// n2/n3
 sb.append("(").append(n[0]).append("+").append(n[1]).append(")").append(op).append("(").append(n[2]).append("/").append(n[3]).append(")").append("=24");
 }if(c==5) {// n3/n2
 sb.append("(").append(n[0]).append("+").append(n[1]).append(")").append(op).append("(").append(n[3]).append("/").append(n[2]).append(")").append("=24");
 }
 //將運算表達式存入容器
 set.add(sb.tostring());
 //將sb清空
 sb = new stringbuilder();
 }if(b==1) {//n0-n1
 //由于這種代碼篇幅比較長,在這里省略了,思路和上面的一致
 }

測試

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.io.ioexception;
import java.util.scanner;
 
public class test {
 public static void main(string[] args) throws ioexception {
 scanner sc = new scanner(system.in);
 game t = new game();
 system.out.println("----------");
 system.out.println("1.隨機生成數判斷");
 system.out.println("2.用戶輸入運算式");
 system.out.println("請選擇");
 char op = sc.next().charat(0);
 switch (op) {
 case '1':
 t.getdata();
 for (string str : t.set) {
 system.out.println(str.replaceall(".0", ""));
 }
 break;
 case '2':
 autogame a = new autogame();
 a.start();
 break;
 default:
 system.out.println("輸入錯誤");
 }
 }
}

運行結果

java實現24點游戲

java實現24點游戲

java實現24點游戲

以下用戶輸入表達式的運行結果

測試過程中在該情況下的測試數據是由自己給出的為1 1 12 12這四個數字

java實現24點游戲

分數存入文件

java實現24點游戲

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/m_target/article/details/82909256

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: av中文字幕在线观看 | 久久综合久久88 | 一区二区三区高清视频在线观看 | 亚洲久久久久 | 白浆在线 | 一级视频免费观看 | 成人av一区二区亚洲精 | 久久尤物免费一区二区三区 | 成人午夜在线 | 国产精品久久久久久久午夜片 | 久操视频免费在线观看 | 久久懂色精品99综一区合 | 中文字幕1区 | 亚洲综合色自拍一区 | 伊人色私人影院蜜桃va | 欧美视频在线播放 | 精品成人影院 | 天堂av中文字幕 | 中文字幕一区在线观看视频 | 亚洲精品男人的天堂 | 精品亚洲一区二区 | 日本在线小视频 | 国产精选一区二区三区不卡催乳 | 日韩中文字幕在线观看 | 欧美一级一区 | 亚洲视频在线观看免费 | 亚洲精品视频在线播放 | 成年免费视频黄网站在线观看 | 欧美成在线视频 | 欧美aaa级 | 国产欧美综合一区二区三区 | 日韩精品免费在线观看 | 91免费版在线观看 | 亚洲 成人 av | 九九99 | 国产精品国产三级国产aⅴ中文 | 仙人掌旅馆在线观看 | 超碰人人操 | 91精品国产综合久久小仙女陆萱萱 | 毛片久久久 | 午夜看片|