斗地主算法的设计与实现(五)--洗牌和发牌

本篇简要介绍如何洗牌和发牌。

这2个算法都很简单,有兴趣的同学可以写得更好一点。

关键点说明

a.洗牌算法的思路就是,构造54张牌,打乱牌N次,这个算法可能不够随机。

b.发牌算法的思路就是,从洗好的牌中,按规律发给3个玩家,比如1好玩家就取第1、4、7等17张牌。

c.3个玩家,谁取到id为1的这张牌,谁就是“地主”。

1.初始化

  

 /**
     * 初始化
     */
    private void deal() {
        shuffle();
        divide();
    }


2.洗牌

   /**
     * 洗牌
     */
    private void shuffle() {

        for (int i = 0; i < 54; i++) {
            Card card = new Card(i + 1);
            allCards.add(card);
        }

        System.out.println("洗牌之前:");
        CardUtil.printCards(allCards);

        // 洗牌,交换1000次
        for (int i = 0; i <= 1000; i++) {
            Collections.shuffle(allCards);// 打乱牌的位置
        }

        System.out.println("洗牌之后:");
        CardUtil.printCards(allCards);
    }


3.发牌

    

//发牌
    private void divide() {
        // 1号玩家的牌
        for (int j = 0; j < 17; j++) {
            Card card = allCards.get(j * 3);
            myCards.add(card);
            if (myCards.get(j).id == 1) {
                diZhu = 1;
            }
        }

        // 2号玩家的牌
        for (int j = 0; j < 17; j++) {
            Card card = allCards.get(j * 3 + 1);
            rightCards.add(card);

            if (rightCards.get(j).id == 1) {
                diZhu = 2;
            }
        }

        // 3号玩家的牌
        for (int j = 0; j < 17; j++) {
            Card card = allCards.get(j * 3 + 2);
            leftCards.add(card);

            if (leftCards.get(j).id == 1) {
                diZhu = 3;
            }
        }

        for (int i = 51; i < 54; i++) {

            Card card = allCards.get(i);
            topCards.add(card);

            Card card2 = new Card(card.id);

            copyOfTopCards.add(card2);
        }

        CardUtil.sortCards(myCards);
        CardUtil.sortCards(leftCards);
        CardUtil.sortCards(rightCards);
    }

  


4.打印牌

  

 /**
     * 打印牌
     */
    private void printCards() {
        System.out.println("玩家1的牌:");
        CardUtil.printCards(myCards);

        System.out.println("玩家2的牌:");
        CardUtil.printCards(leftCards);

        System.out.println("玩家3的牌:");
        CardUtil.printCards(rightCards);

        System.out.println("底牌:");
        CardUtil.printCards(topCards);
    }


5.运行洗牌发牌程序

public static void main(String[] args) {
        DealingDevice one = new DealingDevice();
        one.printCards();

        logger.info("没有排序的牌:");
        ArrayList<Card> allCards2 = one.getAllCards();
        CardUtil.printCards(allCards2);

        logger.info("排序之后的牌:");
        CardUtil.sortCards(allCards2);
        CardUtil.printCards(allCards2);
    }


6.程序运行结果

