【发布时间】:2016-11-09 19:01:09
【问题描述】:
我正在尝试通过创建二十一点游戏来发挥 Java 中 OOP 的最大潜力。到目前为止,我有 5 个 java 文件。
西装.java
enum Suit {
/*
* Initialize suit values
*/
HEARTS,
SPADES,
CLUBS,
DIAMONDS;
}
Rank.java
enum Rank {
/*
* Initialize rank and card value
*/
TWO(2),
THREE(3),
FOUR(4),
FIVE(5),
SIX(6),
SEVEN(7),
EIGHT(8),
NINE(9),
TEN(10),
JACK(10),
QUEEN(10),
KING(10),
ACE(11);
// Hold card value
private int cardValue;
/*
* Constructor set card value
* @param cardValue value of card
*/
private Rank(int cardValue) {
this.cardValue = cardValue;
}
/*
* This method obtains the card value
* @return This returns the value of card
*/
public int getCardValue() {
return cardValue;
}
}
Card.java
public class Card {
private Suit suit;
private Rank rank;
public Card(Rank rank, Suit suit) {
this.rank = rank;
this.suit = suit;
}
public Rank getCardValue() {
return rank;
}
public Suit getSuitValue() {
return suit;
}
}
deck.java
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
public class Deck {
private ArrayList deck;
public Deck() {
this.deck = new ArrayList();
for(Suit suit : Suit.values()) {
for(Rank rank: Rank.values()) {
Card card = new Card(rank, suit);
this.deck.add(card);
}
}
Collections.shuffle(deck);
}
public ArrayList getDeck() {
return deck;
}
}
Game.java
import java.util.ArrayList;
import java.util.Iterator;
public class Game {
public static void main(String[] args) {
Deck deck = new Deck();
for(int i=0; i<deck.getDeck().size(); i++) {
System.out.println( ((Card) deck.getDeck().get(i)).getCardValue() + " of "
+ ((Card) deck.getDeck().get(i)).getSuitValue() );
}
}
}
到目前为止,我的设计有意义吗?另外,我如何调用 (Rank.java) -> int getCardValue() 而不是 (Card.java) -> Rank getCardValue()?我需要做一些多态性吗?延长?我想要 int 值而不是 text 值。
谢谢!
【问题讨论】:
-
这可能不是本网站的合适问题。话虽如此,您将如何处理 ACE 等级 1 和 11 的潜在双重价值?
-
是的,这个问题确实更好的地方是codereview.SE.com
-
至于获得排名,只需使用
getRank()并在返回的对象上调用getValue()....或者您为这些方法提供的任何名称。 -
使用泛型:
ArrayList<Card>在你的班级Deck,而不是raw typeArrayList。