多方式实现斗地主快速发牌
思路
- 装牌
- 洗牌
- 发牌
- 看牌
- 扑克牌一共包含以下牌
♦2,♦3…,♦K,♦A
♣2…♣K,♣A
♠2,♠3…,♠A
♥2…,♥A
大王,小王
方案一
组成:
- 每张牌都是由花色和字母或数字组成的(
大小王
除外)
ArrayList<String> array = new ArrayList<String>();
//通过双重循环的方式将牌插入数组
String[] colors = {
"♦", "♣", "♠", "♥"};
String[] numbers = {
"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
for (String color : colors) {
for (String number : numbers) {
array.add(color + number);
}
}
array.add("大王");
array.add("小王");
洗牌
- 现在需要把数组打乱 ,这里使用
shuffle( )
来打乱 shuffle( )
使用默认随机源随机排列指定列表。所有排列都以大致相等的可能性发生。
Collections.shuffle(array);
发牌
-
众所周知斗地主一共有三个玩家,但是千万不要忘记还要留三张底牌
-
这里有个小技巧,有几个玩家就用几来取模
ArrayList<String> di = new ArrayList<>();
ArrayList<String> min1 = new ArrayList<>();
ArrayList<String> min2 = new ArrayList<>();
ArrayList<String> dipa = new ArrayList<>();
for (int i = 0; i < array.size(); i++) {
String poker = array.get(i);
//留出底牌
if (i >= array.size() - 3) {
dipa.add(poker);
} else if (i % 3 == 0) {
di.add(poker);
} else if (i % 3 == 1) {
min1.add(poker);
} else if (i % 3 == 2) {
min2.add(poker);
}
}
看牌
- 定义看牌方法
public static void lookpuker(String name, ArrayList<String> array) {
System.out.print(name + "的牌是:");
for (String puker : array) {
System.out.print(puker + " ");
}
System.out.println();
}
- 调用方法
lookpuker("唐三", di);
lookpuker("唐昊", min1);
lookpuker("唐晨", min2);
lookpuker("底牌", dipa);
源代码
public class pukeDemo {
public static void main(String[] args) {
ArrayList<String> array = new ArrayList<String>();
//通过双重循环的方式将牌插入数组
String[] colors = {
"♦", "♣", "♠", "♥"};
String[] numbers = {
"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
for (String color : colors) {
for (String number : numbers) {
array.add(color + number);
}
}
array.add("大王");
array.add("小王");
Collections.shuffle(array);
// System.out.println(array);
ArrayList<String> di = new ArrayList<>();
ArrayList<String> min1 = new ArrayList<>();
ArrayList<String> min2 = new ArrayList<>();
ArrayList<String> dipa = new ArrayList<>();
for (int i = 0; i < array.size(); i++) {
String poker = array.get(i);
//留出底牌
if (i >= array.size() - 3) {
dipa.add(poker);
} else if (i % 3 == 0) {
di.add(poker);
} else if (i % 3 == 1) {
min1.add(poker);
} else if (i % 3 == 2) {
min2.add(poker);
}
}
lookpuker("唐三", di);
lookpuker("唐昊", min1);
lookpuker("唐晨", min2);
lookpuker("底牌", dipa);
}
public static void lookpuker(String name, ArrayList<String> array) {
System.out.println(name + "的牌是:");
for (String puker : array) {
System.out.print(puker + " ");
}
System.out.println();
}
}
- 运行结果
唐三
的牌是:♠9 ♣3 ♠8 ♦A ♣4 ♥8 ♠3 ♥K ♣A ♠2 ♦5 ♦2 ♥10 ♥4 ♥7 ♦4 ♠6
唐昊
的牌是:♣7 ♦8 ♥A ♥2 ♦7 ♣2 ♥5 ♥9 ♣6 ♥Q 小王 ♦10 ♠K ♥3 ♠5 ♦3 ♦Q
唐晨
的牌是:♣K ♠Q ♥6 ♠A ♣Q ♠J ♣10 ♣J ♦9 ♦6 ♥J ♠10 ♦J ♠7 ♠4 ♦K ♣9
底牌
的牌是:大王 ♣8 ♣5
方案二(体验优化)
优化点
- 在方案一中,我们发出来的牌都是乱序的,游戏体验会非常糟糕,因此我们需要把玩家分到的牌进行排序
组成
- 注意这里我们把牌进行编号
- 往
HashMap
集合中存储编号以及对应的扑克牌,同时往ArrayList
集合中存储编号 - 我们需要把
numbers
和colors
的位置换一下 - 注意如果不进行调换会出现以下情况(一种花色的牌排序完成后,才会去排下一种花色)
虎牙直播搜麦克
的牌是:
♦4 ♦5 ♦9 ♦K ♣7 ♣9 ♠4 ♠5 ♠7 ♠8 ♠J ♠Q ♠A ♥7 ♥8 ♥9 小王
随缘
的牌是:
♦6 ♦7 ♦10 ♦A ♣10 ♠3 ♠6 ♠10 ♠K ♥3 ♥5 ♥6 ♥J ♥K ♥A ♥2 大王
马花疼
的牌是:
♦3 ♦8 ♦J ♦Q ♦2 ♣3 ♣4 ♣6 ♣8 ♣J ♣Q ♣K ♣2 ♠9 ♥4 ♥10 ♥Q
底牌
的牌是:
♣5 ♣A ♠2
- 更改后
HashMap<Integer, String> hm = new HashMap<>();
ArrayList<Integer> array = new ArrayList<>();
String[] colors = {
"♦", "♣", "♠", "♥"};
String[] numbers = {
"3", "4", "5", "6", "7", "8", "
int indexs = 0;
for (String number : numbers) {
for (String color : colors) {
hm.put(indexs, color + number);
array.add(indexs);
indexs++;
}
}
hm.put(indexs, "大王");
array.add(indexs);
indexs++;
hm.put(indexs, "小王");
array.add(indexs);
洗牌
-
洗的是编号,这里使用
shuffle( )
来打乱 -
shuffle( )
使用默认随机源随机排列指定列表。所有排列都以大致相等的可能性发生。
Collections.shuffle(array);
发牌
- 发的是编号,为了保证扑克牌排好序,创建
TreeSet
集合来接收
//构造一个新的空树集,根据其元素的自然顺序排序。
TreeSet<Integer> di = new TreeSet<>();
TreeSet<Integer> min1 = new TreeSet<>();
TreeSet<Integer> min2 = new TreeSet<>();
TreeSet<Integer> dip = new TreeSet<>();
for (int i = 0; i < array.size(); i++) {
int x = array.get(i);
if (i >= array.size() - 3) {
dip.add(x);
} else if (i % 3 == 0) {
di.add(x);
} else if (i % 3 == 1) {
min1.add(x);
} else if (i % 3 == 2) {
min2.add(x);
}
}
看牌
public static void lookpuker(String name, TreeSet<Integer> ts, HashMap<Integer, String> hm) {
System.out.println(name + "的牌是: ");
for (Integer key : ts) {
String puker = hm.get(key);
System.out.print(puker + " ");
}
System.out.println();
}
源代码
public class pukerplus {
public static void main(String[] args) {
HashMap<Integer, String> hm = new HashMap<>();
ArrayList<Integer> array = new ArrayList<>();
String[] colors = {
"♦", "♣", "♠", "♥"};
String[] numbers = {
"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
int indexs = 0;
for (String number : numbers) {
for (String color : colors) {
hm.put(indexs, color + number);
array.add(indexs);
indexs++;
}
}
hm.put(indexs, "大王");
array.add(indexs);
indexs++;
hm.put(indexs, "小王");
array.add(indexs);
Collections.shuffle(array);
//构造一个新的空树集,根据其元素的自然顺序排序。
TreeSet<Integer> di = new TreeSet<>();
TreeSet<Integer> min1 = new TreeSet<>();
TreeSet<Integer> min2 = new TreeSet<>();
TreeSet<Integer> dip = new TreeSet<>();
for (int i = 0; i < array.size(); i++) {
int x = array.get(i);
if (i >= array.size() - 3) {
dip.add(x);
} else if (i % 3 == 0) {
di.add(x);
} else if (i % 3 == 1) {
min1.add(x);
} else if (i % 3 == 2) {
min2.add(x);
}
}
lookpuker("虎牙直播搜麦克", di, hm);
lookpuker("随缘", min1, hm);
lookpuker("马花疼", min2, hm);
lookpuker("底牌", dip, hm);
}
public static void lookpuker(String name, TreeSet<Integer> ts, HashMap<Integer, String> hm) {
System.out.println(name + "的牌是: ");
for (Integer key : ts) {
String puker = hm.get(key);
System.out.print(puker + " ");
}
System.out.println();
}
}
结果
虎牙直播搜麦克
的牌是:
♣3 ♠3 ♥3 ♥4 ♦5 ♣5 ♦6 ♠6 ♥7 ♣8 ♥9 ♥K ♦A ♣A ♠A ♦2 小王
随缘
的牌是:
♦3 ♠4 ♥6 ♣7 ♠7 ♠8 ♥8 ♦10 ♣10 ♠10 ♥10 ♠J ♣Q ♠Q ♥Q ♣2 大王
马花疼
的牌是:
♣4 ♠5 ♥5 ♣6 ♦7 ♦8 ♠9 ♦J ♣J ♥J ♦Q ♦K ♣K ♠K ♥A ♠2 ♥2
底牌
的牌是:
♦4 ♦9 ♣9
看到这里了,点个关注再走吧