在Java中,分别用数组和集合完成洗牌、发牌、整牌

描述:

先初始化一组牌,然后进行洗牌,为了更彻底的洗牌,将牌洗10次,然后依次按照玩家1、2、3、4进行发牌,最后再整理每个玩家手上的牌。 

 一、用数组进行洗牌、发牌和整牌:

import java.util.Arrays;

public class Main {

	public static void main(String[] args) {
		//所有的牌面花色
		char[] flowers = {'♣','♥','♦','♠'};
		//所有的牌面数字
		String[] numbers = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
		
		//步骤1:初始化所有的牌面(排列组合)
		int index = 0;
		String[] pokers = new String[52];
		for(char f : flowers) {
			for(String n : numbers) {
				pokers[index++] = f + n;
			}
		}
		System.out.println("52张牌面完成初始化:"+Arrays.toString(pokers));
		
		//步骤2:洗牌10次
		for(int counter = 1; counter <= 10; counter++) {
			//乱序
			for(int k = pokers.length - 1; k > 0; k--) {
				int randIndex = (int)(Math.random() * k);
				String temp = pokers[k];
				pokers[k] = pokers[randIndex];
				pokers[randIndex] = temp;
			}
		}
		System.out.println("52张牌完成10次洗牌后:"+Arrays.toString(pokers));
		
		//步骤3:发牌
		String[][] players = new String[4][13];
		for(int i = 0, n = 0; i < players[0].length; i++) {
			for(int k = 0; k < players.length; k++) {
				players[k][i] = pokers[n++];
			}
		}
		System.out.println("依次发牌后:");
		for(String[] pai: players) {
			System.out.println("玩家:" + Arrays.toString(pai));
		}
		
		//步骤4:整理牌(牌面排序)
		String[] array = {"A","J","K","Q"};
		//循环:每次拿出一个玩家的所有牌,整理排序
		for(String[] pai : players) {
			//冒泡
			for(int i = 0, n = pai.length; i < n - 1; i++) {
				for(int k = 0; k < n - 1 - i; k++) {
					//获取相邻元素的牌面值
					String s1 = pai[k].substring(1);
					String s2 = pai[k + 1].substring(1);
					//将截取出的牌面值,保存至临时数组
					String[] temporary = {s1,s2};
					//遍历临时数组,将A=1,J=11,Q=12,K=13
					for(int x = 0; x < temporary.length; x++) {
						//检查本次的牌面值,是否为“A,J,Q,K”中的任意一个
						int searchIndex = Arrays.binarySearch(array, temporary[x]);
						if(searchIndex >= 0) {
							switch(temporary[x]) {
							case "A":
								temporary[x] = "1";
								break;
							case "J":
								temporary[x] = "11";
								break;
							case "Q":
								temporary[x] = "12";
								break;
							case "K":
								temporary[x] = "13";
								break;
							}
						}
					}
					
					//将字符串的牌面值转换成纯数字
					int n1 = Integer.parseInt(temporary[0]);
					int n2 = Integer.parseInt(temporary[1]);
					
					//根据比较结果,交换两张牌
					if(n1 > n2) {
						String temp = pai[k];
						pai[k] = pai[k+1];
						pai[k+1] = temp;
					}
				}
			}
		}
		System.out.println("玩家整牌后:");
		for(String[] pai : players) {
			System.out.println("玩家:" + Arrays.toString(pai));
		}
	}
}

输出结果:

52张牌面完成初始化:[♣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]
52张牌完成10次洗牌后:[♥A, ♦7, ♣J, ♦9, ♦4, ♦A, ♠5, ♥K, ♣6, ♠7, ♦5, ♣4, ♦J, ♥9, ♠6, ♠9, ♠A, ♥J, ♣10, ♣8, ♥5, ♥10, ♣9, ♣2, ♠8, ♥7, ♦Q, ♣K, ♠2, ♣7, ♣5, ♦K, ♥6, ♥2, ♥3, ♦2, ♥4, ♣3, ♠10, ♠J, ♠K, ♦6, ♥8, ♦8, ♥Q, ♦10, ♠4, ♣A, ♠3, ♣Q, ♦3, ♠Q]
依次发牌后:
玩家:[♥A, ♦4, ♣6, ♦J, ♠A, ♥5, ♠8, ♠2, ♥6, ♥4, ♠K, ♥Q, ♠3]
玩家:[♦7, ♦A, ♠7, ♥9, ♥J, ♥10, ♥7, ♣7, ♥2, ♣3, ♦6, ♦10, ♣Q]
玩家:[♣J, ♠5, ♦5, ♠6, ♣10, ♣9, ♦Q, ♣5, ♥3, ♠10, ♥8, ♠4, ♦3]
玩家:[♦9, ♥K, ♣4, ♠9, ♣8, ♣2, ♣K, ♦K, ♦2, ♠J, ♦8, ♣A, ♠Q]
玩家整牌后:
玩家:[♥A, ♠A, ♠2, ♠3, ♦4, ♥4, ♥5, ♣6, ♥6, ♠8, ♦J, ♥Q, ♠K]
玩家:[♦A, ♥2, ♣3, ♦6, ♦7, ♠7, ♥7, ♣7, ♥9, ♥10, ♦10, ♥J, ♣Q]
玩家:[♥3, ♦3, ♠4, ♠5, ♦5, ♣5, ♠6, ♥8, ♣9, ♣10, ♠10, ♣J, ♦Q]
玩家:[♣A, ♣2, ♦2, ♣4, ♣8, ♦8, ♦9, ♠9, ♠J, ♠Q, ♥K, ♣K, ♦K] 

 二、用集合进行洗牌、发牌和整牌:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.TreeSet;

