第四次java作业

1  简述

使用枚举类型对一副扑克牌(52张牌,不包括大小王)建模:
一副扑克牌有四种花色(Suit):HEART,SPADE,DIAMOND,CLUB;
有十三种等级(Rank):ACE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING;
创建2个枚举类型包含这两类实例。
每张扑克牌(Card)对象都会有这两个属性,创建一个带有这两个枚举类型属性的类Card。


2  为每个花色及大小建模

创建一个Poker类,为花色和大小分别创建两个枚举集。

public class Poker {
    enum Suit{HEART("♥",1),SPADE("♠",2),DIAMOND("♦",3),CLUB("♣",4);

        public String s;
        public int i;

        Suit(String s,int i) {
            this.s=s;
            this.i=i;
        }

        public String getS() {
            return s;
        }

        public int getI() {
            return i;
        }
    }
    enum Rank{TWO("2",2),THREE("3",3),FOUR("4",4),FIVE("5",5),SIX("6",6),SEVEN("7",7),EIGHT("8",8),NINE("9",9),TEN("10",10),JACK("J",11),QUEEN("Q",12),KING("K",13),ACE("A",14);

        public String r;
        public int i;

        Rank(String r,int i) {
            this.r=r;
            this.i=i;
        }

        public String getR() {
            return r;
        }

        public int getI() {
            return i;
        }
    }
}



这样,我们就有了创建一张牌的接口。


3  创建一张单牌

创建一个Card类,用来表明和获取一张牌的花色大小。

public class Card {
    public  Poker.Rank rank;
    public  Poker.Suit suit;
    public Card(Poker.Suit suit,Poker.Rank rank){
        this.rank=rank;
        this.suit=suit;
    }

    public Poker.Rank getRank() {
        return rank;
    }

    public Poker.Suit getSuit() {
        return suit;
    }

    @Override
    public String toString() {
        return suit.getS()+rank.getR();
    }

}

在上述代码中,使用toString()方法即可获得该卡的信息。


4  判断五张牌组成的套牌大小

根据德州扑克的玩法介绍,五张牌的花色大小决定这套牌的大小,所以我们写一个方法为每套牌计算权重。

import java.util.Arrays;
import java.util.Comparator;

class CardSet implements Comparable {

    public Card[] cards = new Card[5];

    public CardSet(Card[] cards) {
        this.cards = cards;
        Arrays.sort(cards, new cmp());
    }

    public String getCard() {
        for(int i=0;i<5;i++) {
            System.out.print(cards[i].getSuit().s + cards[i].getRank().r+",");
        }
        return (" ");
    }

    public int getHigh() {
        int max = 0;
        for (Card c : cards) {
            if (c.getRank().getI() > max)
                max = c.getRank().getI();
            if (c.getRank().getI() == 1)
                max = 14;
        }
        return max;
    }

    public int getPair() {
        int res = 0;
        for(int i=0;i<5;i++){
            for(int j=i+1;j<5;j++){
                if(cards[i].getRank()==cards[j].getRank())
                    res++;
            }
        }
        return res;
    }

    public boolean isThree() {
        return (getPair()==3);
    }

    public int isStraight() {
        int a = cards[4].getRank().getI() - cards[3].getRank().getI();
        int b = cards[3].getRank().getI() - cards[2].getRank().getI();
        int c = cards[2].getRank().getI() - cards[1].getRank().getI();
        int d = cards[1].getRank().getI() - cards[0].getRank().getI();
        if (a == b && b == c && c == d) {
            return 1;
        } else if (a == b && b == c && d == 0) {
            return 2;
        }
        return 0;
    }

    public boolean isFlush() {
        for (int i = 0; i < 4; i++) {
            if (cards[i].getSuit() != cards[i + 1].getSuit())
                return false;
        }
        return true;
    }

    public boolean isFullHouse() {
        return (getPair() == 4);
    }

    public boolean isFour() {
        return (getPair()==6);
    }

    public boolean isStraightFlush() {
        return (isStraight() == 1) && isFlush();
    }

    public boolean isRoyal() {
        return (isStraight() == 2) && isFlush();
    }

    public int getPoints() {
        if (isRoyal())
            return 23;
        else if (isStraightFlush())
            return 22;
        else if (isFour())
            return 21;
        else if (isFullHouse())
            return 20;
        else if (isFlush())
            return 19;
        else if (isStraight() != 0)
            return 18;
        else if (isThree())
            return 17;
        else if (getPair() == 2)
            return 16;
        else if (getPair() == 1)
            return 15;
        else
            return getHigh();
    }

