用java代码实现发牌功能

2 篇文章 0 订阅
2 篇文章 0 订阅

今天下午,找到了一个用Java代码实现发牌的功能,记录一下自己的思路。
这个问题可以有两种方法实现:
第一种方法:用Map和List这两个集合实现,思路如下:
一副斗地主的牌一般有54张牌其中 : 4中花色;1-54的编号;2-10的数字牌,A,J,Q,K 四个字母牌 大王,小王
①.创建一个map集合储存花色和A到K(包含2-10)的组合 。如:♠1。
②.创建一个list集合储存1-54的编号。
③.创建俩个数组储存4种花色,A到K的值。
④.进行操作,把值放进对应集合中
⑤.上述执行完后,还缺少大王和小王这俩张牌,单独的将他们添加进map数组中
⑥.现在这和Map集合就是一副完整的牌。
⑦.打乱这副牌 使用Collections.shuffle();
⑧.创建3个空的List集合 相当于三个人物。
⑨.然后通过,从1到10取余发现结果都是0,1,2 可以得到:
1到54分给3个人的话, 取余都是 0,1,2这三个数
所以进行循环 前三个数作为底牌;
3到53分别取余与3
等于0的盒子中的这个分给一人;
等于1的分给一人;
等于2的分给一人
到此发牌结束。
下面附上代码,以供参考:

import java.util.*;

public class Demo {
    /**
     * 1.使用集合实现发牌模式
     *     一副牌: 54张 4中花色 J,Q,K,A 2....8;
     *     创建1.个map来储存花色和A...K
     *
     *         2.创建一个list来储存1到54的编号
     *
     *         3.创建2和数组储存 4中花色和A到K
     *
     *         4.将牌的具体内容放进map和list
     *
     * @param args
     */
    public static void main(String[] args) {
        Map<Integer,String> map=new HashMap<>();

        List<Integer> list=new ArrayList<>();

        String [] color={"♠","♥","♦","♣"};
        String[] Num={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
        int index=0;
        for (String num:Num) {
            for (String colors:color) {
                map.put(index,colors+num);
                list.add(index);
                index++;
            }
        }
        //还差大王和小王
        list.add(52);
        list.add(53);
        map.put(52,"大王");
        map.put(53,"小王");
        //将其打乱
        Collections.shuffle(list);

        List<Integer> p1=new ArrayList<>();
        List<Integer> p2=new ArrayList<>();
        List<Integer> p3=new ArrayList<>();
        List<Integer> p4=new ArrayList<>();


        //发牌
        for (int i = 0; i <list.size() ; i++) {
            if(i<3){
                p4.add(i);
            }else if (i%3==0){//0
                p1.add(i);
            }else if (i%3==1){
                p2.add(i);
            }else {
                p3.add(i);
            }

        }

        Collections.sort(p1);
        Collections.sort(p2);
        Collections.sort(p3);
        Collections.sort(p4);

        //显示谁的牌
        show("张三",p1,map);
        show("李四",p2,map);
        show("王金刚",p3,map);
        show("底牌",p4,map);

    }

    private static void show(String name, List<Integer> arrayList, Map<Integer, String> map) {
        System.out.print(name+": ");

        for (int i = 0; i <arrayList.size() ; i++) {
            System.out.print(map.get(arrayList.get(i))+"");
        }
        System.out.println();
    }
}

第二种方法:用List集合实现 思路如下:
①.创建一个list类保存花色
②.创建一个list类保存A到K 包括(2-10)
③.然后创建一个盒子将花色和A到K一起组合
④.然后打乱list盒子的排序取出前三个座位底牌
⑤.然后从1到10取余发现结果都是0,1,2
即1到54分给3个人的话 取余都是 0,1,2这三个数
所以进行循环 3到53分别取余与3 等于0的盒子中的这个分给一人;等于1的分给一人;等于2的分给一人
到此发牌结束。
下面附上代码,以供参考:

package cn.cx.arry;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ListDemo {
    /*
        1.使用集合实现发牌模式
     *     一副牌: 54张 4中花色 J,Q,K,A 2....8;
     *     创建1.个map来储存花色和A...K
     *
     *         2.创建一个list来储存1到54的编号
     *
     *         3.创建2和数组储存 4中花色和A到K
     *
     *         4.将牌的具体内容放进map和list

            color 储存花色
            Number 储存2-10
            AJQK 子集添加
            Num 储存1-54的编号

            创建一个list类保存花色
            创建一个list类保存A到K 包括(2-10)
            然后创建一个盒子将花色和A到K一起组合
            然后打乱list盒子的排序取出前三个座位底牌
            然后从1到10取余发现结果都是0,1,2
            即1到54分给3个人的话 取余都是 0,1,2这三个数
            所以进行循环 3到53分别取余与3 等于0的盒子中的这个分给一人;等于1的分给一人;等于2的分给一人

     */

    public static void main(String[] args) {
        List<String> zong=new ArrayList<>();
        List<String> color=new ArrayList<>();
        List<Integer> pid=new ArrayList<>();
        List<String> arrayList=new ArrayList<>();

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

        List<String> Number=new ArrayList<>();
        for (int i = 2; i <11 ; i++) {
            Number.add(i+"");
        }
        Number.add("J");
        Number.add("Q");
        Number.add("K");
        Number.add("A");
        int count=0;

        for (String in:color) {
            for (String str:Number) {
                zong.add(in+str);
            }
        }

        //还差大小王
        zong.add("大王");
        zong.add("小王");
        Collections.shuffle(zong);
        List<String> p1=new ArrayList<>();
        List<String> p2=new ArrayList<>();
        List<String> p3=new ArrayList<>();
        List<String> p4=new ArrayList<>();

        //发牌
        for (int i = 0; i <zong.size() ; i++) {
            String card=zong.get(i);
            if(i<3){
                p4.add(card);
            }else if (i%3==0){//0
                p1.add(card);
            }else if (i%3==1){
                p2.add(card);
            }else {
                p3.add(card);
            }

        }
        System.out.println(p1);
        System.out.println(p2);
        System.out.println(p3);
        System.out.println(p4);
         }

   ``

# 一级目录
## 二级目录
### 三级目录
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值