java多线程发牌 一个发牌 三个玩家_Java集合练习——模拟斗地主发牌

案例∶模拟斗地主发牌

需求:

使用一个集合对象存储一副扑克牌,将所有扑克牌的顺序打乱,然后分发给用集合表示的三个玩家和底牌,并打印玩家和底牌的集合内容。

步骤:

1.买一副扑克牌

将花色和数字分别进行组合,生成所有的普通牌手动添加“大王”、“小王”。

2.洗牌

使用Collections工具类的shuffle()方法打乱牌的顺序。

3.发牌

遍历牌堆,将每一张牌分发到三个玩家集合中留三张作为底牌。

4.看牌

分别打印每个玩家集合的内容。

步骤一买牌

分析:

1.创建数字数组︰

String[] nums =

{"3","4","5","6","7","8","9","10"," J","Q","K","A","2"};

2.创建花色数组:

String[] colors = {"方片","梅花","红桃","黑桃"};

3.将每一个花色分别和数字进行拼接;

colors[i].concat(nums[i]);

复制代码

代码

//1.买牌

//1.1定义一个双列集合,键:表示牌的编号,值:表示具体的牌.规则:编号越小,牌越小.

Map pokers = new HashMap<>() ;

//1.2定义一个单列集合,存储所有牌的编号

List list = new ArrayList<>();

//1.3买牌动作,普通牌52张

String[] colors = {"♠","♥","♣","♦"};

String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};

int num = 0;//牌的编号

//通过嵌套循环造普通牌

for (String number : numbers) {//点数

for (String color : colors) {//花色

String poker = color + number;

//将牌的编号,具体的牌放到双列集合中.

pokers.put(num,poker);

//将牌的编号放到单列集合中.

list.add(num);

//每添加一张牌,编号要自增1.

num++;

}

}

//大小王

//添加小王

pokers.put(num,"小王");

list.add(num++);

//num++;

//大王

pokers.put(num,"大王");

list.add(num++);

//打印牌

System.out.println("所有牌: " + pokers);

System.out.println("所有的编号: " + list);

复制代码

步骤二、三 洗牌发牌

分析:

1.使用Collections工具类的shuffle()方法打乱牌堆集合的顺序;

2.分别创建三个玩家集合对象和底牌集合对象;

3.遍历牌堆的每一张牌,分别将索引对3取模的值为0,1,2的牌存放到三个玩家集合中,将最后三张存放到底牌集合中。

复制代码

代码

//2.洗牌

Collections.shuffle(list);

System.out.println("洗好牌后编号为: "+ list);

//3.发牌

//3.1定义4个集合,分别表示3个玩家,底牌.

List liuyifei = new ArrayList<>();

List zhaoliying = new ArrayList<>();

List xiaohei = new ArrayList<>();

List dipai = new ArrayList<>();

//3.2具体的发牌动作,将索引和3取模,决定发给谁.

for (int i = 0; i < list.size(); i++) {

//获取编号

Integer pokernum = list.get(i);

System.out.println(pokernum);

if(i >= list.size() - 3){

//dipai

dipai.add(pokernum);

} else if(i % 3 == 0){

liuyifei.add(pokernum);

}else if(i % 3 == 1){

zhaoliying.add(pokernum);

}else if(i % 3 == 2){

xiaohei.add(pokernum);

}

}

//3.3查看玩家,底牌的编号.

/*System.out.println("刘亦菲: " + liuyifei);

System.out.println("赵丽颖: " + zhaoliying);

System.out.println("小黑: " + xiaohei);

System.out.println("底牌: " + dipai);*/

复制代码

步骤四 看牌

分析∶

1.将玩家集合中的牌按自然顺序进行排序

Collections.sort(List);

2.打印玩家集合中的牌

3.重复上面的操作打印所有玩家的牌和底牌

复制代码

代码

//4看牌

System.out.println("----------------------");

//String str = printPoker(liuyifei,pokers);

System.out.println("刘亦菲: " + printPoker(liuyifei,pokers));

System.out.println("赵丽颖: " + printPoker(zhaoliying,pokers));

System.out.println("小黑: " + printPoker(xiaohei,pokers));

System.out.println("底牌: " + printPoker(dipai,pokers));

----------------------------------------------------------------

/**

* 4.定义一个方法看牌

* 方法名:printPoker

* 参数列表: List, Map

* 返回值:String

*/

