Java 扑克牌游戏-洗牌发牌

Java 扑克牌游戏-洗牌发牌

背景

在上一篇《Java 扑克牌》的基础上再加要求,利用已有的洗牌类,继续完成新的需求

简述

在上次扑克牌的基础上(即生成一副扑克牌,没有大小王,然后洗牌),有三个玩家,然后就洗好的牌依次发给各个玩家,输出三个玩家手上的牌

基本思路

1、将洗好的牌发给三个玩家(分别为player_A、player_B、player_C);
2、发牌的过程:将52张牌发给三个玩家,循环直至发完,并且要分别记录三个玩家的牌
3、输出三个玩家的牌

思路分析

发牌过程大家一想就懂,三个人,循环发就行了,说是这么说,但是代码实现呢?
关键点:几个循环?循环什么?怎么循环?
第一:有三个玩家(也可以n个玩家),那就得循环给三个玩家发牌,对人循环;
第二:既然是发牌,那么就有循环发牌;
所以循环两个,分别循环玩家和牌。
那么怎么循环?循环的条件是什么?
52张牌,3个玩家,3个为一轮发牌,那么52张牌就得发18 = [(52/3)+1]轮(为什么+1,因为52除以3有余数,此处为一坑点),如果玩家为n,就自行判断是否需要+1。
由此可知,先循环牌,再循环玩家,直至发完(这里需要注意:发完也就是52张牌全发出去,但是两重循环,18*3=54,是超出一副牌的数量的,所以在循环中记得加上牌数量的条件限制)

代码块
import java.util.*;

public class PukepaiGame {
	public static void main(String args[]) {
		/** 获取已洗好的牌**/
		List<Card> initCards = shuffleList();
		/** 声明玩家 **/
		String players[] = {"player_A","player_B","player_C"};
		/** 声明玩家的牌 **/
		List<Card> playerA_List = new ArrayList();
		List<Card> playerB_List = new ArrayList();
		List<Card> playerC_List = new ArrayList();
		int k = 0; /** 记录发牌的下标 **/
		int num; /** 记录发牌循环次数 **/
		if (initCards.size()%players.length == 0){
			num = initCards.size()/players.length;
		} else {
			num = (initCards.size()/players.length)+1;
		}
		for(int i=0;i<num;i++){
			for(int j=0;j<players.length && k<initCards.size();j++){	
				if (("player_A").equals(players[j])){
					playerA_List.add(initCards.get(k));
				} else if (("player_B").equals(players[j])){
					playerB_List.add(initCards.get(k));
				} else if (("player_C").equals(players[j])){
					playerC_List.add(initCards.get(k));
				}
				k++;
			}
		}
		System.out.println("洗牌后:" + initCards.size());
        for (int j = 0; j < initCards.size(); j++) {
            System.out.printf(initCards.get(j).toString() + " ");
        }
		System.out.println("\n玩家A的牌:" + playerA_List.size() );
		for (int j = 0; j < playerA_List.size(); j++) {
            System.out.printf(playerA_List.get(j).toString() + " ");
        }
		System.out.println("\n玩家B的牌:" + playerB_List.size());
		for (int j = 0; j < playerB_List.size(); j++) {
            System.out.printf(playerB_List.get(j).toString() + " ");
        }
		System.out.println("\n玩家C的牌:" + playerC_List.size());
		for (int j = 0; j < playerC_List.size(); j++) {
            System.out.printf(playerC_List.get(j).toString() + " ");
        }
		
	}
    private static List<Card> shuffleList() {
        /** 牌面类型 */
        String type[] = {"红桃", "方块", "梅花", "黑桃"};
        /** 牌面大小 */
        String size[] = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
        /** 存放52张牌 */
        List<Card> list = new ArrayList();
        for (int i = 0; i < type.length; i++) {
            for (int j = 0; j < size.length; j++) {
                list.add(new Card(type[i],size[j]));
            }
        }
        /** 洗牌 */
        Collections.shuffle(list);
        /** 返回洗牌结果 */
		return list;
    }
}

class Card {

	/**
	 * 牌面类型
	 */
    private String type;
	/**
	 * 牌面大小
	 */
    private String size;

    Card(String type, String size){
		this.type = type;
		this.size = size;
	}
	
	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
        sb.append(type);
        sb.append(size);
		return sb.toString();
	}

}
测试结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值