    public String getName() {
        if (isRoyal())
            return "皇家同花顺";
        else if (isStraightFlush())
            return "同花顺";
        else if (isFour())
            return "四条";
        else if (isFullHouse())
            return "葫芦";
        else if (isFlush())
            return "同花";
        else if (isStraight() != 0)
            return "顺子";
        else if (isThree())
            return "三条";
        else if (getPair() == 2)
            return "两对";
        else if (getPair() == 1)
            return "一对";
        else
            return "散牌";

    }

    @Override
    public int compareTo(Object o) {
        if (this.getPoints() != ((CardSet) o).getPoints()) {
            if (this.getPoints() > ((CardSet) o).getPoints())
                return 1;
            else
                return -1;
        } else
            return 0;
    }

    class cmp implements Comparator {
        @Override
        public int compare(Object o1, Object o2) {
            Card c1 = (Card) o1;
            Card c2 = (Card) o2;
            if (c1.getRank().getR() != c2.getRank().getR())
                return c1.getRank().getI() > c2.getRank().getI() ? 1 : -1;
            else
                return 0;
        }
    }
}

其中散牌的权重为2-14依据其中最大单牌决定,而一对到皇家同花顺的权重从15依次加到23。


5  创建不同的几套牌进行比对

public class Main {
    public static void main(String[] args) {
        Card[] c1={new Card(Poker.Suit.DIAMOND,Poker.Rank.ACE ),new Card(Poker.Suit.DIAMOND,Poker.Rank.JACK ),new Card(Poker.Suit.DIAMOND,Poker.Rank.KING),
                new Card(Poker.Suit.DIAMOND,Poker.Rank.TEN ),new Card(Poker.Suit.DIAMOND,Poker.Rank.QUEEN )};
        Card[] c2={new Card(Poker.Suit.SPADE,Poker.Rank.JACK ),new Card(Poker.Suit.HEART,Poker.Rank.JACK ),new Card(Poker.Suit.CLUB,Poker.Rank.JACK),
                new Card(Poker.Suit.CLUB,Poker.Rank.FIVE ),new Card(Poker.Suit.SPADE,Poker.Rank.TWO )};
        Card[] c3={new Card(Poker.Suit.DIAMOND,Poker.Rank.ACE ),new Card(Poker.Suit.DIAMOND ,Poker.Rank.FOUR ),new Card(Poker.Suit.DIAMOND,Poker.Rank.THREE),
                new Card(Poker.Suit.CLUB,Poker.Rank.NINE ),new Card(Poker.Suit.SPADE,Poker.Rank.SIX )};
        Card[] c4={new Card(Poker.Suit.HEART,Poker.Rank.KING ),new Card(Poker.Suit.HEART,Poker.Rank.EIGHT ),new Card(Poker.Suit.DIAMOND,Poker.Rank.THREE ),
                new Card(Poker.Suit.CLUB,Poker.Rank.SEVEN ),new Card(Poker.Suit.SPADE,Poker.Rank.SEVEN )};
        Card[] c5={new Card(Poker.Suit.HEART,Poker.Rank.QUEEN ),new Card(Poker.Suit.HEART,Poker.Rank.TWO ),new Card(Poker.Suit.SPADE,Poker.Rank.THREE ),
                new Card(Poker.Suit.HEART,Poker.Rank.SEVEN ),new Card(Poker.Suit.DIAMOND,Poker.Rank.SEVEN )};

        CardSet deck1 = new CardSet(c1);
        CardSet deck2 = new CardSet(c2);
        CardSet deck3 = new CardSet(c3);
        CardSet deck4 = new CardSet(c4);
        CardSet deck5 = new CardSet(c5);
        System.out.print("套牌一为:");
        System.out.println(deck1.getCard() + "种类是: " + deck1.getName());
        System.out.print("套牌二为:");
        System.out.println(deck2.getCard() + "种类是: " + deck2.getName());
        System.out.print("套牌三为:");
        System.out.println(deck3.getCard() + "种类是: " + deck3.getName());
        System.out.print("套牌四为:");
        System.out.println(deck4.getCard() + "种类是: " + deck4.getName());
        System.out.print("套牌五为:");
        System.out.println(deck5.getCard() + "种类是: " + deck5.getName());
        System.out.println("套牌一是否比套牌二大:"+deck1.compareTo(deck2));
        System.out.println("套牌二是否比套牌三大:"+deck2.compareTo(deck3));
        System.out.println("套牌三是否比套牌一大:"+deck3.compareTo(deck1));
        System.out.println("套牌三是否比套牌四大:"+deck3.compareTo(deck4));
        System.out.println("套牌五是否比套牌二大:"+deck5.compareTo(deck2));
        System.out.println("套牌五是否比套牌四大:"+deck5.compareTo(deck4));
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值