Java基础知识章节梳理--综合练习模拟扑克的看牌与发牌(理论)

本文介绍了一种基于Java的斗地主发牌算法实现,包括扑克牌的生成、洗牌、分发以及查看各玩家手牌的过程。通过优化代码结构,实现了更好的复用性和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文字数:约1200字  阅读时间:20分钟

此文章为学习总结类型,文字很多且皆为基础知识

将前面的所学的集合,以练习题的形式进行的复习,主要需求是按照斗地主模式进行正常的发牌,并按照大小排序的形式来查看牌,因为目前不会使用图形化界面的设计,因此就以控制台输出的形式来模拟看牌功能了。

 

//----------------准备扑克---------------------
		//分发给玩家的扑克(其实就是索引)
		ArrayList<Integer> poker = new ArrayList<>();
		//(存储扑克的样式)
		HashMap<Integer,String> map = new HashMap<>();
		//花色
		String[] colors = {"♠", "♥", "♣", "♦"};
		//数字
		String[] nums = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
		//按照一定顺序存储
		int index = 0;
		//先遍历数字(保证大小顺序)
		for (String num : nums) {
			//遍历花色
			for (String color : colors) {
				//保存此花色牌的索引
				poker.add(index);
				//拼接并保存
				map.put(index, color+num);
				//索引+1
				index++;
			}
		}

		poker.add(index);
		map.put(index, "小王");
		index++;
		
		poker.add(index);
		map.put(index, "大王");
//--------------模拟发牌--------------------
		//洗牌(这里也可以自己编写随机)
		Collections.shuffle(poker);
		//玩家A
		ArrayList<Integer> playerA = new ArrayList<Integer>();
		//玩家B
		ArrayList<Integer> playerB = new ArrayList<Integer>();
		//玩家C
		ArrayList<Integer> playerC = new ArrayList<Integer>();
		//底牌
		ArrayList<Integer> buttonCard = new ArrayList<Integer>();
		//遍历扑克
		for (int i = 0; i < poker.size(); i++) {
			//得到索引
			int card = poker.get(i);
			//存储底牌
			if( i >= 51){
				buttonCard.add(card);
				continue;
			}
			//给玩家A的牌
			if(i % 3 == 0){
				playerA.add(card);
			//给玩家B的牌
			}else if(i % 3 == 1){
				
				playerB.add(card);
			//给玩家C的牌
			}else{
				playerC.add(card);
			}
		}
//-------------模拟看牌-------------------------
		//排序(默认从小往大排,这里也可以用冒泡排序法或者选择排序法进行排序)
		Collections.sort(playerA);
		//反转(按照从大往小牌)
		Collections.reverse(playerA);
		System.out.print("玩家A: ");
		for (int i = 0; i < playerA.size(); i++) {
			System.out.print(map.get(playerA.get(i))+" ");
		}
		System.out.println();
		
		Collections.sort(playerB);
		Collections.reverse(playerB);
		System.out.print("玩家B: ");
		for (int i = 0; i < playerB.size(); i++) {
			System.out.print(map.get(playerB.get(i))+" ");
		}
		System.out.println();
		
		Collections.sort(playerC);
		Collections.reverse(playerC);
		System.out.print("玩家C: ");
		for (int i = 0; i < playerB.size(); i++) {
			System.out.print(map.get(playerC.get(i))+" ");
		}
		System.out.println();
		
		Collections.sort(buttonCard);
		Collections.reverse(buttonCard);
		System.out.print("底牌: ");
		for (int i = 0; i < buttonCard.size(); i++) {
			System.out.print(map.get(buttonCard.get(i))+" ");
		}
		System.out.println();

下面,是将上面的代码结合前面所总结的知识点进行了优化。

首先,存储扑克的集合如果是局部变量也就只能在当前方法使用,这样如果其他类要用就还需要再次创建,因此将集合提升为成员变量,这样就可以在其他类中也是可以是用的。后面的方法中都写成了静态方法,因此也需要设计出静态成员变量。(其中设计为私有变量是为了保护里面的数据因某些因素而被修改)

private static List<Integer> poker;
private static Map<Integer,String> map

然后,扑克只需要创建一次即可,但是在上面的方法中,每次使用时都会重新的制作一份扑克,这样是非常消耗资源的,而前面所总结的方法中,有个static静态代码块,仅在初次使用该类时运行后面就不会在此运行,因此此处可以使用static来进行优化

static{
		String[] colors = {"♠", "♥", "♣", "♦"};
		String[] nums = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
		int index = 0;
		for (String num : nums) {
			for (String color : colors) {
				poker.add(index);
				map.put(index, color+num);
				index++;
			}
		}
		poker.add(index);
		map.put(index, "小王");
		index++;
		poker.add(index);
		map.put(index, "大王");
	}

上面的优化代码可以将其单独存放于一个类中,并编写get方法,来获取成员变量,这样也符合编程设计里的“高内聚,低耦合”的特性。下面就是本类中的get方法

public static List<Integer> getPoker(){
	return poker;
}
public static Map<Integer,String> getPokerMap(){
	return map;
}

在发牌阶段,可以将其单独定义为单独一个方法,设定接收参数和返回参数。便于代码的复用性。(参数结合前面的总结,设计为可变参数类型,返回值为底牌)

 

public static List<Integer> sendCard(ArrayList<Integer> ...Card){
		if(Card.length < 3 || Card.length > 3){
			throw new RuntimeException("请选择三名玩家。。。")
		}
		List<Integer> button =new ArrayList<>();
		List<Integer> poker = Pokers.getPoker();
		Collections.shuffle(poker);
		for (int i = 0; i < poker.size(); i++) {
			int card = poker.get(i);
			if( i >= 51){
				button.add(card);
				continue;
			}
			if(i % 3 == 0){
				Card[0].add(card);
			}else if(i % 3 == 1){
				Card[1].add(card);
			}else{
				Card[2].add(card);
			}
		}
		return button;
	}

而在看牌部分,可以看到都是相类似的方法,因此,在此将此抽取成一个方法,设置参数的时候为了便于直观的查看,也就仅接收一个集合来遍历。(这里主要体现在减少代码的重复使用上)

public static void lookCard(String name , ArrayList<Integer> player){
		Collections.sort(player);
		Collections.reverse(player);
		System.out.print(name+": ");
		Map<Integer, String> map = Pokers.getPokerMap();
		for (int i = 0; i < player.size(); i++) {
			System.out.print(map.get(player.get(i))+" ");
		}
		System.out.println();
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值