JAVA -- List (扑克牌示例)

一. List
List(线性表) 也是接口的一种.
构造一个 List 对象:

List<Object>() list = new ArrayList<>(); // 顺序表
List<Object>() list = new LinkedList<>(); // 链表
  1. List 的常见方法:
    a. boolean add(E e): 尾插 e
    b. void add(int index, E element): 将 e 插入到 index 位置
    c. boolean addAll(Collection c): 尾插 c 中的元素
    d. E remove(int index): 删除 index 位置元素
    e. boolean remove(Object o): 删除遇到的第一个 o
    f. E get(int index): 获取下标 index 位置元素
    g. E set(int index, E element): 将下标 index 位置元素设置为 element
    h. boolean contains(Object o): 判断 o 是否在线性表中
    i. int indexOf(Object o): 返回第一个 o 所在下标
    j. int lastIndexOf(Object o) 返回最后一个 o 的下标

  2. 用一个示例调用这些方法:

public class Poker {
    // 模拟创建一副牌,洗牌, 发牌
    static class Card {
        // 不用 static 修饰的内部类,当创建 card 对象的时候,必须依靠 Poker 的实例才能创建
        // 用 static 修饰的内部类,当创建 card 对象的时候,不须依靠 Poker 的实例创建(就可以在 Poker 的静态方法中创建实例)
        public String suit;//花色
        public String rank;//点数

        public Card(String suit, String rank) {
            this.suit = suit;
            this.rank = rank;
        }

        @Override
        public String toString() {
            /*return "Card{" +
                    "suit='" + suit + '\'' +
                    ", rank='" + rank + '\'' +
                    '}';*/
            return String.format("(%s%s)", suit, rank);
        }
    }

    public static List<Card> buyPoker() {
        //1.构建一副牌
        String[] suits = {"♥", "♠", "♣", "♦"};
        List<Card> poker = new ArrayList<>();
        for(int i = 0; i < 4; i++) {
            for(int j = 2; j <10; j++) {
                Card card = new Card(suits[i], String.valueOf(j));
                poker.add(card);
            }
            poker.add(new Card(suits[i], "J"));
            poker.add(new Card(suits[i], "Q"));
            poker.add(new Card(suits[i], "K"));
            poker.add(new Card(suits[i], "A"));
        }
        return poker;
    }

    public static void shuffle(List<Card> poker) {
        // 2. 洗牌 shuffle
        // 从后往前遍历 List, 每次取到一个牌之后,就和前面一个随机位置的牌交换
        Random random = new Random();
        for(int i = poker.size() - 1; i > 0; i--) {
            // 产生一个 [0,i) 随机数
            int r = random.nextInt(i);
            swap(poker, i, r);
        }
    }
    private static void swap(List<Card> poker, int i, int j) {
        Card tmp = poker.get(i);
        poker.set(i, poker.get(j));
        poker.set(j, tmp);
    }

    public static void main(String[] args) {
        List<Card> poker = buyPoker();
        // System.out.println(poker); 打印一副牌

        // Collections.shuffle(poker); 系统自带方法
        // shuffle(List<?> list): 使用默认的随机源随机排列指定的列表
        shuffle(poker);
        //System.out.println(poker);洗牌

        // 3. 发牌,把牌发给 3 个玩家,每人发 5 张
        // 通过嵌套 List 来实现(每个玩家的手牌是一个 List, 多个玩家的手牌再放到一个 List 中)
        List<List<Card>> players = new ArrayList<>();
        // players 中的元素个数就是玩家的总数
        players.add(new ArrayList<Card>());
        players.add(new ArrayList<Card>());
        players.add(new ArrayList<Card>());

        for(int cardIndex = 0; cardIndex < 5; cardIndex++) {
            for(int playerIndex = 0; playerIndex < 3; playerIndex++) {
                // 模拟轮流发牌

                // 先获取到玩家
                List<Card> player = players.get(playerIndex);
                // 把 poker 中最前面的元素发给当前玩家
                Card toCard = poker.remove(0);
                player.add(toCard);
            }
        }

        // 4. 展示手牌,比较大小
        System.out.println("玩家1 的手牌:");
        System.out.println(players.get(0));
        System.out.println("玩家2 的手牌:");
        System.out.println(players.get(1));
        System.out.println("玩家3 的手牌:");
        System.out.println(players.get(2));
    }
}

输出结果:

