斗地主发牌机理

前言

本文实现了斗地主的随机发牌机理,前驱知识需掌握JavaSEJava集合的简单使用

分析

掌握了编程语言的使用,以及相应的随机数生成语法,来做这样一个发牌机制不是什么难事。在这个小项目中,我重点学习如何将一个项目具体化,分为哪些步骤。

  1. 买牌:需要分别花色以及牌号,进行嵌套循环,全排列,生成一副牌,并用键值对map储存
  2. 洗牌+发牌:洗牌用到的是Collections类中的shuffle方法。随后我们洗牌后的结果除以3取余,分发给3位玩家。这里在实现的时候,我思考了一个问题,为什么不将实际的牌号进行转换后直接存储呢,而是等到了下一步一次转换?
    其实这本来是一个很容易想明白的问题,过程中转换53次还是最后一次性转换3次,在计算机的角度从时间效率上来讲其实没有差别。但是我们考虑到程序的分层实现,封装的思想,所以要将这分为两步考虑
  3. 看牌:将牌号转换为扑克,这里我们封装了一个printPokers方法,将牌号对应到了键值对的扑克

代码

package com.codeslogan.collection;

import java.util.*;

public class PokerTest {
    public static void main(String[] args) {
        String[] colors = {"♠", "♣", "♡", "♢"}; //花色
        String[] nums = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"}; //牌号
        Map<Integer, String> pokers = new HashMap<>(); //记录牌号+花色组合
        List<Integer> list = new ArrayList<>(); //牌序,用于打乱发牌
        List<Integer> player1 = new ArrayList<>(); //玩家
        List<Integer> player2 = new ArrayList<>();
        List<Integer> player3 = new ArrayList<>();
        List<Integer> cards = new ArrayList<>();  //底牌

        //1.买牌,生成54张不同花色的牌
        buyPokers(colors, nums, pokers, list);

        //2.发牌
        Collections.shuffle(list);
        for (int i = 0; i < list.size(); i++) {
            Integer value = list.get(i);
            if (i >= list.size()-3) {
                cards.add(value);
            } else if (i % 3 == 0) {
                player1.add(value);
            } else if (i % 3 == 1) {
                player2.add(value);
            } else if (i % 3 == 2) {
                player3.add(value);
            }
        }

        //3.看牌,将牌号转换为实际牌号+花色
        System.out.println("player1:" + printPokers(player1, pokers));
        System.out.println("player2:" + printPokers(player2, pokers));
        System.out.println("player3:" + printPokers(player3, pokers));
        System.out.println("cards:" + printPokers(cards, pokers));
    }
    public static void buyPokers(String[] colors, String[] nums, Map<Integer, String> pokers, List<Integer> list) {
        int cnt = 0;
        for (String num : nums) { //全排列
            for (String color : colors) {
                String poker = color + num;
                pokers.put(cnt, poker);
                list.add(cnt);
                cnt++;
            }
        }
        pokers.put(cnt, "小王");
        list.add(cnt++);
        pokers.put(cnt, "大王");
        list.add(cnt);
    }

    public static String printPokers(List<Integer> player, Map<Integer, String> pokers) {
        Collections.sort(player); //将牌从小到大排序
        String myPokers = "";
        for (Integer integer : player) {
            String s = pokers.get(integer);
            myPokers = myPokers + s + " ";
        }
        myPokers.trim();
        return myPokers;
    }
}

参考资料

  1. 博学谷Java零基础
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CodeSlogan

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

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

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

打赏作者

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

抵扣说明:

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

余额充值