斗地主算法的设计与实现–洗牌跟发牌

斗地主算法的设计与实现–洗牌和发牌本篇简要介绍如何洗牌和发牌。这2个算法都很简单,有兴趣的同学可以写得

斗地主算法的设计与实现–洗牌和发牌

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

这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