上一篇,我们学习了Collections这个集合工具类,其中有一个方法是随机置换元素位置。关于随机置换位置,生活中,在玩扑克牌中就有洗牌这个功能,这个过程就是随机置换。这篇,我们来写一个模拟三人斗地主的集合编程练习题。
1.分析步骤
1)需要买一副扑克牌,我们自己想办法把54张牌存储到集合中
2)洗牌,在Collections这个类下有shuffle()方法支持洗牌
3)发牌,注意留三张底牌,三个人没人拿17张,每个人牌需要放集合存储
4)看牌,直接三个人和底牌的集合都打印出来。
2.代码实现
下面需要注意数组嵌套遍历拼接52张扑克牌的过程和三人发牌的机制。
package collections;
import java.util.ArrayList;
import java.util.Collections;
public class Demo1_Collections {
public static void main(String[] args) {
//1.构造一副扑克牌
//先利用两个字符数组,存储52张牌,大小王后面想办法存储到集合
String[] num = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
String[] paise = {"红桃","黑桃","方片","梅花"};
ArrayList poker = new ArrayList<>();
for(int i = 0; i < paise.length ; i++) {
for(int j=0 ; j < num.length ; j++) {
poker.add(paise[i].concat(num[j]));
}
}
poker.add("大王");
poker.add("小王");
//System.out.println(list);
//System.out.println(list.size());
//2.洗牌
Collections.shuffle(poker);
System.out.println(poker);
//3.发牌
ArrayList zhangsan = new ArrayList<>();
ArrayList lisi = new ArrayList<>();
ArrayList wangwu = new ArrayList<>();
ArrayList dipai = new ArrayList<>();
for(int i = 0; i < poker.size(); i++) {
if( i >= poker.size() - 3) {
dipai.add(poker.get(i)); //最后三张牌放入dipai集合
}else if( i % 3 == 0) {
zhangsan.add(poker.get(i));
}else if (i % 3 == 1) {
lisi.add(poker.get(i));
}else {
wangwu.add(poker.get(i));
}
}
// 4.看每个人的牌
System.out.println("--------------------------");
System.out.println("zhangsan:"+zhangsan);
System.out.println("lisi:"+lisi);
System.out.println("wangwu:"+wangwu);
System.out.println("dipai:"+dipai);
}
}
运行结果:
[方片7, 梅花3, 方片J, 红桃Q, 方片4, 方片3, 梅花8, 红桃4, 黑桃3, 黑桃K, 红桃6, 黑桃8, 梅花6, 方片9, 红桃2, 黑桃A, 方片2, 黑桃Q, 红桃9, 黑桃10, 红桃5, 梅花5, 黑桃4, 方片5, 黑桃J, 红桃J, 黑桃7, 大王, 红桃3, 红桃K, 方片A, 梅花K, 梅花J, 梅花9, 梅花A, 黑桃9, 黑桃2, 红桃7, 方片10, 红桃8, 梅花Q, 方片Q, 方片6, 方片8, 梅花7, 红桃10, 黑桃6, 梅花10, 梅花2, 小王, 黑桃5, 梅花4, 红桃A, 方片K]
--------------------------
zhangsan:[方片7, 红桃Q, 梅花8, 黑桃K, 梅花6, 黑桃A, 红桃9, 梅花5, 黑桃J, 大王, 方片A, 梅花9, 黑桃2, 红桃8, 方片6, 红桃10, 梅花2]
lisi:[梅花3, 方片4, 红桃4, 红桃6, 方片9, 方片2, 黑桃10, 黑桃4, 红桃J, 红桃3, 梅花K, 梅花A, 红桃7, 梅花Q, 方片8, 黑桃6, 小王]
wangwu:[方片J, 方片3, 黑桃3, 黑桃8, 红桃2, 黑桃Q, 红桃5, 方片5, 黑桃7, 红桃K, 梅花J, 黑桃9, 方片10, 方片Q, 梅花7, 梅花10, 黑桃5]
dipai:[梅花4, 红桃A, 方片K]
这个结果看起来,很好玩,真的模仿了斗地主的过程。唯一的就是三个人看牌(斗地主中明牌)的时候,集合元素没有进行排序控制输出,例如张三牌应该3最小放左边,大王最大,放最右边。这样的排序机制,目前我们光使用ArrayList是模拟不出这个纸牌游戏的自动排序的功能。