使用Java集合模拟斗地主洗牌发牌
分析:
一共要实现四个步骤:
1.获得一副新牌
一副新牌包含三个属性:
花色:黑桃,红桃,梅花,方块(♠,♥,♣,♦)
点数:A,2,3,4,5,6,7,8,9,10,J,Q,K
王牌:小王、大王
2.洗牌
新牌是按照从小到大排好的,为保证游戏公平,所以要把牌的顺序洗乱
3.发牌
把洗好的牌分到玩家守正,并留下三张作为底牌
三位玩家:叶凡,庞博,无始
4.看牌
显示每个玩家的牌,以及底牌
代码实现
1.获得一副新牌
//创建集合,牌盒
List<String> Poker =new ArrayList<String>();
//创建花色集合
List<String> color=new ArrayList<String>();
//创建数字集合
List<String> number=new ArrayList<String>();
创建三个List集合,Poker、color、number分别用来存储所有的扑克、四种花色、所有的点数
//添加花色
color.add("♠");
color.add("♥");
color.add("♣");
color.add("♦");
//添加数字
number.add("A");
number.add("2");
number.add("3");
number.add("4");
number.add("5");
number.add("6");
number.add("7");
number.add("8");
number.add("9");
number.add("10");
number.add("J");
number.add("Q");
number.add("K");
//将牌装入牌盒
for(int x=0;x<color.size();x++) {
for(int i=0;i<number.size();i++) {
String s=color.get(x).concat(number.get(i));
Poker.add(s);
}
}
Poker.add("大王");
Poker.add("小王");
在完成color、number集合后,再生成所有的牌,最后再把大小王加入。最后结果:
[♠A, ♠2, ♠3, ♠4, ♠5, ♠6, ♠7, ♠8, ♠9, ♠10, ♠J, ♠Q, ♠K, ♥A, ♥2, ♥3, ♥4, ♥5, ♥6, ♥7, ♥8, ♥9, ♥10, ♥J, ♥Q, ♥K, ♣A, ♣2, ♣3, ♣4, ♣5, ♣6, ♣7, ♣8, ♣9, ♣10, ♣J, ♣Q, ♣K, ♦A, ♦2, ♦3, ♦4, ♦5, ♦6, ♦7, ♦8, ♦9, ♦10, ♦J, ♦Q, ♦K, 大王, 小王]
2.洗牌
使用Collections中的shuffle()方法进行洗牌
Collections.shuffle(Poker);
洗完之后:
[♣8, ♦2, ♠J, ♠4, 大王, ♦6, ♦9, ♥8, ♠K, ♠A, ♠7, ♦J, ♥5, ♣J, ♣Q, ♠9, ♥K, ♥Q, ♣9, ♦10, ♥6, ♣7, ♣10, ♠6, ♦K, ♣K, ♥J, 小王, ♥9, ♦7, ♣6, ♥A, ♣3, ♥2, ♦A, ♥10, ♠Q, ♠2, ♣5, ♠5, ♦4, ♦8, ♠8, ♣2, ♦5, ♥3, ♥7, ♣4, ♣A, ♦Q, ♠10, ♥4, ♦3, ♠3]
可以看到,此时牌的顺序已经被完全打乱
3.发牌
把已经打乱的牌发到玩家手中,并留下三张作为底牌:
//创建三个玩家,以及底牌
List<String> yeFan=new ArrayList<String>();
List<String> pangBo=new ArrayList<String>();
List<String> wuShi=new ArrayList<String>();
//创建底牌
List<String> diPai=new ArrayList<String>();
//发牌
for(int i=0;i<Poker.size();i++) {
//如果只剩最后三张
if(i>=Poker.size()-3) {
diPai.add(Poker.get(i));
}else if(i%3==0) {
yeFan.add(Poker.get(i));
}else if(i%3==1) {
pangBo.add(Poker.get(i));
}else if(i%3==2){
wuShi.add(Poker.get(i));
}
}
4.看牌
输出每个玩家以及底牌:
System.out.println("叶凡的牌:"+yeFan);
System.out.println("庞博的牌:"+pangBo);
System.out.println("无始的牌:"+wuShi);
System.out.println("底牌:"+diPai);
输出结果:
叶凡的牌:[♣8, ♠4, ♦9, ♠A, ♥5, ♠9, ♣9, ♣7, ♦K, 小王, ♣6, ♥2, ♠Q, ♠5, ♠8, ♥3, ♣A]
庞博的牌:[♦2, 大王, ♥8, ♠7, ♣J, ♥K, ♦10, ♣10, ♣K, ♥9, ♥A, ♦A, ♠2, ♦4, ♣2, ♥7, ♦Q]
无始的牌:[♠J, ♦6, ♠K, ♦J, ♣Q, ♥Q, ♥6, ♠6, ♥J, ♦7, ♣3, ♥10, ♣5, ♦8, ♦5, ♣4, ♠10]
底牌:[♥4, ♦3, ♠3]
可以看到,现在每个人手中都有17张牌,且留下三张作为底牌。
但是,此时每个人手中的派都是乱序的,很难看出自己的牌是好是坏。所以,我们就想到给每个人手中的牌进行排序,但是应该怎么排序呢?
由于扑克牌中的点数并不是全部由数字构成的,所以没有办法使用自然排序,比较器排序倒是可以实现,只不过会很麻烦。那么还有没有其他办法呢?
我们可以这么想,既然每张牌本身没有办法进行排序,那我们能不能给每一张牌都指定一个序号呢?序号从小到大刚好对应了每张牌的从小到大。比如:
0————对应————黑桃3
1————对应————红桃3
2————对应————梅花3
3————对应————方块3
4————对应————黑桃4
5————对应————红桃4
6————对应————梅花4
7————对应————方块4
.。。。。
52————对应————小王
53————对应————大王
如此一来,我们就可以根据每张牌对应的序号,来对所有的牌进行排序了。
开始代码实现:
1.获得一副新牌
与第一次不同的是,这次我们除了要创建三个List集合来存储牌以外,我们还需要用一个Map集合来存储序号和牌之间的对应关系。而且,这一次在Poker集合中存储的是牌的序号而不是牌。
//创建Map集合,存储牌和序号
HashMap<Integer,String> haPoker=new HashMap<Integer, String>();
//创建集合,牌盒,因为存储的是序号,所以是Integer类型
List<Integer> Poker =new ArrayList<Integer>();
//创建花色集合
List<String> color=new ArrayList<String>();
//创建数字集合
List<String> number=new ArrayList<String>();
//添加花色
color.add("♠");
color.add("♥");
color.add("♣");
color.add("♦");
//添加数字
number.add("3");
number.add("4");
number.add("5");
number.add("6");
number.add("7");
number.add("8");
number.add("9");
number.add("10");
number.add("J");
number.add("Q");
number.add("K");
number.add("A");
number.add("2");
//牌的序号
int index=0;
//将牌装入牌盒
//在这里要注意,这一次我们是按照点数排序,不同花色,相同点数的牌是在一起的,所以这一次的循环嵌套跟第一次的是不一样的
for(int x=0;x<number.size();x++) {
for(int i=0;i<color.size();i++) {
String s=color.get(i).concat(number.get(x));
haPoker.put(index, s);
Poker.add(index);
index++;
}
}
haPoker.put(index, "小王");
Poker.add(index);
index++;
haPoker.put(index, "大王");
Poker.add(index);
此时Poker中是这样的:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53],跟第一次不同这一次里面存储的只是序号。
2.洗牌
//洗牌
Collections.shuffle(Poker);
Poker:[16, 29, 24, 26, 17, 48, 5, 52, 10, 2, 28, 18, 3, 15, 19, 38, 41, 44, 53, 25, 46, 47, 50, 33, 43, 8, 13, 30, 11, 39, 22, 0, 51, 7, 1, 34, 31, 42, 9, 21, 49, 45, 36, 14, 35, 6, 37, 32, 40, 20, 12, 27, 23, 4]
3.发牌
//创建三个玩家,以及底牌
//玩家存储的也是序号,而不是牌
List<Integer> yeFan=new ArrayList<Integer>();
List<Integer> pangBo=new ArrayList<Integer>();
List<Integer> wuShi=new ArrayList<Integer>();
List<Integer> diPai=new ArrayList<Integer>();
//发牌
for(int i=0;i<Poker.size();i++) {
if(i>=Poker.size()-3) {
diPai.add(Poker.get(i));
}else if(i%3==0) {
yeFan.add(Poker.get(i));
}else if(i%3==1) {
pangBo.add(Poker.get(i));
}else if(i%3==2){
wuShi.add(Poker.get(i));
}
}
4.看牌
//排序
Collections.sort(diPai);
Collections.sort(yeFan);
Collections.sort(pangBo);
Collections.sort(wuShi);
System.out.print("叶凡的牌:");
for(int x=0;x<yeFan.size();x++) {
System.out.print(haPoker.get(yeFan.get(x))+",");
}
System.out.println();
System.out.print("庞博的牌:");
for(int x=0;x<pangBo.size();x++) {
System.out.print(haPoker.get(pangBo.get(x))+",");
}
System.out.println();
System.out.print("无始的牌:");
for(int x=0;x<wuShi.size();x++) {
System.out.print(haPoker.get(wuShi.get(x))+",");
}
System.out.println();
System.out.print("底牌:");
for(int x=0;x<diPai.size();x++) {
System.out.print(haPoker.get(diPai.get(x))+",");
}
System.out.println();
因为玩家的集合中存储的是序号,所以可以直接用Collections.sort();进行自然排序。
结果:
叶凡的牌:♣3,♦3,♥4,♣4,♦4,♠7,♥8,♣8,♣9,♣10,♦10,♠Q,♣Q,♠K,♦K,♦A,大王,
庞博的牌:♠3,♥3,♠5,♦5,♣6,♦6,♥7,♠8,♥9,♠10,♥10,♥Q,♥K,♣K,♥2,♣2,小王,
无始的牌:♥5,♣5,♠6,♥6,♣7,♦7,♠9,♠J,♥J,♣J,♦J,♦Q,♠A,♥A,♣A,♠2,♦2,
底牌:♠4,♦8,♦9,
此时我们可以看到,每个玩家手里的牌都已经是有序的了,一眼就可以看出自己的牌是好是坏。可以愉快的开始玩游戏了。