模拟斗地主(java)

主要分为5个步骤

1.准备牌:

可以先创建两个List集合用来存储牌的花色和牌的序号,然后再创建一个HashMap<k,v>用来存储牌的索引和牌,再创建一个ArrayList集合用来存储牌的索引(用来排序)。

因为大王和小王这两张牌比较特殊,所以应该在一开始的时候单独添加到map中

2.洗牌:

可以使用静态工具类Collections的方法shuffle(list)来打乱牌的顺序(也就是打乱牌的索引的顺序)

3.发牌:

一共54张牌要发给3个人然后需要留3张给底牌,所以每人一共17张牌,可以用for循环遍历牌索引的集合,然后用该集合的索引来对3取模,即i%3==0、i%3==1、i%3==2,底牌的约束则是该集合索引大于等于51是,发给底牌。

4.给玩家的牌排序

因为排序的对象的类型是Integer不是自定义类型,所以可以使用静态工具类Collections的sort方法来对玩家的牌的索引排序

5.看牌

可以自定义一个方法来看牌,通过玩家集合牌的索引,利用map集合的keySet方法键找值来获取牌,然后打印输出

实现代码如下:

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

/*
    1.准备牌
    2.洗牌
    3.发牌
    4.排序
    5.看牌
 */
public class DouDiZhu {
    public static void main(String[] args) {
        //创建HashMap对象用来存储牌的索引和牌
        HashMap<Integer,String> poker = new HashMap<>();
        //创建两个list来存放牌的花色和序号
        List<String> colors = List.of("♥","♠","♣","♦");
        List<String> numbers = List.of("2","A","K","Q","J","10","9","8","7","6","5","4","3");
        //创建一个集合用来存放牌的索引
        ArrayList<Integer> pokerIndex = new ArrayList<>();
        //初始化牌的索引为0
        int index=0;
        //先把大王小王两张牌放入poker中
        poker.put(index,"大王");
        pokerIndex.add(index);
        index++;
        poker.put(index,"小王");
        pokerIndex.add(index);
        index++;
        //再把剩下的52张牌用增强for循环嵌套遍历并组装
        for (String number:numbers) {
            for (String color:colors) {
                poker.put(index,color+number);
                pokerIndex.add(index);
                index++;
            }
        }
        //System.out.println(poker);

        //洗牌,使用Collections工具类得shuffle()方法打乱牌索引的顺序
        Collections.shuffle(pokerIndex);
        //发牌,创建4个集合用来接收牌
        ArrayList<Integer> play01 = new ArrayList<>();
        ArrayList<Integer> play02 = new ArrayList<>();
        ArrayList<Integer> play03 = new ArrayList<>();
        ArrayList<Integer> diPai = new ArrayList<>();
        for (int i = 0; i < pokerIndex.size(); i++) {
            Integer in = pokerIndex.get(i);
            if (i>=51){
                //当牌的索引大于等于51,即只剩下三张牌时留给底牌
                diPai.add(in);
            } else if (i%3==0){
                //发给玩家1
                play01.add(in);
            } else if (i%3==1){
                //发给玩家2
                play02.add(in);
            } else if (i%3==2){
                //发给玩家3
                play03.add(in);
            }
        }
        //给玩家的牌排序

        Collections.sort(play01);
        Collections.sort(play02);
        Collections.sort(play03);
        Collections.sort(diPai);
        /*System.out.println(play01);
        System.out.println(play02);
        System.out.println(play03);
        System.out.println(diPai);*/


        //看牌
        lookPoker("张三",play01,poker);
        lookPoker("李四",play02,poker);
        lookPoker("王五",play03,poker);
        lookPoker("赵六",diPai,poker);

    }

    public static void lookPoker(String playerName,ArrayList<Integer> list,HashMap<Integer,String> map){
        System.out.print(playerName+"的牌:");
        //使用增强for循环和keySet方法遍历
        for (Integer index:list) {
            String value = map.get(index);
            System.out.print(value+" ");
        }
        System.out.println(" ");
    }


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

helloworld*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值