Java进阶-ArrayList和Comparator的练习

Java进阶-ArrayList和Comparator的练习

问题描述
目前需要模拟出斗地主除了打牌以外的所有场景,具体需要实现的功能如下:
1.创建出一副扑克牌
2.洗牌
3.发牌
4.清牌
5.看牌

解决思路
1.创牌
	创建两个字符串数组,分别用来装扑克牌的花色和牌面数值,再利用字符串拼接,去组装成扑克,其中大王、小王单独添加到扑克牌中去

2.洗牌
	利用集合工具类Collections去实现打散牌的功能
	Collections.shuffle();
		static void shuffle(List<?> list) 
          使用默认随机源对指定列表进行置换。 

3.发牌
	创建四个容器,分别去装三张地主牌,玩家一、玩家二、玩家三的牌
	地主牌一般都是扑克牌中最后三张牌作为地主牌
	剩余的牌一次分发给三个玩家,可以用模运算,将剩余的牌平均分给三个玩家

4.清牌
	因为扑克牌的数值大小排列规则比较特殊,不是常见的,所以我们需要自定义排序规则
	可以使用Collections工具类中的sort方法,使用Comparator比较器,并且自定义排序规则
		static <T> void sort(List<T> list, Comparator<? super T> c) 
          根据指定比较器产生的顺序对指定列表进行排序。 
          
    可以通过新建一个数组装入所有的牌面数值,并且按照牌面从小到大的顺序装入,这样只要通过查询该数组,便可得知当前牌的牌面大小,就可以将两张牌在该数组中的索引位置,进行大小判断,达到排序的功能
    
    !但是存在一个问题,该牌面数值的数组只能一个个添加元素进行非常的麻烦,有什么办法可以优化这里呢?可以使用Collections工具类中的addAll方法
    	static <T> boolean addAll(Collection<? super T> c, T... elements) 
          将所有指定元素添加到指定 collection 中。 

5.看牌
	输出打印四个集合的内容即可

代码实现
package com.tan.comparator;

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

public class PlayingCard {
    public static void main(String[] args) {
        ArrayList<String> card = new ArrayList<>();
        //创建牌
        String[] flowers = {"♠","♦","♥","♣"};
        String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};

        for (String flower : flowers) {
            for (String number : numbers) {
                card.add(flower + number);
            }
        }

        card.add("joker");
        card.add("JOKER");

        //洗牌
        Collections.shuffle(card);

        //发牌
        ArrayList<String> player1 = new ArrayList<>();
        ArrayList<String> player2 = new ArrayList<>();
        ArrayList<String> player3 = new ArrayList<>();
        ArrayList<String> landlord = new ArrayList<>();

        landlord.add(card.get(card.size()-1));
        landlord.add(card.get(card.size()-2));
        landlord.add(card.get(card.size()-3));

        for (int i = 0; i < card.size()-3; i++) {
            if(i % 3 == 0){
                player1.add(card.get(i));
            }else if(i % 3 == 1){
                player2.add(card.get(i));
            }else{
                player3.add(card.get(i));
            }
        }


        //清牌
        ArrayList<Character> value = new ArrayList<>();

        value.add('3');
        value.add('4');
        value.add('5');
        value.add('6');
        value.add('7');
        value.add('8');
        value.add('9');
        value.add('1');
        value.add('J');
        value.add('Q');
        value.add('k');
        value.add('A');
        value.add('2');
        value.add('o');
        value.add('O');

        Comparator<String> rule = new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                //按照升序去排序
                return value.indexOf(o1.charAt(1)) - value.indexOf(o2.charAt(1));
            }
        };

        Collections.sort(landlord,rule);
        Collections.sort(player1,rule);
        Collections.sort(player2,rule);
        Collections.sort(player3,rule);

        //看牌
        System.out.println("landlord = " + landlord);
        System.out.println("player1 = " + player1);
        System.out.println("player2 = " + player2);
        System.out.println("player3 = " + player3);

    }
}

代码优化
package com.tan.comparator;

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

public class PlayingCardOptimize {
    public static void main(String[] args) {
        ArrayList<String> card = new ArrayList<>();
        //创建牌
        String[] flowers = {"♠","♦","♥","♣"};
        String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};

        for (String flower : flowers) {
            for (String number : numbers) {
                card.add(flower + number);
            }
        }

        card.add("joker");
        card.add("JOKER");

        //洗牌
        Collections.shuffle(card);

        //发牌
        ArrayList<String> player1 = new ArrayList<>();
        ArrayList<String> player2 = new ArrayList<>();
        ArrayList<String> player3 = new ArrayList<>();
        ArrayList<String> landlord = new ArrayList<>();

        landlord.add(card.get(card.size()-1));
        landlord.add(card.get(card.size()-2));
        landlord.add(card.get(card.size()-3));

        for (int i = 0; i < card.size()-3; i++) {
            if(i % 3 == 0){
                player1.add(card.get(i));
            }else if(i % 3 == 1){
                player2.add(card.get(i));
            }else{
                player3.add(card.get(i));
            }
        }

        //清牌
        //实时final特性: 当局部变量在匿名内部类中使用的时候,就会被自动加上final -> 实时final
		//内部类中使用但未声明的任何局部变量必须在内部类的正文之前明确分配,java匿名内部类中使用但是没有声明的变量都必须为final

        ArrayList<Character> value = new ArrayList<>();
        			      Collections.addAll(value,'3','4','5','6','7','8','9','1','J','Q','K','A','2','o','O');

        Comparator<String> rule = new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return value.indexOf(o1.charAt(1)) - value.indexOf(o2.charAt(1));
            }
        };

        Collections.sort(landlord,rule);
        Collections.sort(player1,rule);
        Collections.sort(player2,rule);
        Collections.sort(player3,rule);

        //看牌
        System.out.println("landlord = " + landlord);
        System.out.println("player1 = " + player1);
        System.out.println("player2 = " + player2);
        System.out.println("player3 = " + player3);

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值