java中使用集合模拟斗地主发牌的两种排序(根据大小或者花色)

第一种排序

根据花色,把相同的花色排到一起,然后将其花色一样的再进行排序

第一种排序参照代码中all()方法

第二种排序

真实的模拟斗地主游戏的排序玩法,即按照大王(这里用的是JOKER)joker2AKQJ109876543的顺序进行排序,花色顺序可以自己调整

第二种排序参照代码中all2()方法

下面是具体的代码实现,切换功能的话,可以修改无参构造器中的调用的具体方法,把all2()方法修改为all()方法即可切换

//模拟三人斗地主发牌
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

public class ThreeDemo2 {
	static List<Integer> list = new ArrayList<Integer>();
	static List<String> list1 = new ArrayList<String>();
	static List<String> list2 = new ArrayList<String>();
	static List<Integer> player1 = new ArrayList<Integer>();
	static List<Integer> player2 = new ArrayList<Integer>();
	static List<Integer> player3 = new ArrayList<Integer>();
	static List<Integer> diPai = new ArrayList<Integer>();
	static int index = 0;
	static int spe;
	static Map<Integer, String> map = new HashMap<Integer, String>();
	public static void main(String[] args) {
		new ThreeDemo2();
	}
	public ThreeDemo2() {
		//也可以用数组进行存储...相对简单一点
		list1.add("♠");
		list1.add("♥");
		list1.add("♣");
		list1.add("♦");
		
		list2.add("2");
		list2.add("3");
		list2.add("4");
		list2.add("5");
		list2.add("6");
		list2.add("7");
		list2.add("8");
		list2.add("9");
		list2.add("10");
		list2.add("J");
		list2.add("Q");
		list2.add("K");
		list2.add("A");
		
		all2();
		pecialPai();
		//System.out.println(list.size());
		//System.out.println(list2.get(list2.size()-1));
		threePlayer();
		//System.out.println(map);
		//spe = pecialPai();
		look("赌神", player1, map);
		look("赌圣", player2, map);
		look("赌王", player3, map);
		look("底牌", diPai, map);
		System.out.print("地主牌为:");
		System.out.println(map.get(spe));
	}
	//按花色排序,然后在花色中排序,将list的集合下标赋给map的key作为标志
	public static void all() {
		map.put(index, "JOKER");
		list.add(index);
		index++;
		map.put(index, "joker");
		list.add(index);
		index++;
		for (String color : list1) {
			for (String num : list2) {
				map.put(index, color+num);
				list.add(index);
				index++;
			}
		}
	}
	//按电脑斗地主进行排序
	public static void all2() {
		map.put(index, "JOKER");
		list.add(index);
		index++;
		map.put(index, "joker");
		list.add(index);
		index++;
		for (int i = 0; i < list1.size(); i++) {
			map.put(index, list1.get(i)+list2.get(0));
			list.add(index);
			index++;
		}
		//一个大于号小于号的问题排了半天的错误,我吐了
		for (int i = list2.size()-1; i >= 1; i--) {
			for (int j = 0; j < list1.size(); j++) {
				map.put(index, list1.get(j)+list2.get(i));
				list.add(index);
				index++;
			}
		}
	}
	//随机一个地主牌的key
	public static void  pecialPai() {
		Random random = new Random();
		spe = random.nextInt(51);
	}
	//将标好的集合打乱,然后赋给三个集合,获得之后继续整理好
	public static void threePlayer() {
		Collections.shuffle(list);
		diPai.add(list.get(51));
		diPai.add(list.get(52));
		diPai.add(list.get(53));
		for (int i = 0; i < list.size()-3; i++) {
			if (i%3 == 0) {
				player1.add(list.get(i));
			}
			if (i%3 == 1) {
				player2.add(list.get(i));
			}
			if (i%3 == 2) {
				player3.add(list.get(i));
			}
		}
		//System.out.println(spe);
		for (int i = 0; i < player1.size(); i++) {
			if (player1.get(i) == spe) {
				player1.addAll(diPai);
			}
		}
		for (int i = 0; i < player2.size(); i++) {
			if (player2.get(i) == spe) {
				player2.addAll(diPai);
			}
		}
		for (int i = 0; i < player3.size(); i++) {
			if (player3.get(i) == spe) {
				player3.addAll(diPai);
			}
		}
		Collections.sort(player1);
		Collections.sort(player2);
		Collections.sort(player3);
		Collections.sort(diPai);
		
	}
	//将三个集合的下标对应到key,获取到内容,只打印内容
	public static void look(String name,List<Integer> player,Map<Integer,String> allPai) {
		System.out.print(name + ":");
		for (Integer key : player) {
			String value = allPai.get(key);
			System.out.print(value+" ");
		}
		System.out.println();
	}
}

var foo = 'bar';
具体实现的图片如下:

在这里插入图片描述

切换方法为all()后的实现图为:

在这里插入图片描述

老规矩有什么,有什么bug或者不懂的可以私聊我哦qq:1638580498

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值