java模拟实现斗地主(超简单的发牌理牌思路)

java语言模拟实现斗地主

用数组以及随机数模拟实现,超简单~~~

一、初始化牌

众所周知,纸牌共有54张,将这54张牌放入到字符串数组里面,进行初始化操作,注意:这个顺序很重要,后面理牌的时候要用。相当于一个模板 以下是我声明的字符串数组。

String[] pai = {
                "3♠", "3♥", "3♦", "3♣",
                "4♠", "4♥", "4♦", "4♣",
                "5♠", "5♥", "5♦", "5♣",
                "6♠", "6♥", "6♦", "6♣",
                "7♠", "7♥", "7♦", "7♣",
                "8♠", "8♥", "8♦", "8♣",
                "9♠", "9♥", "9♦", "9♣",
                "10♠", "10♥", "10♦", "10♣",
                "J♠", "J♥", "J♦", "J♣",
                "Q♠", "Q♥", "Q♦", "Q♣",
                "K♠", "K♥", "K♦", "K♣",
                "A♠", "A♥", "A♦", "A♣",
                "2♠", "2♥", "2♦", "2♣",
                "大♚", "小♔"
        };

二、建数组

//设置一个boolean数组,来对应下标,检查牌是否出现过
 boolean[] isTrue = new boolean[54];
 //用来存随机生成的下标,最重要,理牌时候也用到
  int[] xiaBiao = new int[54];
  //建3个int数组存下标,表示三个玩家,
   int[] zhao = new int[17];
   int[] liu = new int[17];
   int[] zhang = new int[17];
   //用一个int数组存地主牌
   int[] diZhuPai = new int[3];

根据牌的下标去字符串里面取牌(值),如果这个值有了就对应的boolean数组的对应的设为true。

三、用随机数生成下标

用随机数生成一个(0,53]的随机数,其实生成的随机数就是字符数组(pai数组)的下标,根据生成的数去取值。

public void xiPai(String[] pai, boolean[] isTrue, int[] xiaBiao) {
        System.out.println("\n洗牌");
        int temp = 0;//用来计数,看是否够54张牌,
        while (temp < 54) {
            随机产生一个数(0,53]之间的数,赋值给p,这样保证一次循环只随机产生一个
            int p = (int) (Math.random() * (53 - 0 + 1));
            //isTrue是一个boolean数组,来对应下标,目的是检查随机生成的下标是否已经出现过
            if (!isTrue[p]) {//执行的话证明还没有这个牌(下标)
                xiaBiao[temp] = p;//把值存到数组里面
                temp++;//牌数加一
                System.out.print(pai[p] + "  ");
                //每27张牌换行一次
                if (temp % 27 == 0)
                    System.out.println();
                isTrue[p] = true;//对应的boolean数组设为true,证明这张牌已经有了
            }
        }
    }

发牌

发牌就是将存好的数组下标分成4份(3份17个代表17张牌,一个3个,代表地主牌),可以直接用数组拷贝方法,都可以,只要达到目的就行。

//发牌
    public void faPai(String[] pai, int[] xiaBiao, int[] zhang, int[] liu, int[] zhao, int[] dizhupai) {
        System.out.print("\n开始发牌:");
        int k = 0;
        int j = 0;
        while (j < 17) {
            zhao[j] = xiaBiao[k++];
            liu[j] = xiaBiao[k++];
            zhang[j] = xiaBiao[k++];
            j++;
        }
        System.out.print("\n张飞的牌为:");
        for (int i =0; i<17 ; i++) {
            System.out.print(pai[zhang[i]] + "  ");
        }
        System.out.print("\n赵云的牌为:");
        for (int i =0; i<17 ; i++) {
            System.out.print(pai[zhao[i]] + "  ");
        }
        System.out.print("\n刘备的牌为:");
        for (int i =0; i<17 ; i++) {
            System.out.print(pai[liu[i]] + "  ");
        }
        int q=0;
        System.out.print("\n底牌:");
        for (int i = 51; i < 54; i++) {
            dizhupai[q] = xiaBiao[i];
            System.out.print(pai[dizhupai[q]] + "  ");
            q++;
        }

    }

理牌

经过上面一个步骤以后,每个玩家手里面都有了17张牌,只需要将他们排序(注意,从头到尾用的都是下标,不是字符串里面的值,下标是int值,每一个int值对应字符串数组里面的一张牌,将随机生成的下标排序,其实就是理牌,因为下标有顺序了,根据下标取的值自热也就有了顺序。),详情如下代码:

//理牌
    public void liPai(String[] pai, int[] zhang, int[] zhao, int[] liu) {
        System.out.print("\n\n理牌");
        //把下标排序,根据下标取值
        Arrays.sort(zhang);
        Arrays.sort(zhao);
        Arrays.sort(liu);

        System.out.print("\n张飞的牌为:");
        for (int i = 0; i < 17; i++) {
            System.out.print(pai[zhang[i]] + "  ");
        }
        System.out.print("\n赵云的牌为:");
        for (int i = 0; i < 17; i++) {

            System.out.print(pai[zhao[i]] + "  ");
        }
        System.out.print("\n刘备的牌为:");
        for (int i = 0; i < 17; i++) {

            System.out.print(pai[liu[i]] + "  ");
        }
    }

全部代码如下:

/*4.在斗地主当中,将54张牌随机发给3位玩家,并且保留3张牌做为底牌,分别展示三位玩家手中的牌和底牌。


    例如: 张飞手中随机握有17张牌 ,赵云手中随机握有17张牌 ,刘备手中随机握有17张牌 底牌还剩3张

    提示:扑克牌不只一张,很多张肯定要用数组,因为数组的定义就是一群元素

        那么一副扑克牌54张肯定是数组。17张扑克牌也是数组。3张扑克牌也是数组。*/


import java.util.Arrays;

public class DouDiZhu {

    public static void main(String[] args) {
        String[] pai = {
                "3♠", "3♥", "3♦", "3♣",
                "4♠", "4♥", "4♦", "4♣",
                "5♠", "5♥", "5♦", "5♣",
                "6♠", "6♥", "6♦", "6♣",
                "7♠", "7♥", "7♦", "7♣",
                "8♠", "8♥", "8♦", "8♣",
                "9♠", "9♥", "9♦", "9♣",
                "10♠", "10♥", "10♦", "10♣",
                "J♠", "J♥", "J♦", "J♣",
                "Q♠", "Q♥", "Q♦", "Q♣",
                "K♠", "K♥", "K♦", "K♣",
                "A♠", "A♥", "A♦", "A♣",
                "2♠", "2♥", "2♦", "2♣",
                "大♚", "小♔"
        };
        boolean[] isTrue = new boolean[54];//设置一个boolean数组,来对应下标,
        int[] xiaBiao = new int[54];
        int[] zhao = new int[17];
        int[] liu = new int[17];
        int[] zhang = new int[17];
        int[] diZhuPai = new int[3];
        DouDiZhu d = new DouDiZhu();
        d.chushipai(pai);
        d.xiPai(pai, isTrue, xiaBiao);
        d.faPai(pai, xiaBiao, zhang, liu, zhao, diZhuPai);
        d.liPai(pai, zhang, zhao, liu);
    }

    //初始化牌,其实就是给输出一下pai[]数组
    public void chushipai(String[] p) {
        System.out.print("初始化新牌:");
        for (int i = 0; i < p.length; i++) {
            //每27张牌换行
            if (i % 27 == 0) {
                System.out.println();
            }
            System.out.print(p[i] + "\t");
        }
        System.out.println();
    }

    //洗牌
    public void xiPai(String[] pai, boolean[] isTrue, int[] xiaBiao) {
        System.out.println("\n洗牌");
        int temp = 0;//用来计数,看是否够54张牌,
        while (temp < 54) {
            随机产生一个数(0,53]之间的数,赋值给p,这样保证一次循环只随机产生一个
            int p = (int) (Math.random() * (53 - 0 + 1));
            //isTrue是一个boolean数组,来对应下标,目的是检查随机生成的个下标是否已经出现过
            if (!isTrue[p]) {//执行的话证明还没有这个牌(下标)
                xiaBiao[temp] = p;
                temp++;
                System.out.print(pai[p] + "  ");
                if (temp % 27 == 0)
                    System.out.println();
                isTrue[p] = true;
            }
        }
    }

    //发牌
    public void faPai(String[] pai, int[] xiaBiao, int[] zhang, int[] liu, int[] zhao, int[] dizhupai) {
        System.out.print("\n开始发牌:");
        int k = 0;
        int j = 0;
        while (j < 17) {
            zhao[j] = xiaBiao[k++];
            liu[j] = xiaBiao[k++];
            zhang[j] = xiaBiao[k++];
            j++;
        }
        System.out.print("\n张飞的牌为:");
        for (int i =0; i<17 ; i++) {
            System.out.print(pai[zhang[i]] + "  ");
        }
        System.out.print("\n赵云的牌为:");
        for (int i =0; i<17 ; i++) {
            System.out.print(pai[zhao[i]] + "  ");
        }
        System.out.print("\n刘备的牌为:");
        for (int i =0; i<17 ; i++) {
            System.out.print(pai[liu[i]] + "  ");
        }
        int q=0;
        System.out.print("\n底牌:");
        for (int i = 51; i < 54; i++) {
            dizhupai[q] = xiaBiao[i];
            System.out.print(pai[dizhupai[q]] + "  ");
            q++;
        }

    }

    //理牌
    public void liPai(String[] pai, int[] zhang, int[] zhao, int[] liu) {
        System.out.print("\n\n理牌");
        //把下标排序,根据下标取值
        Arrays.sort(zhang);
        Arrays.sort(zhao);
        Arrays.sort(liu);

        System.out.print("\n张飞的牌为:");
        for (int i = 0; i < 17; i++) {
            System.out.print(pai[zhang[i]] + "  ");
        }
        System.out.print("\n赵云的牌为:");
        for (int i = 0; i < 17; i++) {

            System.out.print(pai[zhao[i]] + "  ");
        }
        System.out.print("\n刘备的牌为:");
        for (int i = 0; i < 17; i++) {

            System.out.print(pai[liu[i]] + "  ");
        }
    }
}

运行结果一
在这里插入图片描述
运行结果二
在这里插入图片描述
运行结果三
在这里插入图片描述

可以看出,每次玩家收到的牌都不一样(随机数产生的效果),理牌最关键的是理下标,根据下标去字符串数组里面取值。下标有了顺序,自然牌也就有了顺序,这才是为什么强调字符串数组的里面字符串位置很重要的原因。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值