public static String printPoker(List nums, Map pokers){

//1.对牌的编号进行升序排列.

Collections.sort(nums);

//2.遍历牌的编号集合,获取到每一个编号.

StringBuilder sb = new StringBuilder();

for (Integer num : nums) {//num就是要查找的具体牌的编号

//3.根据编号去双列集合中查找该编号对应的具体牌.

String poker = pokers.get(num);

//4.将获取到的牌进行拼接

sb.append(poker + " ");

}

//5.将最后拼接结果返回即可.

String str = sb.toString();

return str.trim();

}

复制代码

完整代码

package cn.itcast.demo1;

import java.util.*;

/**

* 需求;模拟斗地主发牌

*/

public class SendPokerTest {

public static void main(String[] args) {

//1.买牌

//1.1定义一个双列集合,键:表示牌的编号,值:表示具体的牌.规则:编号越小,牌越小.

Map pokers = new HashMap<>() ;

//1.2定义一个单列集合,存储所有牌的编号

List list = new ArrayList<>();

//1.3买牌动作,普通牌52张

String[] colors = {"♠","♥","♣","♦"};

String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};

int num = 0;//牌的编号

//通过嵌套循环造普通牌

for (String number : numbers) {//点数

for (String color : colors) {//花色

String poker = color + number;

//将牌的编号,具体的牌放到双列集合中.

pokers.put(num,poker);

//将牌的编号放到单列集合中.

list.add(num);

//每添加一张牌,编号要自增1.

num++;

}

}

//大小王

//添加小王

pokers.put(num,"小王");

list.add(num++);

//num++;

//大王

pokers.put(num,"大王");

list.add(num++);

//打印牌

System.out.println("所有牌: " + pokers);

System.out.println("所有的编号: " + list);

//2.洗牌

Collections.shuffle(list);

System.out.println("洗好牌后编号为: "+ list);

//3.发牌

//3.1定义4个集合,分别表示3个玩家,底牌.

List liuyifei = new ArrayList<>();

List zhaoliying = new ArrayList<>();

List xiaohei = new ArrayList<>();

List dipai = new ArrayList<>();

//3.2具体的发牌动作,将索引和3取模,决定发给谁.

for (int i = 0; i < list.size(); i++) {

//获取编号

Integer pokernum = list.get(i);

System.out.println(pokernum);

if(i >= list.size() - 3){

//dipai

dipai.add(pokernum);

} else if(i % 3 == 0){

liuyifei.add(pokernum);

}else if(i % 3 == 1){

zhaoliying.add(pokernum);

}else if(i % 3 == 2){

xiaohei.add(pokernum);

}

}

//3.3查看玩家,底牌的编号.

/*System.out.println("刘亦菲: " + liuyifei);

System.out.println("赵丽颖: " + zhaoliying);

System.out.println("小黑: " + xiaohei);

System.out.println("底牌: " + dipai);*/

//4看牌

System.out.println("----------------------");

//String str = printPoker(liuyifei,pokers);

System.out.println("刘亦菲: " + printPoker(liuyifei,pokers));

System.out.println("赵丽颖: " + printPoker(zhaoliying,pokers));

System.out.println("小黑: " + printPoker(xiaohei,pokers));

System.out.println("底牌: " + printPoker(dipai,pokers));

}

/**

* 4.定义一个方法看牌

* 方法名:printPoker

* 参数列表: List, Map

* 返回值:String

*/

public static String printPoker(List nums, Map pokers){

//1.对牌的编号进行升序排列.

Collections.sort(nums);

//2.遍历牌的编号集合,获取到每一个编号.

StringBuilder sb = new StringBuilder();

for (Integer num : nums) {//num就是要查找的具体牌的编号

//3.根据编号去双列集合中查找该编号对应的具体牌.

String poker = pokers.get(num);

//4.将获取到的牌进行拼接

sb.append(poker + " ");

}

//5.将最后拼接结果返回即可.

String str = sb.toString();

return str.trim();

}

}

复制代码

结果展示

刘亦菲: ♠3 ♣3 ♦3 ♠5 ♥7 ♣7 ♠8 ♦8 ♠9 ♠J ♥Q ♠K ♥K ♦K ♠A ♣A ♠2

赵丽颖: ♥3 ♥4 ♥6 ♦6 ♠7 ♦7 ♥8 ♥9 ♦9 ♠10 ♥10 ♣10 ♦J ♣K ♥A 小王 大王

小黑: ♠4 ♣4 ♦4 ♥5 ♣5 ♣6 ♣8 ♣9 ♦10 ♥J ♣J ♣Q ♦Q ♦A ♥2 ♣2 ♦2

底牌: ♦5 ♠6 ♠Q

复制代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值