集合终极小练习:模拟斗地主的洗牌、发牌与看牌
本节我们将集合作以回顾复习,用集合方面的知识来完成模拟斗地主的洗牌发牌与看牌的操作。在进行这个小练习之前,我们还需要将Java中Collection集合中Collections工具类的方法作以介绍。
1.Collection工具类概述与常见方法介绍
Collections类概述:针对单列集合操作的工具类。
Collections成员方法 | 作用 |
---|---|
public static void sort(List list) | 排序,默认按照自然顺序 |
public static int binarySearch(List<?> list,T key) | 二分查找 |
public static void reverse(List<?> list) | 反转 |
public static void shuffle(List<?> list) | 随机置换 |
Collections工具类中的成员方法
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class MyTest {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(300);
list.add(200);
list.add(400);
list.add(500);
list.add(100);
//将集合中的元素按照从小到大的顺序进行排序
Collections.sort(list);
System.out.println(list);
//将集合中的元素按照从大到小的顺序进行排序
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
System.out.println(list);
//public static <T> int binarySearch(List<?> list,T key):二分查找
//二分查找的前提就是元素必须有序
int index = Collections.binarySearch(list, 300);
System.out.println(index);
//public static <T> T max(Collection<?> coll):获取最大值
Integer max = Collections.max(list);
System.out.println(max);
//public static <T> T min(Collection<?> coll):获取最小值
Integer min = Collections.min(list);
System.out.println(min);
//public static void reverse(List<?> list):反转
Collections.reverse(list);
System.out.println(list);
//public static void shuffle(List<?> list):随机置换
Collections.shuffle(list);
System.out.println(list);
}
}
2.模拟斗地主基础版:每个人拿到手牌没有顺序
斗地主,是一种在中国流行的纸牌游戏,游戏由3个玩家进行,用一副54张牌(连鬼牌),其中一方为地主,其余两家为另一方,双方对战,先出完牌的一方获胜。
现用集合来模拟斗地主洗牌发牌与看牌的操作,而且每个人拿到手上的牌没有顺序。
- 实现思路:
- 1.首先创建一个ArrayList集合充当牌盒来存储54张纸牌,使用两个数组(花色数组与字数组)嵌套循环来添加52张普通牌,大小王使用手动自己进行添加。
- 2.洗牌:利用Collections.shuffle()方法将牌盒中牌来进行打乱,实现洗牌的操作。
- 3.发牌:首先创建三个ArrayList集合来存储三个人的手牌,其次还得创建一个ArrayList集合来存储底牌。发牌时需要进行判断,可以对3整除取余,来实现每个人的发牌操作,牌盒中的最后三张牌来充当底牌。
- 4.看牌:抽出一个方法,来看每个人手上的手牌以及底牌。
代码实现:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
public class 斗地主 {
public static void main(String[] args) {
//首先创建牌盒
ArrayList<String> pokerBox = new ArrayList<>();
//牌的组成,花色与数字
//花色
String [] color={"♠","♥","♣","♦"};
//大小
String [] value={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
//添加52张普通牌
for (String s: color) {
for (String s1: value) {
pokerBox.add(s.concat(s1)+" ");
}
}
//System.out.println(pokerBox);
//将大小王手动装入牌盒
pokerBox.add("🐉");
pokerBox.add("🐱");
//System.out.println(pokerBox);
//洗牌
Collections.shuffle(pokerBox);
Collections.shuffle(pokerBox);
Collections.shuffle(pokerBox);
//System.out.println(pokerBox);
//发牌
//定义三个斗地主玩家以及底牌
ArrayList<String> 小明 = new ArrayList<>();
ArrayList<String> 小红 = new ArrayList<>();
ArrayList<String> 小黄 = new ArrayList<>();
ArrayList<String> 底牌 = new ArrayList<>();
//遍历牌盒
for (int i = 0; i < pokerBox.size(); i++) {
if(i>=pokerBox.size()-3){
//当牌为最后三张时,留作底牌
底牌.add(pokerBox.get(i));
}
//对3整除进行取余,来进行分发牌
else if(i%3==0){
小明.add(pokerBox.get(i));
}
else if(i%3==1){
小红.add(pokerBox.get(i));
}
else{
小黄.add(pokerBox.get(i));
}
}
//看牌
lookPoke("小明",小明);
lookPoke("小红",小红);
lookPoke("小黄",小黄);
lookPoke("底牌",底牌);
}
private static void lookPoke(String name, ArrayList<String> list) {
System.out.print(name);
for (String s : list) {
System.out.print(s);
}
System.out.println();
}
}
运行后的结果为:
3.模拟斗地主升级版:每个人拿到的手牌有顺序
模拟斗地主升级版:基于上面的要求,且要求我们实现每个人拿到的手牌和底牌是有顺序的
- 实现思路:
- 1.创建一个HashMap来存储键为索引,值为牌的牌盒,并且创建一个ArrayList索引集合用来存储与HashMap中一一对应的索引值。将52张牌通过花色与大小的组合,将52张带有索引的牌添加到牌盒中,并且手动添加大小网。
- 2.洗牌:通过Collections集合中的shuffle方法来打乱顺序,实现洗牌的操作。这里需要注意的是将索引集合进行打乱。
- 3.发牌:首先创建三个treeset集合来存储三个人的手牌,可以实现对牌的排序,其次还得创建一个treeset集合来存储底牌。发牌时需要进行判断,可以对3整除取余,来实现每个人的发牌操作,牌盒中的最后三张牌来充当底牌。
- 4.看牌:抽出一个方法,来看每个人手上的手牌以及底牌。传入的形参:姓名,最后分别存储牌的集合,以及双列集合牌盒。
图示思路:
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;
public class 斗地主升级版 {
public static void main(String[] args) {
//定义键为Integer类型,值为String类型的双列集合
HashMap<Integer, String> map = new HashMap<>();
//定义索引集合
ArrayList<Integer> indexlist = new ArrayList<>();
//牌的花色
String [] color={"♠","♥","♣","♦"};
//大小
String [] value={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
//定义初始索引
int index=0;
//将花色和大小进行组合,添加52张普通牌
for (String s : value) {
for (String s1 : color) {
map.put(index,s1.concat(s)+" ");
indexlist.add(index);
index++;
}
}
//手动添加大小王
map.put(index,"🐉");
indexlist.add(index);
index++;
map.put(index,"🐱");
indexlist.add(index);
/*System.out.print(map);
System.out.println();
System.out.print(indexlist);
*/
//洗牌
Collections.shuffle(indexlist);
//发牌
TreeSet<Integer> 小明= new TreeSet<>();
TreeSet<Integer> 小黄 = new TreeSet<>();
TreeSet<Integer> 小红 = new TreeSet<>();
TreeSet<Integer> 底牌= new TreeSet<>();
//遍历索引集合,按索引集合中的索引进行发牌
for (int i = 0; i < indexlist.size(); i++) {
if(i>=indexlist.size()-3){
底牌.add(indexlist.get(i));
}
else if(i%3==0){
小明.add(indexlist.get(i));
}else if(i%3==1){
小黄.add(indexlist.get(i));
}else{
小红.add(indexlist.get(i));
}
}
//看牌
lookPoker("小明",小明,map);
lookPoker("小黄",小黄,map);
lookPoker("小红",小红,map);
lookPoker("底牌",底牌,map);
}
private static void lookPoker(String name, TreeSet<Integer> set, HashMap<Integer,String> hashmap) {
//键找值,查看每个人手上的手牌以及底牌
System.out.print(name+": ");
for (Integer i : set) {
System.out.print(hashmap.get(i)+" ");
}
System.out.println();
}
}
运行后的结果:
总结
本节主要以斗地主小案例来对集合部分知识的学习做以回顾,里面用到的集合知识也很基础,关键在于活学活用。