扑克牌存储容器以及一些功能算法

实现功能:

  1. 记录牌库中所有牌的rank(牌面)和suit(花色)
  2. 在牌库中对牌进行删减
  3. 统计剩余牌数
  4. 小功能部件

代码

牌库容器:
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月, 学习编程的第五个月.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值