public class Main {
	public static void main(String[] args) {
		//所有的牌面花色
		char[] flowers = {'♣','♥','♦','♠'};
		//所有的牌面数字
		String[] numbers = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
		
		//步骤1:初始化所有的牌面(排列组合)
		ArrayList<String> pokers = new ArrayList<String>();
		for(char f : flowers) {
			for(String n : numbers) {
				pokers.add(f + n);
			}
		}
		System.out.println("52张牌面完成初始化:"+ pokers);
		
		//步骤2:洗牌10次
		for(int i = 0; i < 10; i++) {
			Collections.shuffle(pokers);
		}
		System.out.println("52张牌完成10次洗牌后:"+ pokers);
		
		//步骤3:发牌
		ArrayList<TreeSet<String>> playerList = new ArrayList<TreeSet<String>>();
		for(int i = 0; i < 4; i++) {
			//玩家x:
			playerList.add(new TreeSet<String>(new Comparator<String>() {
				@Override
				public int compare(String o1, String o2) {
					String s1 = o1.substring(1);
					String s2 = o2.substring(1);
					String[] temporary = {s1,s2};
					for(int x = 0; x < temporary.length; x++) {
						switch(temporary[x]) {
						case "A":
							temporary[x] = "1";
							break;
						case "J":
							temporary[x] = "11";
							break;
						case "Q":
							temporary[x] = "12";
							break;
						case "K":
							temporary[x] = "13";
							break;
						}
					}
					//将字符串的牌面值转换成纯数字
					int n1 = Integer.parseInt(temporary[0]);
					int n2 = Integer.parseInt(temporary[1]);
					
					//如果牌面数值相等,则比较花色+牌面数值
					if(n1 == n2) {
						return o1.compareTo(o2);
					}
					//比较牌面数值
					return n1 - n2;
				}
			}));
		}
		
		for(int i = 0; i < pokers.size(); i++) {
			//玩家依次发牌
			playerList.get(i%4).add(pokers.get(i));
		}
		
		//整牌
		for(TreeSet<String> player : playerList) {
			System.out.println(player);
		}
	}
}

输出结果:

52张牌面完成初始化:[♣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]
52张牌完成10次洗牌后:[♦8, ♣4, ♣6, ♠A, ♥K, ♠7, ♠J, ♥3, ♥7, ♦2, ♦7, ♣A, ♦K, ♠2, ♦9, ♥10, ♣J, ♥4, ♥2, ♣5, ♣10, ♥8, ♦4, ♠4, ♥Q, ♥A, ♣9, ♣Q, ♠5, ♠6, ♥9, ♣3, ♦10, ♦5, ♦J, ♦6, ♣7, ♠10, ♣2, ♦3, ♠K, ♠3, ♥5, ♥J, ♣8, ♦A, ♥6, ♦Q, ♠Q, ♠9, ♠8, ♣K]
[♠5, ♣7, ♥7, ♣8, ♦8, ♣10, ♦10, ♣J, ♠Q, ♥Q, ♠K, ♥K, ♦K]
[♥A, ♦A, ♠2, ♦2, ♠3, ♣4, ♥4, ♦5, ♠6, ♠7, ♥8, ♠9, ♠10]
[♣2, ♥2, ♦4, ♥5, ♣6, ♥6, ♦7, ♠8, ♣9, ♥9, ♦9, ♠J, ♦J]
[♠A, ♣A, ♣3, ♥3, ♦3, ♠4, ♣5, ♦6, ♥10, ♥J, ♣Q, ♦Q, ♣K] 

 

  • 20
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值