Java扑克牌比大小

扑克牌比大小
要求:用户选择比较方式(分为一张牌比较和两张 牌比较两种方式),用户输入底牌的数量(一张牌比较模式底牌 最少2张最多54张;两张牌比较模式底牌最少4张最多54张 ),即从5 4张牌中随机抽出足够数量的底牌。用户A和用户B 分别从底牌中抽取牌进行比较,然后判断谁赢谁输,最后让用户 选择是否在玩一次。一张牌大小比较规则:大王〉小王〉A〉K 〉Q〉J〉10〉9……〉2,相同点数按照花色黑 红〉梅〉方进行比较。两张牌大小比较规则:对子大于非对子, 均为单张即按照一张牌比较规则比较最大那张,均为对子按一张 牌点数比较规则,双方对子点数一样,比较花色,即拥有黑桃的赢。
求思路😭😭

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7697011
  • 除此之外, 这篇博客: Java里重载、重写、多态之间的联系和区别中的 方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

  • 引用:Java—重写与重载的区别

  • 以下回答由chatgpt基于相关博客总结生成:

    针对问题"请问您需要帮助实现Java扑克牌的比大小吗?",以下是一个可能的实现方案:

    1. 首先定义一个扑克牌的数据结构,可以使用一个类来表示一张牌,包括花色和点数两个属性
    public class Card {
        private int suit; // 花色,0-3分别表示黑桃、红桃、梅花、方块
        private int face; // 点数,1-13分别表示A、2-10、J、Q、K
        // 构造函数,需要传入花色和点数
        public Card(int suit, int face) {
            this.suit = suit;
            this.face = face;
        }
        // 定义equals方法,用于比较两张牌是否相等
        @Override
        public boolean equals(Object obj) {
            if (obj instanceof Card) {
                Card other = (Card) obj;
                return this.suit == other.suit && this.face == other.face;
            }
            return false;
        }
        // 定义toString方法,用于打印牌的内容
        @Override
        public String toString() {
            String[] suits = {"黑桃", "红桃", "梅花", "方块"};
            String[] faces = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
            return suits[suit] + faces[face-1];
        }
    }
    
    1. 定义一个比较大小的规则,这里使用常规的扑克牌大小比较规则(即先比较点数,点数相同时再比较花色)
    public class CardComparator implements Comparator<Card> {
        @Override
        public int compare(Card c1, Card c2) {
            if (c1.face != c2.face) {
                return c1.face - c2.face;
            } else {
                return c1.suit - c2.suit;
            }
        }
    }
    
    1. 对于一副完整的扑克牌,可以使用一个List来表示,每次发牌或者出牌都需要从这个List中删除对应的牌
    public class Deck {
        private List<Card> cards = new ArrayList<>();
        public Deck() {
            for (int suit = 0; suit < 4; suit++) {
                for (int face = 1; face <= 13; face++) {
                    cards.add(new Card(suit, face));
                }
            }
        }
        // 洗牌
        public void shuffle() {
            Collections.shuffle(cards);
        }
        // 发一张牌
        public Card dealOneCard() {
            if (cards.isEmpty()) {
                return null;
            }
            return cards.remove(0);
        }
    }
    
    1. 比较两副牌的大小时,可以按以下步骤进行:
    2. 将两副牌分别按照点数从小到大排序
    3. 对每组对应的牌进行比较,如果有一组中的牌更大,则可以直接判断该副牌更大;如果每组对应的牌大小相同,则比较下一组牌,直至两副牌中有一副大小更大
    public class PokerComparator {
        private CardComparator cardComparator = new CardComparator();
        // 比较两副扑克牌的大小,返回1表示p1比p2大,返回-1表示p2比p1大,返回0表示相等
        public int compare(List<Card> p1, List<Card> p2) {
            List<Card> copy1 = new ArrayList<>(p1);
            List<Card> copy2 = new ArrayList<>(p2);
            copy1.sort(cardComparator);
            copy2.sort(cardComparator);
            for (int i = copy1.size()-1; i >= 0; i--) {
                int cmp = cardComparator.compare(copy1.get(i), copy2.get(i));
                if (cmp > 0) {
                    return 1;
                } else if (cmp < 0) {
                    return -1;
                }
            }
            return 0;
        }
    }
    
    1. 最后,可以通过一个简单的测试程序来检验上述代码是否能够正常工作,例如:
    public class Test {
        public static void main(String[] args) {
            Deck deck = new Deck();
            deck.shuffle();
    
            List<Card> p1 = new ArrayList<>();
            List<Card> p2 = new ArrayList<>();
            for (int i = 0; i < 5; i++) {
                p1.add(deck.dealOneCard());
                p2.add(deck.dealOneCard());
            }
            System.out.println("玩家1的牌:" + p1);
            System.out.println("玩家2的牌:" + p2);
            PokerComparator comparator = new PokerComparator();
            int cmp = comparator.compare(p1, p2);
            if (cmp > 0) {
                System.out.println("玩家1赢了!");
            } else if (cmp < 0) {
                System.out.println("玩家2赢了!");
            } else {
                System.out.println("两副牌大小相同!");
            }
        }
    }
    

    以上程序是一个简单的实现方案,可能还有一些细节需要完善或者优化,例如可以对扑克牌的大小比较规则进行调整,或者添加一些异常处理等等。希望能够对你有所帮助!