洗牌之前
方块A(A0.gif)    方块2(20.gif)    方块3(30.gif)    方块4(40.gif)    方块5(50.gif)    方块6(60.gif)    方块7(70.gif)    方块8(80.gif)    方块9(90.gif)    方块10(100.gif)    方块J(J0.gif)    方块Q(Q0.gif)    方块K(K0.gif)    梅花A(A1.gif)    梅花2(21.gif)    梅花3(31.gif)    梅花4(41.gif)    梅花5(51.gif)    梅花6(61.gif)    梅花7(71.gif)    梅花8(81.gif)    梅花9(91.gif)    梅花10(101.gif)    梅花J(J1.gif)    梅花Q(Q1.gif)    梅花K(K1.gif)    红桃A(A2.gif)    红桃2(22.gif)    红桃3(32.gif)    红桃4(42.gif)    红桃5(52.gif)    红桃6(62.gif)    红桃7(72.gif)    红桃8(82.gif)    红桃9(92.gif)    红桃10(102.gif)    红桃J(J2.gif)    红桃Q(Q2.gif)    红桃K(K2.gif)    黑桃A(A3.gif)    黑桃2(23.gif)    黑桃3(33.gif)    黑桃4(43.gif)    黑桃5(53.gif)    黑桃6(63.gif)    黑桃7(73.gif)    黑桃8(83.gif)    黑桃9(93.gif)    黑桃10(103.gif)    黑桃J(J3.gif)    黑桃Q(Q3.gif)    黑桃K(K3.gif)    小王XiaoWang(smallJoker.gif)    大王DaWang(bigJoker.gif)    

洗牌之后
红桃7(72.gif)    红桃J(J2.gif)    方块J(J0.gif)    大王DaWang(bigJoker.gif)    黑桃5(53.gif)    梅花Q(Q1.gif)    黑桃2(23.gif)    梅花6(61.gif)    红桃2(22.gif)    方块K(K0.gif)    红桃5(52.gif)    红桃6(62.gif)    梅花4(41.gif)    黑桃K(K3.gif)    梅花J(J1.gif)    梅花9(91.gif)    红桃3(32.gif)    方块10(100.gif)    方块8(80.gif)    方块Q(Q0.gif)    黑桃10(103.gif)    黑桃9(93.gif)    红桃4(42.gif)    方块9(90.gif)    黑桃3(33.gif)    黑桃6(63.gif)    黑桃7(73.gif)    梅花K(K1.gif)    红桃8(82.gif)    梅花5(51.gif)    方块2(20.gif)    红桃9(92.gif)    红桃Q(Q2.gif)    小王XiaoWang(smallJoker.gif)    红桃A(A2.gif)    梅花A(A1.gif)    梅花8(81.gif)    方块5(50.gif)    方块4(40.gif)    方块3(30.gif)    方块6(60.gif)    黑桃4(43.gif)    黑桃J(J3.gif)    梅花3(31.gif)    梅花2(21.gif)    梅花7(71.gif)    方块7(70.gif)    方块A(A0.gif)    红桃K(K2.gif)    黑桃Q(Q3.gif)    红桃10(102.gif)    梅花10(101.gif)    黑桃8(83.gif)    黑桃A(A3.gif)    

玩家1的牌
方块3(30.gif)    黑桃3(33.gif)    梅花4(41.gif)    梅花7(71.gif)    红桃7(72.gif)    方块8(80.gif)    梅花8(81.gif)    梅花9(91.gif)    黑桃9(93.gif)    黑桃J(J3.gif)    方块K(K0.gif)    梅花K(K1.gif)    红桃K(K2.gif)    方块2(20.gif)    黑桃2(23.gif)    小王XiaoWang(smallJoker.gif)    大王DaWang(bigJoker.gif)    

玩家2的牌
方块 4(40.gif)    黑桃4(43.gif)    梅花5(51.gif)    红桃6(62.gif)    黑桃7(73.gif)    方块9(90.gif)    方块10(100.gif)    红桃10(102.gif)    黑桃10(103.gif)    方块J(J0.gif)    梅花J(J1.gif)    梅花Q(Q1.gif)    红桃Q(Q2.gif)    方块A(A0.gif)    梅花A(A1.gif)    梅花2(21.gif)    红桃2(22.gif)    

玩家3的牌
梅花3(31.gif)    红桃3(32.gif)    红桃4(42.gif)    方块5(50.gif)    红桃5(52.gif)    黑桃5(53.gif)    方块6(60.gif)    梅花6(61.gif)    黑桃6(63.gif)    方块7(70.gif)    红桃8(82.gif)    红桃9(92.gif)    红桃J(J2.gif)    方块Q(Q0.gif)    黑桃Q(Q3.gif)    黑桃K(K3.gif)    红桃A(A2.gif)    

