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

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

这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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java斗地主洗牌发牌的易错点主要有以下几个方面: 1.洗牌算法实现洗牌算法是指将一副牌随机打乱的算法,常用的有Fisher-Yates算法。在实现洗牌算法时,需要注意随机数生成的范围和重复问题,否则可能会导致洗牌不彻底或者出现重复的情况。 2.牌的表示方式:在Java中,可以使用数组或者集合等数据结构来表示一副牌。如果使用数组,需要注意数组下标的范围和元素的类型,如果使用集合,需要注意集合的初始化和元素的去重问题。 3.发牌实现:在发牌时,需要将一副牌平均分成三份,再将三份牌分别发给三个玩家。在实现发牌时,需要注意牌的顺序和玩家的顺序,否则可能会导致玩家手中的牌不完整或者出现重复的情况。 4.玩家手牌的排序:在玩家手牌排序时,需要注意排序算法的选择和实现方式,否则可能会导致排序不正确或者出现异常情况。 以下是Java斗地主洗牌发牌的示例代码: ```java import java.util.ArrayList; import java.util.Collections; import java.util.List; public class DouDiZhu { public static void main(String[] args) { // 初始化一副牌 List<String> poker = new ArrayList<>(); String[] colors = {"♠", "♥", "♣", "♦"}; String[] numbers = {"2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3"}; for (String color : colors) { for (String number : numbers) { poker.add(color + number); } } poker.add("小王"); poker.add("大王"); // 洗牌 Collections.shuffle(poker); // 发牌 List<String> player1 = new ArrayList<>(); List<String> player2 = new ArrayList<>(); List<String> player3 = new ArrayList<>(); List<String> dipai = new ArrayList<>(); for (int i = 0; i < poker.size(); i++) { String card = poker.get(i); if (i >= 51) { dipai.add(card); } else if (i % 3 == 0) { player1.add(card); } else if (i % 3 == 1) { player2.add(card); } else if (i % 3 == 2) { player3.add(card); } } // 排序 Collections.sort(player1); Collections.sort(player2); Collections.sort(player3); Collections.sort(dipai); // 输出结果 System.out.println("玩家1:" + player1); System.out.println("玩家2:" + player2); System.out.println("玩家3:" + player3); System.out.println("底牌:" + dipai); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值