多方式实现斗地主快速发牌
目录
思路
- 装牌
- 洗牌
- 发牌
- 看牌
- 扑克牌一共包含以下牌
组成:
- 每张牌都是由花色和字母或数字组成的(
大小王
除外)
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();
}
}
- 运行结果
方案二(体验优化)
优化点
- 在方案一中,我们发出来的牌都是乱序的,游戏体验会非常糟糕,因此我们需要把玩家分到的牌进行排序
组成
- 注意这里我们把牌进行编号
- 往
HashMap
集合中存储编号以及对应的扑克牌,同时往ArrayList
集合中存储编号 - 我们需要把
numbers
和colors
的位置换一下 - 注意如果不进行调换会出现以下情况(一种花色的牌排序完成后,才会去排下一种花色)
- 更改后
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();
}
}
看到这里了,点个关注再走吧