题目要求:
假设开发⽃地主纸牌游戏。⼀副牌总共54张,顺序为A、2~10、J~K、⼩王、⼤王;除了⼤⼩王 之外,其它依次为红桃、⿊桃、⽅块和梅花;类Card,它包含数据字段:flush,表示花⾊; number,范围[1, 13](⼤⼩王除外)。花⾊由枚举Flush定义:HEART,0,红桃;SPADE,1,⿊ 桃;DIAMOND,2,⽅块;CLUB,3,梅花;JOKER,4,⼤⼩王(⼤王的number为1,⼩王的 number为0);类Deck,其私有数据字段List cards,包含所有的纸牌;成员⽅法boolean add(Card card)和boolean add(Flush fluash, int number)向其中添加⼀张牌,如果已经有了18张 牌,返回false;否则,返回true;成员⽅法boolean contain(Flush flush, int number)确定是否包含 参数给定的纸牌;成员⽅法bool isFull()确定是否已经包含了18张牌;成员⽅法void reset()执⾏复 位,即清空所有的纸牌;类Poker,私有数据字段:deckA、deckB、deckC,类型为Deck,表示发 给三个玩家的牌,要求能够获取它们;公有成员⽅法void deal()实现为三个玩家随机发牌并确保在 发牌之前,将deckA、deckB、deckC复位;可根据情况添加辅助⽅法;PokerGame,在其⼊⼝点 main()中创建Poker的⼀个实例,调⽤其deal()函数随机发牌,获取三个玩家的牌,并输出到控制台 (终端)窗⼝中。
Java代码实现:
import java.util.ArrayList;
import java.util.List;
public class PokerGame {
public static void main(String[] args) {
Poker p = new Poker();
p.deal();
}
}
/*
* 类Card,
* 它包含数据字段:flush,表示花⾊; number,范围[1, 13](⼤⼩王除外)。
*
* */
class Card{
private int number;
private Flush flush;
public Card(Flush flush,int number) {
this.number = number;
this.flush = flush;
}
public Flush getFlush() {
return flush;
}
public void setFlush(Flush flush) {
this.flush = flush;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
//重写contains方法中调用的equals方法
@Override
public boolean equals(Object obj){
Card c = (Card)obj;
return this.getFlush().equals(c.getFlush()) && this.getNumber() == c.getNumber();
}
}
/*
* 花⾊由枚举Flush定义:
* HEART,0,红桃;
* SPADE,1,⿊ 桃;
* DIAMOND,2,⽅块;
* CLUB,3,梅花;
* JOKER,4,⼤⼩王(⼤王的number为1,⼩王的 number为0);
*
* */
enum Flush{
HEART("0","红桃"),
SPADE("1","黑桃"),
DIAMOND("2","方块"),
CLUB("3","梅花"),
JOKER("4","大小王");
private final String FlushName;
private final String FlushDesc;
private Flush(String FlushDesc,String FlushName){
this.FlushName = FlushName;
this.FlushDesc = FlushDesc;
}
public String getFlushName() {
return FlushName;
}
public String getFlushDesc() {
return FlushDesc;
}
/*
* 通过Desc-获取name
* public static String getNameByDesc(String desc) {
* for (Flush f : Flush.values()) {
* if (desc.equals(f.FlushDesc)) {
* return f.getFlushName();
* }
* }
* return desc;
*}
* */
}
/*
* 类Deck
* 其私有数据字段List cards,包含所有的纸牌;
* 成员⽅法boolean add(Card card)和boolean add(Flush fluash, int number)向其中添加⼀张牌,如果已经有了18张 牌,返回false;否则,返回true;
* 成员⽅法boolean contain(Flush flush, int number)确定是否包含 参数给定的纸牌;
* 成员⽅法bool isFull()确定是否已经包含了18张牌;
* 成员⽅法void reset()执⾏复 位,即清空所有的纸牌
* */
class Deck{
private List<Card> cards;
public Deck() {
this.cards = cards;
cards = new ArrayList<>();
reset();
}
public List<Card> getCards() {
return cards;
}
//成员⽅法boolean add(Card card)和boolean add(Flush fluash, int number)向其中添加⼀张牌,如果已经有了18张 牌,返回false;否则,返回true;
public boolean add(Card card){
card = new Card(card.getFlush(),card.getNumber());
if(this.getCards().size() <= 18){
this.getCards().add(card);
return true;
}else
return false;
}
public boolean add(Flush flush, int number){
if(cards.size() < 18){
cards.add(new Card(flush,number));
return true;
}else
return false;
}
//成员⽅法boolean contain(Flush flush, int number)确定是否包含 参数给定的纸牌;
public boolean contain(Flush flush, int number){
if(cards.contains(new Card(flush,number))){//需重写contains方法
return true;
}else
return false;
}
//成员⽅法bool isFull()确定是否已经包含了18张牌;
public boolean isFull(){
if(getCards().size() == 18)
return true;
else
return false;
}
//成员⽅法void reset()执⾏复 位,即清空所有的纸牌
public void reset(){
getCards().clear();
}
}
/*
* 类Poker
* 私有数据字段:deckA、deckB、deckC,类型为Deck,表示发 给三个玩家的牌,要求能够获取它们;
* 公有成员⽅法void deal()实现为三个玩家随机发牌并确保在 发牌之前,将deckA、deckB、deckC复位;
* 可根据情况添加辅助⽅法;
* */
class Poker{
private Deck deckA;
private Deck deckB;
private Deck deckC;
public Deck getDeckA() {
return deckA;
}
public Deck getDeckB() {
return deckB;
}
public Deck getDeckC() {
return deckC;
}
//公有成员⽅法void deal()实现为三个玩家随机发牌并确保在 发牌之前,将deckA、deckB、deckC复位;
public void deal(){
Flush[] flush = Flush.values();
deckA = new Deck();//Deck构造器中调用reset()方法实现复位
deckB = new Deck();
deckC = new Deck();
int i = 0;
int j = 0;
int k = 0;
System.out.println("deckA的牌:");
while(!deckA.isFull()){
int n = (int)(Math.random()*(14-1)+1);
int f = (int)(Math.random()*(5-0)+0);
if(f == 4){
n = (int)(Math.random()*(2-0)+0);
}
if(!deckA.contain(flush[f],n)){
deckA.add(flush[f],n);
System.out.print(deckA.getCards().get(i).getFlush().getFlushName() + deckA.getCards().get(i).getNumber() + " ");
i++;
}
}
System.out.println();
System.out.println("deckB的牌:");
while(!deckB.isFull()){
int n = (int)(Math.random()*(14-1)+1);
int f = (int)(Math.random()*(5-0)+0);
if(f == 4){
n = (int)(Math.random()*(2-0)+0);
}
if(!deckA.contain(flush[f],n) && !deckB.contain(flush[f],n)){
deckB.add(flush[f],n);
System.out.print(deckB.getCards().get(j).getFlush().getFlushName() + deckB.getCards().get(j).getNumber() + " ");
j++;
}
}
System.out.println();
System.out.println("deckC的牌:");
while(!deckC.isFull()){
int n = (int)(Math.random()*(14-1)+1);
int f = (int)(Math.random()*(5-0)+0);
if(f == 4){
n = (int)(Math.random()*(2-0)+0);
}
if(!deckA.contain(flush[f],n) && !deckB.contain(flush[f],n) && !deckC.contain(flush[f],n)){
deckC.add(flush[f],n);
System.out.print(deckC.getCards().get(k).getFlush().getFlushName() + deckC.getCards().get(k).getNumber() + " ");
k++;
}
}
}
}