使用Java語言寫的一個簡單的撲克牌發牌程式碼

say_MrG發表於2018-08-05

利用HashMap存放撲克牌和它的索引,利用ArrayList存放撲克牌的索引。在洗牌時打亂的是ArrayList的順序,按洗完牌的順序把索引發給每一個玩家的牌組集合。TreeSet集合會自動將索引順序排好,這樣撲克牌的順序就按照大小排好啦。最後再使用look方法遍歷出每個玩家牌組的順序得到結果。 

package com.kd.test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeSet;

public class Poker {
    public static void main(String[] args) {        
        HashMap<Integer, String> hezi = new HashMap<>();//存放撲克牌和它的索引
        ArrayList<Integer> list = new ArrayList<>();//存放撲克牌的索引
        
        //生成撲克牌,從小到大存入集合中,這裡採取的花色大小是:梅花<方片<黑桃<紅桃        
        String[] colors = {"♣","♦","♠","♥"};//花色陣列
        String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};//大小陣列
        int index = 0;//撲克牌的索引
        
        //將撲克牌存放進HashMap集合中
        for (int i = 0; i < numbers.length; i++) {
            for (int j = 0; j < colors.length; j++) {
                String puke = colors[j].concat(numbers[i]);
                hezi.put(index, puke);
                list.add(index);
                index++;
            }
        }
        hezi.put(index, "小王");
        list.add(index);
        index++;
        hezi.put(index, "大王");
        list.add(index);
        
        //洗牌
        Collections.shuffle(list);
                
        TreeSet<Integer> w1set = new TreeSet<>();//玩家1牌組集合
        TreeSet<Integer> w2set = new TreeSet<>();//玩家2牌組集合
        TreeSet<Integer> w3set = new TreeSet<>();//玩家3牌組集合
        TreeSet<Integer> dpset = new TreeSet<>();//底牌牌組集合
        
        //發牌
        for (int i = 0; i < list.size(); i++) {
            if (i >= list.size()-3) {
                dpset.add(list.get(i));
            }else if (i%3 == 0) {
                w1set.add(list.get(i));
            }else if (i%3 == 1) {
                w2set.add(list.get(i));
            }else {
                w3set.add(list.get(i));
            }
        }
        
        int d = 0;//d表示地主牌的索引        
        while (true) {
            d = (int)(Math.random()*54);//產生一個0-53之間的隨機數,對應著撲克的索引
            if (!dpset.contains(d)) {//地主牌的索引不是底牌索引
                break;//結束迴圈
            }
        }
        System.out.println("地主牌為:"+hezi.get(d));
        
        if (w1set.contains(d)) {
            w1set.addAll(dpset);
        } else if (w2set.contains(d)) {
            w2set.addAll(dpset);
        } else {
            w3set.addAll(dpset);
        }
        
        //看牌
        look("玩家1", w1set, hezi);
        look("玩家2", w2set, hezi);
        look("玩家3", w3set, hezi);
        look("底牌", dpset, hezi);

    }
    
    /**
     *
     * @param name 玩家名
     * @param set  玩家牌組集合
     * @param map  撲克牌集合
     */
    public static void look(String name, TreeSet<Integer> set, HashMap<Integer, String> map) {
        System.out.println(name+"的牌是:");
        for (Integer i : set) {
            System.out.print(map.get(i)+" ");
        }
        System.out.println();
    }

}

相關文章