利用集合简单实现斗地主发牌和洗牌

 

如何利用集合简单实现斗地主发牌和洗牌


目录

 

如何利用集合简单实现斗地主发牌和洗牌

 

1、利用ArrayList简单模拟斗地主的洗牌与发牌

代码如下

2、利用HashMap等模拟斗地主的洗牌与发牌

改进思路如下:

代码如下

运行结果如下


1、利用ArrayList简单模拟斗地主的洗牌与发牌

  • 代码如下

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]

​

由以上结果我们可以看出来,发牌后的次序并不友好,并没有实现从小至大自动排序。

我们可以改进下代码,利用其它集合的特性来实现发牌后的自动排序


2、利用HashMap等模拟斗地主的洗牌与发牌

整体思维与上面大致相同

  • 改进思路如下:

  • 我们都知道一副扑克一共有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 

路漫漫其修远兮

以上是自己学习路上的一些记录与分享

欢迎大家提出保存的意见与建议

你可能感兴趣的:(Java)