java-study ArrayList實現發牌、洗牌、排序、隨機地主

輸出示例

package com.TestCard;

import java.util.*;

public class Test1 {
    public static void main(String[] args) {
        //創建並拿到一副新牌
        List cards = new GenerateCards().getCards();
        //創建三個個玩家
        Player p1 = new Player("張三丰");
        Player p2 = new Player("楊過");
        Player p3 = new Player("東方不敗");
        //創建對局
        Game game = new Game(cards,p1,p2,p3);
        System.out.println(p1);
        System.out.println(p2);
        System.out.println(p3);
        System.out.println("地主是:"+game.getLandlord().getNAME());
        System.out.println("底牌是:"+game.getFLOOR_CARDS());
    }
}
class Card {
    public final String TYPE;
    public final String NUM;
    public final int INDEX;//用來排序的
    public Card(String t, String n, int i) {
        TYPE = t;
        NUM = n;
        INDEX = i;
    }
    @Override
    public String toString() {
        return NUM + TYPE;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Card card = (Card) o;
        return Objects.equals(TYPE, card.TYPE) &&
                Objects.equals(NUM, card.NUM);
    }

    @Override
    public int hashCode() {
        return Objects.hash(TYPE, NUM);
    }
}
class GenerateCards {
    public static final List<String> NUM = new ArrayList<>();
    public static final List<String> TYPE = new ArrayList<>();
    public static final List<String> KING = new ArrayList<>();
    public static final int TOTAL = 54;
    static {
        Collections.addAll(NUM,"3","4","5","6","7","8","9","10","J","Q","K","A","2");
        Collections.addAll(TYPE,"❤","♠","♦","♣");
        Collections.addAll(KING,"小王","大王");
    }
    public List getCards() {
        List<Card> res = new ArrayList<>();
        int index = 0;
        for (String n : NUM) {
            for (String t : TYPE) {
                res.add(new Card(t,n,index++));
            }
        }
        for (String s : KING) {
            res.add(new Card(s,"",index++));
        }
        return res;
    }
}
class Player {
    public final String NAME;
    public List<Card> cards = new ArrayList<>();
    public Player(String n) {
        NAME = n;
    }
    public List<Card> getCards() {
        return cards;
    }
    public void setCards(List<Card> cards) {
        this.cards = cards;
    }
    public String getNAME() {
        return NAME;
    }
    @Override
    public String toString() {
        return "玩家:"+NAME+"\n"+"剩餘牌:"+cards;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Player player = (Player) o;
        return Objects.equals(NAME, player.NAME);
    }

    @Override
    public int hashCode() {
        return Objects.hash(NAME);
    }
}
class Game {
    private final List<Card> FLOOR_CARDS = new ArrayList<>();
    private final List<Card> CARDS;
    private final Player[] PLAYERS;
    private Player landlord;
    public Game(List<Card> cards, Player...players) {
        CARDS = cards;
        PLAYERS = players;
        //洗牌、發牌
        sendCard();
        //叫地主
        selectLandlord();
    }
    private void sendCard() {
        /**
         * 發牌
         * 底牌數量 = 玩家人數
         * 發牌數量 = 牌總數 - 底牌數
         */
        Collections.shuffle(CARDS);
        int cardsSize = CARDS.size();
        int playersLen = PLAYERS.length;
        for(int i = 0; i < cardsSize - playersLen; i++) {
            Player currPlayer = PLAYERS[i % playersLen];
            currPlayer.cards.add(CARDS.get(i));
        }
        FLOOR_CARDS.addAll(CARDS.subList(cardsSize - playersLen, cardsSize));
        //牌排序
        for (Player player : PLAYERS) {
            sortCards(player.getCards());
        }
    }
    private void sortCards(List<Card> card) {
        card.sort(new Comparator<Card>() {
            @Override
            public int compare(Card o1, Card o2) {
                return o2.INDEX - o1.INDEX;
            }
        });
    }
    private void selectLandlord() {
        int random = (int)Math.floor(Math.random() * PLAYERS.length);
        //實際還需要詢問是否要地主,不要再詢問下一個玩家
        PLAYERS[random].cards.addAll(FLOOR_CARDS);
        sortCards(PLAYERS[random].getCards());
        landlord = PLAYERS[random];
    }

    public List<Card> getFLOOR_CARDS() {
        return FLOOR_CARDS;
    }

    public List<Card> getCARDS() {
        return CARDS;
    }

    public Player[] getPLAYERS() {
        return PLAYERS;
    }

    public Player getLandlord() {
        return landlord;
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章