实现斗地主游戏,主要分为:准备牌,洗牌,发牌,牌排序这四个步骤。
游戏原理图:
1.准备牌:
我们知道Java数组一旦创建就无法改变大小,而集合可以随时改变,因此我们选型集合中的HashMap
,利用键值对,一一对应(利用Map接口的HashMap类的键值对特性,利用键值来找到相应的value值)
/*
* 1.准备牌:定义一个集合来存储54张扑克牌
* */
// 创建map集合,键值对
HashMap<Integer, String> pokers = new HashMap<>();
// 创建List集合来存储数字编号
List<Integer> pokerNumber = new ArrayList<>();
// 定义两个数组或集合来分别存储花色与数字
String[] colors = {"♥","♣","♦","♠"};
String[] numbers = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
// 初始索引为2,因为大小王会占据索引值0,1
int index = 2;
// 将两组数组两两嵌套,组成一幅扑克牌
for (String number:numbers) {
for (String color:colors) {
pokers.put(index,color+number);
pokerNumber.add(index);
index++;
}
}
// 再把大王,小王存储到pokers集合中,这就组成了一幅完整的牌了
pokers.put(0,"redJoker");
pokerNumber.add(0);
pokers.put(1,"blackJoker");
pokerNumber.add(1);
2.洗牌:
将完整的扑克牌就行洗牌,利用集合静态方法Collections.shuffle(英文就有洗牌之意)
Collections.shuffle(pokerNumber);
3.发牌:
建立四个集合,分别存储四个玩家的牌;遍历pokers集合,获取每一张牌;使用pokers集合的索引%3 个玩家轮流发牌;剩余三张牌给底牌,注意:先判断底牌索引(是否i>=51),否则牌就发完了。
// 定义四个集合来存储玩家的牌和底牌
ArrayList<Integer> player1 = new ArrayList<Integer>();
ArrayList<Integer> player2 = new ArrayList<Integer>();
ArrayList<Integer> player3 = new ArrayList<Integer>();
ArrayList<Integer> bottom = new ArrayList<Integer>();
for(int i = 0;i<pokerNumber.size();i++){
// 获取每一张牌
int p = pokerNumber.get(i);
// 轮流发牌
// 前三张作为底牌
if(i<3){
bottom.add(p);
}else if (i%3 == 0){
player1.add(p);
}else if (i%3 == 1){
player2.add(p);
}else {
player3.add(p);
}
}
// 对玩家手中的编号进行排序
Collections.sort(player1);
Collections.sort(player2);
Collections.sort(player3);
5.排序玩家手中的牌:
public static void look(String name,ArrayList<Integer> player,HashMap<Integer,String> pokers){
System.out.print(name+":");
// 遍历ArrayList集合,获取元素,作为建,到Map集合中查找值
for (Integer key:player) {
String value = pokers.get(key);
System.out.print(value+" ");
}
// 打印换行
System.out.println();
}
/*
* 4.看牌:就是将玩家手中的编号放到map集合中查找,根据键值对
* */
look("周润发",player1, pokers);
look("郭富城",player2, pokers);
look("刘德华",player3, pokers);
look("底牌",bottom, pokers);
}