用java模拟斗地主发牌洗牌

要求

编写一个斗地主洗牌发牌的程序,要求按照斗地主的规则完成洗牌发牌的过程。

    //先想办法把54张牌存入集合
总共有54张牌,牌面由花色和数字(包括 J、 Q、 K、A 字母)组成,   //存入元素长度小于54
花色有♠、♥、♦和♣这4种,分别表示黑桃、红桃、方块和梅花,小☺表示小王,大☻表示大王。  //2-10*4 +大王+小王=54

将这54张牌打乱顺序,共有3位玩家参与游戏,每人轮流一次摸一张牌,剩余3张留为底牌。
程序结束,打印每人手中的纸牌和底牌。例如,打印“玩家1:[♥3,♦4⋯]玩家2:[♠3,♦3⋯]玩家3:[♦6,♠6⋯]底牌: [♣3,大☻, ♥9]”。

 */

思路

一:写四个for循环来存储四种花色的各个牌

如果你不太熟悉java的话请先把这一步看懂

package JiaXinTest;

import java.util.*;

public class User {

    public static void main(String[] args) {

        
//        for (Integer h = 0; h < 5; h++) {
//
//            h.toString();//如何把h变成花色呢‘?
//            //其实没必要,用集合来存储四个花色,然后遍历这个集合就可以了。

        ArrayList<String> HuaSe = new ArrayList<String>();

        HuaSe.add("♠");
        HuaSe.add("♥");
        HuaSe.add("♦");
        HuaSe.add("♣");

        for (String hua : HuaSe) {

            System.out.println();

            for (int i = 2; i < 11; i++) {

                String.valueOf(i);

                String hua1 = hua + i;//如何让变量名自己变呢?
                //  hua1 = hua + i;
                System.out.print(hua1 + " ");//不需要给每张牌取名字啊,我只要把每张牌存进去就可以了。
            }
        }

            for (String hua2 : HuaSe) {

                System.out.println();

                String[] strings = new String[]{"A", "J", "Q", "K"};

                for (String s : strings) {

                    String hua3 = hua2 + s;
                    System.out.print(hua3 + " ");
                }
            }
    }
}

输出:

然后再在原有的基础上搞一个集合把这些元素依次存进去就行了。 


已添加所有牌

package JiaXinTest;

import java.util.*;

public class User {

    public static void main(String[] args) {


//        for (Integer h = 0; h < 5; h++) {
//
//            h.toString();//如何把h变成花色呢‘?
//            //其实没必要,用集合来存储四个花色,然后遍历这个集合就可以了。

        ArrayList<String> HuaSe = new ArrayList<String>();

        HuaSe.add("♠");
        HuaSe.add("♥");
        HuaSe.add("♦");
        HuaSe.add("♣");

        HashSet<String> pai = new HashSet<String>();

        pai.add("☺");
        pai.add("☻");
        
        for (String hua : HuaSe) {
            
            for (int i = 2; i < 11; i++) {

                String.valueOf(i);

                String hua1 = hua + i;//如何让变量名自己变呢?
                //  hua1 = hua + i;
//                System.out.print(hua1 + " ");//不需要给每张牌取名字啊,我只要把每张牌存进去就可以了。
                pai.add(hua1);
            }
        }

        for (String hua2 : HuaSe) {


            String[] strings = new String[]{"A", "J", "Q", "K"};

            for (String s : strings) {

                String hua3 = hua2 + s;
//                    System.out.print(hua3 + " ");
                pai.add(hua3);
            }
        }

        for (String p : pai) {

            System.out.print(p);

        }
    }
}


每人轮流一次摸一张牌,剩余3张留为底牌

没人轮流一次摸一张牌这个代码有点难写哦
创建三个对象(player),然后三个take方法?

就这个问题10点想到三点,上代码!

package JiaXinTest;

import java.util.*;

public class User {

    static HashSet<String> pai = new HashSet<String>();//原有的牌54

