Java集合模拟斗地主洗牌和发牌

使用Java集合模拟斗地主洗牌发牌

分析:

一共要实现四个步骤:

1.获得一副新牌

一副新牌包含三个属性:

花色:黑桃,红桃,梅花,方块(♠,♥,♣,♦)

点数:A,2,3,4,5,6,7,8,9,10,J,Q,K

王牌:小王、大王

2.洗牌

新牌是按照从小到大排好的,为保证游戏公平,所以要把牌的顺序洗乱

3.发牌

把洗好的牌分到玩家守正,并留下三张作为底牌

三位玩家:叶凡,庞博,无始

4.看牌

显示每个玩家的牌,以及底牌

 

代码实现

1.获得一副新牌

                //创建集合,牌盒
		List<String> Poker =new ArrayList<String>();
		
		//创建花色集合
		List<String> color=new ArrayList<String>();
		//创建数字集合
		List<String> number=new ArrayList<String>();

创建三个List集合,Poker、color、number分别用来存储所有的扑克、四种花色、所有的点数

                //添加花色
		color.add("♠");
		color.add("♥");
		color.add("♣");
		color.add("♦");
		
		//添加数字
		number.add("A");
		number.add("2");
		number.add("3");
		number.add("4");
		number.add("5");
		number.add("6");
		number.add("7");
		number.add("8");
		number.add("9");
		number.add("10");
		number.add("J");
		number.add("Q");
		number.add("K");
		
		
		//将牌装入牌盒
		for(int x=0;x<color.size();x++) {
			for(int i=0;i<number.size();i++) {
				String s=color.get(x).concat(number.get(i));
				Poker.add(s);
			}
		}
		
		Poker.add("大王");
		Poker.add("小王");

 在完成color、number集合后,再生成所有的牌,最后再把大小王加入。最后结果:

[♠A, ♠2, ♠3, ♠4, ♠5, ♠6, ♠7, ♠8, ♠9, ♠10, ♠J, ♠Q, ♠K, ♥A, ♥2, ♥3, ♥4, ♥5, ♥6, ♥7, ♥8, ♥9, ♥10, ♥J, ♥Q, ♥K, ♣A, ♣2, ♣3, ♣4, ♣5, ♣6, ♣7, ♣8, ♣9, ♣10, ♣J, ♣Q, ♣K, ♦A, ♦2, ♦3, ♦4, ♦5, ♦6, ♦7, ♦8, ♦9, ♦10, ♦J, ♦Q, ♦K, 大王, 小王]

 2.洗牌

使用Collections中的shuffle()方法进行洗牌

                Collections.shuffle(Poker);

洗完之后:

[♣8, ♦2, ♠J, ♠4, 大王, ♦6, ♦9, ♥8, ♠K, ♠A, ♠7, ♦J, ♥5, ♣J, ♣Q, ♠9, ♥K, ♥Q, ♣9, ♦10, ♥6, ♣7, ♣10, ♠6, ♦K, ♣K, ♥J, 小王, ♥9, ♦7, ♣6, ♥A, ♣3, ♥2, ♦A, ♥10, ♠Q, ♠2, ♣5, ♠5, ♦4, ♦8, ♠8, ♣2, ♦5, ♥3, ♥7, ♣4, ♣A, ♦Q, ♠10, ♥4, ♦3, ♠3]

可以看到,此时牌的顺序已经被完全打乱

 3.发牌

把已经打乱的牌发到玩家手中,并留下三张作为底牌:

                //创建三个玩家,以及底牌
		List<String> yeFan=new ArrayList<String>();
		List<String> pangBo=new ArrayList<String>();
		List<String> wuShi=new ArrayList<String>();
		//创建底牌
		List<String> diPai=new ArrayList<String>();

 		//发牌
		for(int i=0;i<Poker.size();i++) {
                        //如果只剩最后三张
			if(i>=Poker.size()-3) {
				diPai.add(Poker.get(i));
			}else if(i%3==0) {
				yeFan.add(Poker.get(i));
			}else if(i%3==1) {
				pangBo.add(Poker.get(i));
			}else if(i%3==2){
				wuShi.add(Poker.get(i));
			}
		}

4.看牌

输出每个玩家以及底牌:

                System.out.println("叶凡的牌:"+yeFan);
		System.out.println("庞博的牌:"+pangBo);
		System.out.println("无始的牌:"+wuShi);
		System.out.println("底牌:"+diPai);

 输出结果:

叶凡的牌:[♣8, ♠4, ♦9, ♠A, ♥5, ♠9, ♣9, ♣7, ♦K, 小王, ♣6, ♥2, ♠Q, ♠5, ♠8, ♥3, ♣A]
庞博的牌:[♦2, 大王, ♥8, ♠7, ♣J, ♥K, ♦10, ♣10, ♣K, ♥9, ♥A, ♦A, ♠2, ♦4, ♣2, ♥7, ♦Q]
无始的牌:[♠J, ♦6, ♠K, ♦J, ♣Q, ♥Q, ♥6, ♠6, ♥J, ♦7, ♣3, ♥10, ♣5, ♦8, ♦5, ♣4, ♠10]
底牌:[♥4, ♦3, ♠3]


可以看到,现在每个人手中都有17张牌,且留下三张作为底牌。

但是,此时每个人手中的派都是乱序的,很难看出自己的牌是好是坏。所以,我们就想到给每个人手中的牌进行排序,但是应该怎么排序呢?

由于扑克牌中的点数并不是全部由数字构成的,所以没有办法使用自然排序,比较器排序倒是可以实现,只不过会很麻烦。那么还有没有其他办法呢?

