跳转到主内容
思享编程网:思考分享,玩转编程世界!

第四次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)); } }

相关文章