实现代码和解释如下:
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
public class Poker {
//利用不同集合的特点,完成简单的扑克牌游戏(三人挖坑)
/*基础信息:54张牌,A-K共13个点数,每个点数4中花色,大王,小王。
* 功能:洗牌,发牌,看牌
* 存储牌:
* 用编号来标记54张牌,并且符合挖坑这种牌的大小规则,所以用K-V形式存储,即我们用一个HashMap存牌
* 花色默认顺序,黑红梅方
* 洗牌
* 洗牌的动作就是将牌的顺序打乱,所以我们用ArrayList来存储这些牌的编号即可,用Collections集合工具类中
* 随机置换shuffle()方法来完成
* 发牌
* 发牌就是把这些牌一张一张发给三个人,为了保证他们手上的牌不是杂乱无序的,我们用TreeSet集合来存储,
* 所以我们发的也就是牌的编号
* 看牌
* 此时我们根据他们手中的编号即map中的键值来获取对应的值,就得到了最后的牌
*
*
* */
public static void main(String[] args) {
// TODO 自动生成的方法存根
//创建花色和点数数组,生成牌
String [] flower= {"♠","♥","♣","◇"};
String [] count= {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
String [] pokers=new String[54];
int num=0;
//生成牌
for(int i=0;i<count.length;i++) {
for(int j=0;j<flower.length;j++)
{
pokers[num++]=flower[j]+count[i];
}
}
pokers[num++]="小王";
pokers[num++]="大王";
// for(int k=0;k<pokers.length;k++) {
// System.out.print(pokers[k]+" ");
// }
//创建HashMap存储牌
HashMap<Integer,String> map=new HashMap<Integer,String>();
for(int key=0;key<pokers.length;key++) {
map.put(key,pokers[key]);
}
//System.out.println();
// Set<Integer> k=map.keySet();
// for(Integer key:k) {
//
// System.out.print(key+"-----"+map.get(key)+" ");
// }
//System.out.println();
//创建一个ArrayList用来存储牌
ArrayList<Integer> list=new ArrayList<Integer>();
Set<Integer> keys=map.keySet();
for(Integer key:keys) {
list.add(key);
}
// for(int p=0;p<list.size();p++)
// {
// System.out.print(list.get(p)+" ");
// }
//执行洗牌方法,用Collections工具类的shuffle()实现,该方法随机交换数组里面的元素。
Collections.shuffle(list);
// for(int p=0;p<list.size();p++)
// {
// System.out.print(list.get(p)+" ");
// }
//发牌,为了保证每个人接受的牌是有序的,我们使用TreeSet接受,TreeSet有排序功能
TreeSet<Integer> person1=new TreeSet<Integer>();
TreeSet<Integer> person2=new TreeSet<Integer>();
TreeSet<Integer> person3=new TreeSet<Integer>();
TreeSet<Integer> dipai=new TreeSet<Integer>();
int n=0;//用来记录发出去牌的张数
//给三个人发牌
for(int i=0;i<list.size();i++) {
if(list.size()-n>3) {//留三张底牌(总共就54张牌,留三张底牌,就是只发51张牌出去)
if(i%3==0)
person1.add(list.get(i));
if(i%3==1)
person2.add(list.get(i));
if(i%3==2)
person3.add(list.get(i));
n++;
}
}
//不管牌的顺序怎么变,list中51,52,53位置的牌是底牌(注意不是牌的编号)
//总共就54张牌,留三张底牌,就是只发51张牌出去
while(n<list.size()) {
dipai.add(list.get(n));
n++;
}
//System.out.println("--------------------------------");
//看牌,遍历TreeSet
Iterator<Integer> it1=person1.iterator();
System.out.print("第一个人的牌是:");
while(it1.hasNext()) {
System.out.print(map.get(it1.next())+" ");
}
System.out.println();
//使用迭代器遍历
Iterator<Integer> it2=person2.iterator();
System.out.print("第二个人的牌是:");
while(it2.hasNext()) {
System.out.print(map.get(it2.next())+" ");
}
System.out.println();
Iterator<Integer> it3=person3.iterator();
System.out.print("第三个人的牌是:");
while(it3.hasNext()) {
System.out.print(map.get(it3.next())+" ");
}
System.out.println();
Iterator<Integer> it=dipai.iterator();
System.out.print("底牌是:");
while(it.hasNext()) {
System.out.print(map.get(it.next())+" ");
}
}
}
执行结果:(每次不同)
- 以下是三次运行结果
(个人学习总结,仅供参考,不好或不对的地方请指正)