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));
}
}