我们可以这么想,既然每张牌本身没有办法进行排序,那我们能不能给每一张牌都指定一个序号呢?序号从小到大刚好对应了每张牌的从小到大。比如:

0————对应————黑桃3

1————对应————红桃3

2————对应————梅花3

3————对应————方块3

4————对应————黑桃4

5————对应————红桃4

6————对应————梅花4

7————对应————方块4

.。。。。

52————对应————小王

53————对应————大王

如此一来,我们就可以根据每张牌对应的序号,来对所有的牌进行排序了。

开始代码实现:

1.获得一副新牌

与第一次不同的是,这次我们除了要创建三个List集合来存储牌以外,我们还需要用一个Map集合来存储序号和牌之间的对应关系。而且,这一次在Poker集合中存储的是牌的序号而不是牌。

                //创建Map集合,存储牌和序号
		HashMap<Integer,String> haPoker=new HashMap<Integer, String>();
		
		//创建集合,牌盒,因为存储的是序号,所以是Integer类型
		List<Integer> Poker =new ArrayList<Integer>();
		
		//创建花色集合
		List<String> color=new ArrayList<String>();
		//创建数字集合
		List<String> number=new ArrayList<String>();
		
		
		//添加花色
		color.add("♠");
		color.add("♥");
		color.add("♣");
		color.add("♦");
		
		//添加数字
		number.add("3");
		number.add("4");
		number.add("5");
		number.add("6");
		number.add("7");
		number.add("8");
		number.add("9");
		number.add("10");
		number.add("J");
		number.add("Q");
		number.add("K");
		number.add("A");
		number.add("2");
		
		//牌的序号
		int index=0;
		
		//将牌装入牌盒
                //在这里要注意,这一次我们是按照点数排序,不同花色,相同点数的牌是在一起的,所以这一次的循环嵌套跟第一次的是不一样的
		for(int x=0;x<number.size();x++) {
			for(int i=0;i<color.size();i++) {
				String s=color.get(i).concat(number.get(x));
				haPoker.put(index, s);
				Poker.add(index);
				index++;
			}
		}
		
		haPoker.put(index, "小王");
		Poker.add(index);
		index++;
		haPoker.put(index, "大王");
		Poker.add(index);

 此时Poker中是这样的:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53],跟第一次不同这一次里面存储的只是序号。

  2.洗牌

                //洗牌
		Collections.shuffle(Poker);

Poker:[16, 29, 24, 26, 17, 48, 5, 52, 10, 2, 28, 18, 3, 15, 19, 38, 41, 44, 53, 25, 46, 47, 50, 33, 43, 8, 13, 30, 11, 39, 22, 0, 51, 7, 1, 34, 31, 42, 9, 21, 49, 45, 36, 14, 35, 6, 37, 32, 40, 20, 12, 27, 23, 4]

3.发牌

                //创建三个玩家,以及底牌
                //玩家存储的也是序号,而不是牌
		List<Integer> yeFan=new ArrayList<Integer>();
		List<Integer> pangBo=new ArrayList<Integer>();
		List<Integer> wuShi=new ArrayList<Integer>();
		
		List<Integer> diPai=new ArrayList<Integer>();
 		//发牌
		for(int i=0;i<Poker.size();i++) {
			if(i>=Poker.size()-3) {
				diPai.add(Poker.get(i));
			}else if(i%3==0) {
				yeFan.add(Poker.get(i));
			}else if(i%3==1) {
				pangBo.add(Poker.get(i));
			}else if(i%3==2){
				wuShi.add(Poker.get(i));
			}
		}

4.看牌

                //排序
                Collections.sort(diPai);
		Collections.sort(yeFan);
		Collections.sort(pangBo);
		Collections.sort(wuShi);
		
		
		
		System.out.print("叶凡的牌:");
		for(int x=0;x<yeFan.size();x++) {
			System.out.print(haPoker.get(yeFan.get(x))+",");
		}
		System.out.println();
		
		System.out.print("庞博的牌:");
		for(int x=0;x<pangBo.size();x++) {
			System.out.print(haPoker.get(pangBo.get(x))+",");
		}
		System.out.println();
		
		System.out.print("无始的牌:");
		for(int x=0;x<wuShi.size();x++) {
			System.out.print(haPoker.get(wuShi.get(x))+",");
		}
		System.out.println();
		
		System.out.print("底牌:");
		for(int x=0;x<diPai.size();x++) {
			System.out.print(haPoker.get(diPai.get(x))+",");
		}
		System.out.println();

因为玩家的集合中存储的是序号,所以可以直接用Collections.sort();进行自然排序。

结果:

叶凡的牌:♣3,♦3,♥4,♣4,♦4,♠7,♥8,♣8,♣9,♣10,♦10,♠Q,♣Q,♠K,♦K,♦A,大王,
庞博的牌:♠3,♥3,♠5,♦5,♣6,♦6,♥7,♠8,♥9,♠10,♥10,♥Q,♥K,♣K,♥2,♣2,小王,
无始的牌:♥5,♣5,♠6,♥6,♣7,♦7,♠9,♠J,♥J,♣J,♦J,♦Q,♠A,♥A,♣A,♠2,♦2,
底牌:♠4,♦8,♦9,

此时我们可以看到,每个玩家手里的牌都已经是有序的了,一眼就可以看出自己的牌是好是坏。可以愉快的开始玩游戏了。


 

发布了88 篇原创文章 · 获赞 47 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/dai_ma_dong/article/details/103240916
今日推荐