实现功能:
- 记录牌库中所有牌的rank(牌面)和suit(花色)
- 在牌库中对牌进行删减
- 统计剩余牌数
- 小功能部件
代码
牌库容器:
package circle;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class Last {
private static Map<Character, Set<Character>> lastCards = new HashMap<Character, Set<Character>>(13);
private static Set<Character> sa = new HashSet<Character>();
private static Set<Character> s2 = new HashSet<Character>();
private static Set<Character> s3 = new HashSet<Character>();
private static Set<Character> s4 = new HashSet<Character>();
private static Set<Character> s5 = new HashSet<Character>();
private static Set<Character> s6 = new HashSet<Character>();
private static Set<Character> s7 = new HashSet<Character>();
private static Set<Character> s8 = new HashSet<Character>();
private static Set<Character> s9 = new HashSet<Character>();
private static Set<Character> st = new HashSet<Character>();
private static Set<Character> sj = new HashSet<Character>();
private static Set<Character> sq = new HashSet<Character>();
private static Set<Character> sk = new HashSet<Character>();
private static int count = 52;
static {
sa.add('d');
sa.add('p');
sa.add('h');
sa.add('s');
s2.add('d');
s2.add('p');
s2.add('h');
s2.add('s');
s3.add('d');
s3.add('p');
s3.add('h');
s3.add('s');
s4.add('d');
s4.add('p');
s4.add('h');
s4.add('s');
s5.add('d');
s5.add('p');
s5.add('h');
s5.add('s');
s6.add('d');
s6.add('p');
s6.add('h');
s6.add('s');
s7.add('d');
s7.add('p');
s7.add('h');
s7.add('s');
s8.add('d');
s8.add('p');
s8.add('h');
s8.add('s');
s9.add('d');
s9.add('p');
s9.add('h');
s9.add('s');
st.add('d');
st.add('p');
st.add('h');
st.add('s');
sj.add('d');
sj.add('p');
sj.add('h');
sj.add('s');
sq.add('d');
sq.add('p');
sq.add('h');
sq.add('s');
sk.add('d');
sk.add('p');
sk.add('h');
sk.add('s');
}
{
lastCards.put('a', sa);
lastCards.put('2', s2);
lastCards.put('3', s3);
lastCards.put('4', s4);
lastCards.put('5', s5);
lastCards.put('6', s6);
lastCards.put('7', s7);
lastCards.put('8', s8);
lastCards.put('9', s9);
lastCards.put('t', st);
lastCards.put('j', sj);
lastCards.put('q', sq);
lastCards.put('k', sk);
}
public Map<Character, Set<Character>> getLastCards() {
return lastCards;
}
public int getLastCount() {
return count;
}
// 去掉已经出现过的牌
public void remove(Map<Character, Character> known) {
for (Character knownKey : known.keySet()) {
for (Character lastKey : lastCards.keySet()) {
if (knownKey.equals(lastKey)) {
Character c = lastKey;
Set<Character> set = lastCards.get(c);
for (Character lastValue : set) {
if (known.get(knownKey).equals(lastValue)) {
set.remove(lastValue);
lastCards.put(c, set);
count--;
}
}
}
}
}
}
//剩余同样rank的牌的个数
public int exist(Map<Character, Character> card) {
for (Character knownKey : card.keySet()) {
for (Character lastKey : lastCards.keySet()) {
if (knownKey.equals(lastKey)) {
Character c = lastKey;
Set<Character> set = lastCards.get(c);
return set.size() - 1;
}
}
}
return 0;
}
// 打印剩余牌
public void showLast() {
for (Character c : lastCards.keySet()) {
Set<Character> s = lastCards.get(c);
for (Character c_v : s) {
System.out.print(c);
System.out.print(c_v + ",");
}
System.out.println();
}
System.out.println();
}
}
功能组件
package circle;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Map;
import java.util.Set;
public class Choose {
Map<Character, Set<Character>> lastCards;
private static int lastCount;
private static int exist;
Choose(Last last, Map<Character, Character> card) {
this.lastCount = last.getLastCount();
this.lastCards = last.getLastCards();
this.exist = last.exist(card);
}
Choose() {
}
//下回合成对的概率
public BigDecimal probabilityTwo() {
return combination(1, exist).divide(combination(exist, lastCount), 10, RoundingMode.HALF_EVEN);
}
//下回合成三条的概率
public BigDecimal probabilityThree() {
return combination(2, exist).divide(combination(exist, lastCount), 10, RoundingMode.HALF_EVEN);
}
// 数学公式
/*
* 阶乘
*/
static BigDecimal factorial(long a, long b) {
if (a < b) {
BigDecimal num = new BigDecimal(1);
for (long i = a + 1; i <= b; i++) {
num = num.multiply(new BigDecimal(i));
}
return num;
} else {
BigDecimal num = new BigDecimal(1);
for (long i = b + 1; i <= a; i++) {
num = num.multiply(new BigDecimal(i));
}
return num;
}
}
/*
* 阶乘
*/
static BigDecimal factorial(long i) {
BigDecimal num = new BigDecimal(1);
for (; i > 0; i--) {
num = num.multiply(new BigDecimal(Long.valueOf(i)));
}
return num;
}
/*
* 组合
*/
static BigDecimal combination(int a, int b) {
return factorial(Integer.valueOf(b - a), Integer.valueOf(b)).divide(factorial(a));
}
}
实验方法
package circle;
import java.util.HashMap;
import java.util.Map;
public class HeadRoad {
public static void main(String[] args) {
Last l = new Last();
Map<Character, Character> m = new HashMap<Character, Character>();
Map<Character, Character> n = new HashMap<Character, Character>();
m.put('a', 'h');
m.put('k', 'h');
n.put('a', 'h');
l.showLast();
Choose c = new Choose(l, n);
System.out.println("剩余总牌数: " + l.getLastCount());
System.out.println("剩余" + n.keySet() + ": " + l.exist(n));
System.out.println("成对概率: " + c.probabilityTwo());
System.out.println("成三条概率: " + c.probabilityThree());
}
}
还没有来得及优化 , 便不得不终止了.
其实早就知道自己写了可能没什么用 , 但是忍不住还是写了 , 并且可以很欣喜的看到它的可行性 , 即使它是那么笨重 .
工作不到半个月, 目前心情很沮丧 , 并不是别人隐晦的说我写的东西是垃圾 , 而是明白了自己的无知 .
懂得越多,却觉得自己越无知.
2018年08月, 学习编程的第五个月.