底牌
梅花10(101.gif)    黑桃8(83.gif)    黑桃A(A3.gif)    

红桃7(72.gif)    十月 11, 2013 1:16:41 下午 cn.fansunion.ddz.client.DealingDevice main
INFO: 没有排序的牌
红桃J(J2.gif)    方块J(J0.gif)    大王DaWang(bigJoker.gif)    黑桃5(53.gif)    梅花Q(Q1.gif)    黑桃2(23.gif)    梅花6(61.gif)    红桃2(22.gif)    方块K(K0.gif)    红桃5(52.gif)    红桃6(62.gif)    梅花4(41.gif)    黑桃K(K3.gif)    梅花J(J1.gif)    梅花9(91.gif)    红桃3(32.gif)    方块10(100.gif)    方块8(80.gif)    方块Q(Q0.gif)    黑桃10(103.gif)    黑桃9(93.gif)    红桃4(42.gif)    方块9(90.gif)    黑桃3(33.gif)    黑桃6(63.gif)    黑桃7(73.gif)    梅花K(K1.gif)    红桃8(82.gif)    梅花5(51.gif)    方块2(20.gif)    红桃9(92.gif)    红桃Q(Q2.gif)    小王XiaoWang(smallJoker.gif)    红桃A(A2.gif)    梅花A(A1.gif)    梅花8(81.gif)    方块5(50.gif)    方块4(40.gif)    方块3(30.gif)    方块6(60.gif)    黑桃4(43.gif)    黑桃J(J3.gif)    梅花3(31.gif)    梅花2(21.gif)    梅花7(71.gif)    方块7(70.gif)    方块A(A0.gif)    红桃K(K2.gif)    黑桃Q(Q3.gif)    红桃10(102.gif)    梅花10(101.gif)    黑桃8(83.gif)    黑桃A(A3.gif)    

十月 11, 2013 1:16:41 下午 cn.fansunion.ddz.client.DealingDevice main
INFO: 排序之后的牌
方块3(30.gif)    梅花3(31.gif)    红桃3(32.gif)    黑桃3(33.gif)    方块4(40.gif)    梅花4(41.gif)    红桃4(42.gif)    黑桃4(43.gif)    方块5(50.gif)    梅花5(51.gif)    红桃5(52.gif)    黑桃5(53.gif)    方块6(60.gif)    梅花6(61.gif)    红桃6(62.gif)    黑桃6(63.gif)    方块7(70.gif)    梅花7(71.gif)    红桃7(72.gif)    黑桃7(73.gif)    方块8(80.gif)    梅花8(81.gif)    红桃8(82.gif)    黑桃8(83.gif)    方块9(90.gif)    梅花9(91.gif)    红桃9(92.gif)    黑桃9(93.gif)    方块10(100.gif)    梅花10(101.gif)    红桃10(102.gif)    黑桃10(103.gif)    方块J(J0.gif)    梅花J(J1.gif)    红桃J(J2.gif)    黑桃J(J3.gif)    方块Q(Q0.gif)    梅花Q(Q1.gif)    红桃Q(Q2.gif)    黑桃Q(Q3.gif)    方块K(K0.gif)    梅花K(K1.gif)    红桃K(K2.gif)    黑桃K(K3.gif)    方块A(A0.gif)    梅花A(A1.gif)    红桃A(A2.gif)    黑桃A(A3.gif)    方块2(20.gif)    梅花2(21.gif)    红桃2(22.gif)    黑桃2(23.gif)    小王XiaoWang(smallJoker.gif)    大王DaWang(bigJoker.gif)    

相关阅读

斗地主算法的设计与实现

面向对象实现斗地主程序的核心算法,包括洗牌、发牌、判断牌型、比较牌的大小、游戏规则等。


原文参见: http://FansUnion.cn/articles/2735

原文地址:https://www.cnblogs.com/qitian1/p/6463549.html