我们知道再学习完数组之后,与之类似又比之精妙的集合出现了。其中附带了许多种方法方便了我们对其中的值和索引进行各种操作,这也方便了我们实现斗地主的过程。
首先我们要准备一副牌,这副牌由大小王和52张牌组成,那我们首先定义四种花色,红桃♥、黑桃♠、方片♦、梅花♣。再定义由2~A的十三张数字牌。将花色和数字牌搭配起来,再加上两个王就得到了一副完整的扑克牌。
我们拿到一副牌之后需要进行洗牌,用collections中的shuffle方法即可实现洗牌效果。洗牌之后我们要给三名玩家发牌,并且留三张地主牌。之后我们要根据一定的规则选出地主,我的规则是选择的是持有♥3的玩家当地主。选完地址之后,将那三张牌给这名玩家。
接着我们给这三名玩家整理牌的顺序,此时会有一个难点。就是说我们的扑克牌是花色+数字 的搭配,那么我们牌肯定不按照花色来排序,所以首先排除掉花色的干扰,可以用subString的方法对字符串行截取,得到后面数字。得到后面的数字后,仍然有一个问题,我们所谓的3,4,5……和J,Q,K,A的大小和编译器所认为的3,4,5……和J,Q,K,A的大小并不是一致的。因此我们不能按照数值的大小来排序,既然如此,那么我们在定义数字的时候默认按照升序的顺序排列。比较他们的下表大小即可得到牌面之间的大小。我用的是数组和集合的方式来存储这有序序列,也可以用Map集合来排列,将key键定义成大小顺序,元素按照key键排序即可得到有序的排列。排序方式为了简单,采用了冒泡排序来依次对玩家的牌排序。
代码如下,后面让他们斗地主的我觉得太麻烦,不写了。毕竟和我们的集合知识关系不大,本代码主要为了练习集合的使用。
public class BeatLandlord {
//定义给玩家牌排序的方法。
public ArrayList<String> sortPokers(ArrayList<String> player, ArrayList<String> another){
//遍历玩家的扑克牌
//冒泡排序:
//模仿冒泡排序的方法,排序
//先拿出大王小王 否则影响排序
boolean flag1 = player.remove("bigJoker");
boolean flag2 = player.remove("minJoker");
for (int j = 0; j < player.size()-1; j++) {
for (int k = 0; k < player.size()-1-j; ++k) {
if (another.indexOf(player.get(k).substring(1)) > another.indexOf(player.get(k + 1).substring(1))) {
String temp = player.get(k);
player.set(k,player.get(k+1));
player.set(k+1,temp);
}
}
}
if (flag2)player.add("minJoker");
if (flag1)player.add("bigJoker");
return player;
}
public static void main(String[] args) {
//准备一桌牌
//定义三个玩家、
//给玩家发牌
//给牌排序投好
//让他们抢地主
//准备牌
String[] color = new String[]{"♥", "♠", "♦", "♣"};
String[] number = new String[]{"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
ArrayList<String> pokers = new ArrayList<>();
//先将大小王放入数组
pokers.add("bigJoker");
pokers.add("minJoker");
//将剩下五十二张牌放入poker中
int count = 0;//记牌器
for (int i = 0; i < color.length; i++) {
for (int j = 0; j < number.length; j++) {
pokers.add(color[i] + number[j]);
}
}
System.out.println(pokers);
//洗牌,多洗几遍
Collections.shuffle(pokers);
Collections.shuffle(pokers);
Collections.shuffle(pokers);
Collections.shuffle(pokers);
//定义三个玩家
ArrayList<String> player1 = new ArrayList<>();
ArrayList<String> player2 = new ArrayList<>();
ArrayList<String> player3 = new ArrayList<>();
//给三个玩家发牌
int beauty = 0;//性感荷官在线发牌
while (beauty < pokers.size() - 3) {
player1.add(pokers.get(beauty++));
player2.add(pokers.get(beauty++));
player3.add(pokers.get(beauty++));
}
//发牌结束,剩下地主牌
List<String> pokerOfLandlord = pokers.subList(beauty - 1, pokers.size() - 1);
//选地主,红桃3在哪里谁就是地主
ArrayList<Integer> heart3 = new ArrayList<>();
heart3.add(player1.indexOf("♥3"));
heart3.add(player2.indexOf("♥3"));
heart3.add(player3.indexOf("♥3"));
int i = 0;
for (; i < heart3.size(); i++) {
if (heart3.get(i) >= 0) {
break;
}
}
switch (i + 1) {
case 1:
player1.addAll(pokerOfLandlord);
break;
case 2:
player2.addAll(pokerOfLandlord);
break;
case 3:
player3.addAll(pokerOfLandlord);
break;
default:
}
System.out.println("玩家" + (i + 1) + "成为地主");
System.out.println("整理牌之前:");
System.out.println(player1);
System.out.println(player2);
System.out.println(player3);
//给三个玩家整理牌
//定义一个集合让他存放number数组的元素,以方便操作
ArrayList<String> another = new ArrayList<>();
for (int i1 = 0; i1 < number.length; i1++) {
another.add(number[i1]);
}
//开始整理
BeatLandlord bl = new BeatLandlord();
player1 = bl.sortPokers(player1,another);
player2 = bl.sortPokers(player2,another);
player3 = bl.sortPokers(player3,another);
System.out.println("排序后的牌是:");
System.out.println(player1);
System.out.println(player2);
System.out.println(player3);
}
}