目录
如何利用集合简单实现斗地主发牌和洗牌
1、利用ArrayList简单模拟斗地主的洗牌与发牌
代码如下
2、利用HashMap等模拟斗地主的洗牌与发牌
改进思路如下:
代码如下
运行结果如下
package porker.demo;
import java.util.ArrayList;
import java.util.Collections;
/*
ArrayList模拟斗地主洗牌和发牌
扑克有13个数字
4个花色
额外两个 大王 小王
一共有54张牌
一、创造一副扑克
1、数字 :{"A","2","3","4","5","6","7","8","9","10", "J","Q","K"};
2、花色 :{"方块","黑桃","红桃","梅花"};
3、拼接 数字与花色 并且存入集合中
(4、输出扑克验证)
二、洗牌 (Collections工具类->shuffle方法)
三、发牌
1、创建三个玩家
2、将51张发给三个玩家,并且留三张底牌
四、看牌
*/
public class Porker1 {
public static void main(String[] args) {
// 一、创造一副扑克
// 1、数字 :{"A","2","3","4","5","6","7","8","9","10", "J","Q","K"};
// 2、花色 :{"方块","黑桃","红桃","梅花"};
// 3、拼接 数字与花色 并且存入集合中 (4、输出扑克验证)
String[] color = { "方块", "黑桃", "方片", "梅花" };
String[] num = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
ArrayList poker = new ArrayList<>();
for (String tempocolor : color) {
for (String tempnum : num) {
poker.add(tempocolor.concat(tempnum));
}
}
poker.add("大王");
poker.add("小王");
// System.out.println(poker);
// 二、洗牌 (Collections工具类->shuffle方法)
Collections.shuffle(poker); //此方法可以将集合里面的内容打乱
// System.out.println(poker.size());
// System.out.println(poker);
// 三、发牌
// 1、创建三个玩家
// 2、将51张发给三个玩家,并且留三张底牌
ArrayList hongmao = new ArrayList<>();
ArrayList lantu = new ArrayList<>();
ArrayList pipixia = new ArrayList<>();
ArrayList dipai = new ArrayList<>();
for (int i = 0; i < poker.size(); i++) {
if (i >= poker.size() - 3) { //将最后三张牌留给底牌
dipai.add(poker.get(i));
} else if (i % 3 == 0) { //虹猫 获得第1、4、7、10...张牌
hongmao.add(poker.get(i));
} else if (i % 3 == 1) { //蓝兔 获得第2、5、8、11...张牌
lantu.add(poker.get(i));
} else { //皮皮虾 获得第3、6、9、12...张牌
pipixia.add(poker.get(i));
}
}
// 四、看牌
System.out.println("虹猫:" + hongmao);
System.out.println("蓝兔:" + lantu);
System.out.println("皮皮虾:" + pipixia);
System.out.println("底牌:" + dipai);
}
}
虹猫:[梅花J, 方片7, 方片Q, 黑桃2, 方块8, 方块5, 方块6, 黑桃3, 方片K, 方块A, 方片8, 梅花10, 梅花5, 方块Q, 黑桃4, 梅花A, 方片9]
蓝兔:[黑桃10, 黑桃J, 方块9, 方块J, 方块K, 黑桃K, 黑桃A, 小王, 方片2, 方片3, 方块10, 黑桃5, 梅花4, 方块7, 梅花3, 梅花K, 梅花9]
皮皮虾:[方片4, 梅花Q, 方片10, 梅花6, 方片6, 黑桃7, 方块3, 黑桃9, 方块4, 大王, 梅花7, 黑桃8, 梅花8, 方片J, 方块2, 黑桃6, 黑桃Q]
底牌:[梅花2, 方片5, 方片A]
由以上结果我们可以看出来,发牌后的次序并不友好,并没有实现从小至大自动排序。
我们可以改进下代码,利用其它集合的特性来实现发牌后的自动排序
整体思维与上面大致相同
我们都知道一副扑克一共有54张牌,如果由小到大排序
0 1 2 3 ..... 52 53
l l l l ...... l l
方块3 梅花3 红桃3 黑桃3 小王 大王
- 以上键值对就可以考虑到用HashMap
来存储扑克的索引与其对应的牌面值
- 接着可以用ArrayList
存储扑克的索引值(0,1,2,3,.....,52,53),打乱索引就代表打乱排序也就是洗牌
- 创建三个玩家与底牌对象的时候,由于我们需要实现由小到大排序输出,所以我们可以考虑使用TreeSet
接收洗牌的后所发的牌
- 看牌的时候我们只需要找到TreeSet
所对应的HashMap 的键值即可
package porker.demo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;
/*
模拟斗地主洗牌和发牌
一、创造一副扑克
1、数字 :{"A","2","3","4","5","6","7","8","9","10", "J","Q","K"};
2、花色 :{"方块","黑桃","红桃","梅花"};
3、创建双列集合 HashMap 存储扑克与其索引
4、创建 ArrayList 存储扑克索引
5、拼接 数字与花色 并且存入双列集合 HashMap 中,并将索引添加到 ArrayList
(6、输出扑克验证)
二、洗牌 (Collections工具类->shuffle方法)
三、发牌 (利用 TreeSet 自动排序)
1、创建三个玩家 与 底牌
2、将51张发给三个玩家,并且留三张底牌
四、看牌
1、遍历 TreeSet 的值
2、查看 TreeSet 的值在 HashMap
*/
public class Porker2 {
public static void main(String[] args) {
// 一、创造一副扑克 (由于需要从小到大存入,所以需要注意数字和花色的顺序)
// 1、数字 :{"3","4","5","6","7","8","9","10", "J","Q","K", "A","2"};
// 2、花色 :{"方块","梅花","红桃","黑桃"};
String[] num = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2" };
String[] color = { "方块", "梅花", "红桃", "黑桃" };
// 3、创建存储扑克与其索引的双列集合 HashMap
HashMap hm = new HashMap<>();
int index = 0;
// 4、创建 存储扑克索引的 ArrayList
ArrayList list = new ArrayList<>();
// 5、拼接 数字与花色 并且存入双列集合 HashMap 中,并将索引添加到 ArrayList
for (String tnum : num) {
for (String tcolor : color) {
hm.put(index, tcolor.concat(tnum));
list.add(index);
index++;
}
}
// System.out.println(index);
hm.put(index, "小王");
list.add(index); // 添加小王索引52
index++;
hm.put(index, "大王");
list.add(index); // 添加大王索引53
// (6、输出扑克验证)
// System.out.println(index);
// System.out.println(hm.size());
// System.out.println(hm);
// System.out.println(list);
// 二、洗牌 (Collections工具类->shuffle方法)
Collections.shuffle(list);
// System.out.println(list); //查看洗牌是否生效
// 三、发牌 (利用 TreeSet 自动排序)
// 1、创建三个玩家 与底牌
TreeSet zhouxingchi = new TreeSet<>();
TreeSet liudehua = new TreeSet<>();
TreeSet zhourunfa = new TreeSet<>();
TreeSet dipai = new TreeSet<>();
// 2、将51张发给三个玩家,并且留三张底牌
for (int i = 0; i < list.size(); i++) {
if (i >= list.size() - 3) {
dipai.add(list.get(i));
} else if (i % 3 == 0) {
zhouxingchi.add(list.get(i));
} else if (i % 3 == 1) {
liudehua.add(list.get(i));
} else {
zhourunfa.add(list.get(i));
}
}
// 四、看牌
lookPorker(hm, zhouxingchi, "星爷");
lookPorker(hm, liudehua, "华仔");
lookPorker(hm, zhourunfa, "发哥");
lookPorker(hm, dipai, "底牌");
}
// 1、返回类型 viod
// 2、参数列表 已存在的扑克牌 HashMap , 玩家的手牌 TreeSet, 玩家名字 String
public static void lookPorker(HashMap hm, TreeSet ts, String name) {
System.out.print(name + "的牌是:");
// 1、遍历 TreeSet 的值
for (Integer i : ts) {
// 2、查看 TreeSet 的值在 HashMap 中对应的值
System.out.print(hm.get(i) + " ");
}
System.out.println();
}
}
星爷的牌是:黑桃3 方块4 梅花4 黑桃4 方块6 红桃6 红桃7 梅花8 方块9 红桃9 黑桃J 红桃Q 黑桃Q 梅花K 方块A 黑桃2 大王
华仔的牌是:方块3 方块5 梅花5 黑桃5 黑桃6 梅花7 红桃8 黑桃9 梅花10 黑桃10 红桃J 方块Q 梅花Q 方块K 红桃A 方块2 红桃2
发哥的牌是:梅花3 红桃3 红桃4 方块7 方块8 黑桃8 梅花9 方块10 红桃10 方块J 梅花J 红桃K 黑桃K 梅花A 黑桃A 梅花2 小王
底牌的牌是:红桃5 梅花6 黑桃7
路漫漫其修远兮
以上是自己学习路上的一些记录与分享
欢迎大家提出保存的意见与建议