    public static void main(String[] args) {


//        for (Integer h = 0; h < 5; h++) {
//
//            h.toString();//如何把h变成花色呢‘?
//            //其实没必要,用集合来存储四个花色,然后遍历这个集合就可以了。

        ArrayList<String> HuaSe = new ArrayList<String>();

        HuaSe.add("♠");
        HuaSe.add("♥");
        HuaSe.add("♦");
        HuaSe.add("♣");

        pai.add("☺");
        pai.add("☻");

        for (String hua : HuaSe) {

            for (int i = 2; i < 11; i++) {

                String.valueOf(i);

                String hua1 = hua + i;//如何让变量名自己变呢?
                //  hua1 = hua + i;
//                System.out.print(hua1 + " ");//不需要给每张牌取名字啊,我只要把每张牌存进去就可以了。
                pai.add(hua1);
            }
        }

        for (String hua2 : HuaSe) {


            String[] strings = new String[]{"A", "J", "Q", "K"};

            for (String s : strings) {

                String hua3 = hua2 + s;
//                    System.out.print(hua3 + " ");
                pai.add(hua3);
            }
        }

//        int i = 0;

//        ArrayList<String> player = new ArrayList<String>();
//
//        player.add("P1");
//        player.add("P2");
//        player.add("P3");
        HashSet<String> init = new HashSet<String>();//直接将外部传入的引用赋给玩家实例的属性,所有玩家都会共享同一个集合

        Player p1 = new Player("p1", init);//注意构造方法一定不能直接赋值,要用addAll,直接赋值等于复制地址,没有为每个对象开辟新的集合
        Player p2 = new Player("p2", init);//而当你使用addAll,那么就是创造了一个新的集合。
        Player p3 = new Player("p3", init);
//        System.out.println(p1);


//        for (String p : pai) {
//
            p1.take(p);
            p2.take(p);
            p3.take(p);这样取得都是同一张牌
//            System.out.println(p1);
//
//            p1.take(p);
            if (pai.remove(p)){//为什么我把被p1拿走的牌删掉以后for就不能再执行了?//如果你要在集合遍历的时候删除元素就只能iterator
//
//                System.out.println("p+1:"+ p + 1);//我想获取这个p的下一个元素应该怎么写?
//
//
            }else {

                p2.take(p);
                p3.take(p);
//
            }

//        }

        //================================================改用iterator吧,感觉for循环是行不通了。======================================================
        Iterator<String> iterator = pai.iterator();

        while (iterator.hasNext()) {

            String p = iterator.next();
            
            p1.take(p);
            iterator.remove();//搞了半天原来是这里错了,应该用iterator.remove

            String ptwo = iterator.next();
            p2.take(ptwo);//这里的p应该是指p的下一个元素,我应该怎么做呢?//为什么这里就跳出了无法执行呢?
            //为什么p2添加的,分配到的牌也是j呢?也就是说这里的iterator是一样的//我通过调试检查了,其实是分配到的牌是不一样的,那么为什么最后打印出来三个人的牌是一样的呢?
            iterator.remove();

            String pthree = (iterator.next());
            p3.take(pthree);
            iterator.remove();

            //===============应该用hasnext来判断还有没有下一个,如果有下一个(赋值)的话就拿走这一个,因为已经删掉第一个了。
        }

        System.out.println("p1 " + p1.initPais);
        System.out.println("p2 " + p2.initPais);
        System.out.println("p3 " + p3.initPais);
    }
}

player类

package JiaXinTest;

import java.util.ArrayList;
import java.util.HashSet;

public class Player {

//    new ArrayList.var//为什么不可以?我希望每个对象都有一个集合,为什么不可以这样写?
    //不可以用快捷键

    HashSet<String> initPais = new HashSet<String>();

    String name;

    @Override
    public String toString() {
        return name;
    }

    public Player() {

    }

    public Player(String name, HashSet<String> initPais) {//我希望每个player对象都有一个HashSet应该怎么做?这里为什么会报错?应该怎么写才不会报错?//忘记给名字了

        this.name = name;

        this.initPais.addAll(initPais);//说实话这一步我不太懂,是把对象的、每个玩家的牌添加initPais,自己添加自己有啥用啊?这就是自己添加自己对吗?

    }

    public HashSet take(String p) {

        if ((initPais.size()) < 17) {

            this.initPais.add(p);//但是我感觉你这样做和我在有参的方法里this.initpais = initpais;没区别啊
        }

        return initPais;

    }

}


还有如何留下三张做底牌的,交给大家来完成了,记得交作业哦~

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值