gpt4 book ai didi

Java 二十一点 OOP

转载 作者:行者123 更新时间:2023-11-29 04:43:30 24 4
gpt4 key购买 nike

我正在尝试通过创建二十一点游戏来发挥 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;
}
}

卡片.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;
}
}

甲板.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;
}
}

游戏.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 值而不是文本值。

谢谢!

最佳答案

要回答您的直接问题,您需要做的就是简单地链接方法:

Card myCard = new Card(Rank.TWO, Suit.HEARTS);
int value = myCard.getCardValue().getCardValue();

第一个 getCardValue() 调用返回一个 Rank 对象,下一个 getCardValue() 获取排名的值。但这让我感到困惑,两个同名的方法返回不同的类型。我自己会将 Card 的 getCardValue() 重命名为更直接和合乎逻辑的 getRank() 并将 Rank 的 getCardValue() 重命名为更简单的获取值()。然后代码看起来更合乎逻辑:

int value = myCard.getRank().getValue();

至于你的另一个问题,“设计是否可行”,对于这个网站来说太宽泛了,但我认为你很好地使用了继承,你不想过度使用继承并坚持使用组合正如你所做的那样。我还要说的是,您需要考虑具有两个可能值 1 和 11 的 ACE。

例如,可能是这样的:

public enum Rank {

TWO(2, 0, false),
THREE(3, 0, false),
FOUR(4, 0, false),
FIVE(5, 0, false),
SIX(6, 0, false),
SEVEN(7, 0, false),
EIGHT(8, 0, false),
NINE(9, 0, false),
TEN(10, 0, false),
JACK(10, 0, false),
QUEEN(10, 0, false),
KING(10, 0, false),
ACE(11, 1, true);

private int value;
private int value2;
private boolean twoValues;

private Rank(int value, int value2, boolean twoValues) {
this.value = value;
this.value2 = value2;
this.twoValues = twoValues;
}

public int getValue() {
return value;
}

public int getValue2() {
// TODO: consider throwing a custom exception if twoValues is false
return value2;
}

public boolean hasTwoValues() {
return twoValues;
}
}

关于Java 二十一点 OOP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38245816/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com