玩家1 的手牌:
[(8), (6), (5), (4), (6)]
玩家2 的手牌:
[(♦J), (♣Q), (4), (♦Q), (♠J)]
玩家3 的手牌:
[(♦K), (7), (5), (9), (6)]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
* Game 类 * 功能:整个游戏:开始游戏 -> 初始牌 -> 洗牌 -> 发牌 -> 排序 -> 比较大小 -> 游戏结果 * 游戏说明: * 1.创建一副扑克牌,不考虑大小王 * 2.创建两名玩家,玩家至少要有ID、姓名、手牌等属性,手牌为扑克牌的集合 * 3.洗牌,将之前创建的扑克牌顺序打乱 * 4.发牌,将洗牌之后的扑克牌集合,从第一张开始,发给两名玩家,按照一人一张的方式,每人发两张 * 5.开始游戏,比大小,大小相同比花色 * * PockerCard 类 * 功能:扑克牌的核心类 包括创建角色、创建牌、显示牌、洗牌、比较牌、排序牌等 * 属性:List cards 整幅扑克牌的集合 、 People[] peoples 角色 * 方法: public PockerCard() //无参构造函数: 创建牌的集合、创建两个角色对象 * public void initializeCard() //创建整幅扑克牌 * public void showCard() //显示单支牌的花色和点数 * public void refreshCard() //洗牌 从第一支牌开始从所有牌中随机取一只与之交换 * public void addPeopleInfo() //添加玩家的基本信息 * public void dealCard() //发牌 从开始分别给A B发牌 每人两支 * public void showPeopleCard() //显示两个角色自己获得的牌 * public void sortCard() //将每个角色自己的牌按从小到大排序 * public void comparePeopleCard() //比较角色的牌 * * SingleCard类 实现Comparable接口 * 功能:产生单支牌 * 属性:ID、color、keyID数组、keyColor数组 * 方法:public SingleCard(){} //无参构造函数 * public SingleCard(String ID,String color) //有参构造函数 * @Override public int compareTo(SingleCard o) //比较当前牌与SingleCard o的牌的大小 * * People类 * 功能:产生一个角色 * 属性:ID、Name、和、存储牌的List集合。 * 方法: public People() //初始化存储牌的List集合; *
以下是一个简单的Java三个玩家的扑克牌游戏的示例代码: ```java import java.util.*; public class PokerGame { public static void main(String[] args) { List<String> deck = createDeck(); // 创建一副扑克牌 Collections.shuffle(deck); // 洗牌 List<String> player1 = new ArrayList<String>(); List<String> player2 = new ArrayList<String>(); List<String> player3 = new ArrayList<String>(); // 发牌 for (int i = 0; i < deck.size(); i++) { String card = deck.get(i); if (i % 3 == 0) { player1.add(card); } else if (i % 3 == 1) { player2.add(card); } else { player3.add(card); } } // 显示每个玩家的牌 System.out.println("Player 1: " + player1); System.out.println("Player 2: " + player2); System.out.println("Player 3: " + player3); // 计算每个玩家的得分 int score1 = calculateScore(player1); int score2 = calculateScore(player2); int score3 = calculateScore(player3); // 显示每个玩家的得分 System.out.println("Player 1 score: " + score1); System.out.println("Player 2 score: " + score2); System.out.println("Player 3 score: " + score3); // 显示获胜者 if (score1 > score2 && score1 > score3) { System.out.println("Player 1 wins!"); } else if (score2 > score1 && score2 > score3) { System.out.println("Player 2 wins!"); } else if (score3 > score1 && score3 > score2) { System.out.println("Player 3 wins!"); } else { System.out.println("It's a tie!"); } } // 创建一副扑克牌 public static List<String> createDeck() { List<String> deck = new ArrayList<String>(); String[] suits = {"Spades", "Hearts", "Diamonds", "Clubs"}; String[] ranks = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"}; for (String suit : suits) { for (String rank : ranks) { deck.add(rank + " of " + suit); } } return deck; } // 计算一手牌的得分 public static int calculateScore(List<String> hand) { int score = 0; for (String card : hand) { String rank = card.split(" ")[0]; if (rank.equals("Jack") || rank.equals("Queen") || rank.equals("King")) { score += 10; } else if (rank.equals("Ace")) { score += 11; } else { score += Integer.parseInt(rank); } } return score; } } ``` 这个程序创建了一副扑克牌,洗牌,然后将牌发给三个玩家。每个玩家的牌都被存储在一个列表中,然后计算每个玩家的得分。最后,程序显示每个玩家的得分,并宣布获胜者。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值