24點遊戲的java實現

2021-08-29 13:32:14 字數 3860 閱讀 6402

1、計算方式的改變——引入分數計算概念

求24點涉及到除法,所以必須轉變直接計算的思路。經過一段時間的摸索,本人發現可以採用分數計算。任何兩個數的計算都可以轉換成對應的分數計算形式。

例如:3 / 8 可以轉換成 (3/1) / (8/1)

1.1 待計算數字的初始化

於是待計算的4個值必須先轉換成分數:

private int aarray = new int[2];

private int barray = new int[2];

private int carray = new int[2];

private int darray = new int[2];

當然,我們得初始化它們: 效果就是2->2/ 1

aarray[0] = a;

aarray[1] = 1;

barray[0] = b;

barray[1] = 1;

carray[0] = c;

carray[1] = 1;

darray[0] = d;

darray[1] = 1;

1.2 分數的計算

小學的時候就學過,分數的加減法用到最小公倍數和最大公約數。

/**

* 求最小公倍數

* * @param a

* @param b

* @return

*/public int leasecommonmultiple(int a, int b)

/*** 求最大公約數

* * @param a

* @param b

* @return

*/public int greatestcommondivisor(int a, int b)

if (0 == a)

if (0 == b)

if (a > b)

for (int c = a % b; c > 0; c = a % b)

return b;

}

對應的加減方法如下:

/**

* 加*/

public int plus(int a, int b) ;

} if (0 == b[1]) ;

} int denominator = leasecommonmultiple(a[1], b[1]);

return new int ;

} /**

* 減*

* @param a

* @param b

* @return

*/public int reduce(int a, int b) ;

} if (0 == b[1]) ;

} int denominator = leasecommonmultiple(a[1], b[1]);

return new int ;

}

相對來說,乘除方法就簡單多了:

/**

* 乘*

* @param a

* @param b

* @return

*/public int multiply(int a, int b) ;

} /**

* 除*

* @param a

* @param b

* @return

*/public int divide(int a, int b) ;

}

2、計算規則

2.1 演算法——窮舉法

24點的計算涉及到以下三種元素:

待計算的4個數、三個計算符號(加減乘除)、括號

本人採用的是窮舉法,進行乙個乙個數值和符號的嘗試——這樣的話,在迴圈中數值和符號都必須是動態的。

/**

* 動態載入符號數

* @param i

* @param a

* @param b

* @return

*/public int dispose(int i, int a, int b)else if(i == 1)else if(i == 2)else }

/*** 動態載入計算數

* @param i

* @param a

* @param b

* @param c

* @param d

* @return

*/public int number(int i, int a, int b, int c, int d)else if(i == 1)else if(i == 2)else if(i == 3)else;

} }

2.2 括號規則:

型別1:a(a(a(a,b),c),d)

型別2:a(a(a,a(b,c)),d)

型別3:a(a,a(b,a(c,d)))

型別4:a(a,a(a(b,c),d))

型別5:a(a(a,b),a(c,d))

注:a就是1個符號,a(a,b)就是指:a+b, a-b, a*b, a/b四種情況

2.3 數值與符號的窮舉

把每個數值和符號乙個進行嘗試:

i,j,k        :符號

m,n,o,p  :數值

for(int i = 0; i < 4; i++)}}

}}

}}

計算方法:

//型別1:a(a(a(a,b),c),d)

int result1 = dispose(k,dispose(j,dispose(i,number(m,a,b,c,d),number(n,a,b,c,d)),number(o,a,b,c,d)),number(p,a,b,c,d));

//型別2:a(a(a,a(b,c)),d)

int result2 = dispose(k,dispose(i,number(m,a,b,c,d),dispose(j,number(n,a,b,c,d),number(o,a,b,c,d))),number(p,a,b,c,d));

//型別3:a(a,a(b,a(c,d)))

int result3 = dispose(i,number(m,a,b,c,d),dispose(j,number(n,a,b,c,d),dispose(k,number(o,a,b,c,d),number(p,a,b,c,d))));

//型別4:a(a,a(a(b,c),d))

int result4 = dispose(i,number(m,a,b,c,d),dispose(k,dispose(j,number(n,a,b,c,d),number(o,a,b,c,d)),number(p,a,b,c,d)));

//型別5:a(a(a,b),a(c,d))

int result5 = dispose(j,dispose(i,number(m,a,b,c,d),number(n,a,b,c,d)),dispose(k,number(o,a,b,c,d),number(p,a,b,c,d)));

if (0 != result1[1]) }}

}if (0 != result2[1]) }}

}if (0 != result3[1]) }}

}if (0 != result4[1]) }}

}if (0 != result5[1]) }}

}

該程式目前存在的一些問題:

1)、存在括號多餘的情況——如:1 + (2 + (3 * 7))和((2 + 7) - 1) * 3

2)、結果列印耦合在核心計算方法中

Python實現24點遊戲

24點遊戲是經典的紙牌益智遊戲。我的思路是把這4個數分成2部分,前兩個數一起,後兩個數一起,先計算除前兩個數所有可能的結果和後兩個數所有可能的結果。最後將它們的結果互相計算,結果與24比較,如果等於24則成功。建立使用者類,整個遊戲的體系就是建立乙個使用者類來儲存使用者的資訊,如姓名,生命值,分數等...

Javascript實現24點遊戲

你有 4 張寫有 1 到 9 數字的牌。你需要判斷是否能通過 的運算得到 241.除法運算子 表示實數除法,而不是整數除法。例如 4 1 2 3 12 2.每個運算子對兩個數進行運算。特別是我們不能用 作為一元運算子。例如,1,1,1,1 作為輸入時,表示式 1 1 1 1 是不允許的 3.你不能將...

C 實現簡單24點遊戲

隨機生成4個代表撲克牌牌面的數字字母,程式自動列出所有可能算出24的表示式,用擅長的語言 c c j a或其他均可 實現程式解決問題。程式風格良好 使用自定義注釋模板 列出表示式無重複。以下為源 include include include include using namespace std ...