Java 21点OOP
我试图通过创建一个21点游戏来实现Java中OOP的最大潜力。到目前为止,我有5个java文件 Suit.javaJava 21点OOP,java,oop,enums,blackjack,Java,Oop,Enums,Blackjack,我试图通过创建一个21点游戏来实现Java中OOP的最大潜力。到目前为止,我有5个java文件 Suit.java enum Suit { /* * Initialize suit values */ HEARTS, SPADES, CLUBS, DIAMONDS; } Rank.java enum Rank { /* * Initialize rank and card value */ TWO(2), T
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;
}
}
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() );
}
}
}
import java.util.ArrayList;
导入java.util.Iterator;
公开课游戏{
公共静态void main(字符串[]args){
甲板=新甲板();
对于(int i=0;i int getCardValue()而不是(Card.java)->Rank getCardValue()?是否需要执行一些多态性?扩展?我希望int值而不是文本值
谢谢!要回答您的直接问题,您只需简单地链接方法:
Card myCard = new Card(Rank.TWO, Suit.HEARTS);
int value = myCard.getCardValue().getCardValue();
第一个getCardValue()
调用返回一个Rank对象,下一个getCardValue()
get是Rank的值。但这让我很困惑,两个同名的方法返回不同的类型。我自己,我会将Card的getCardValue()
重命名为更直接、更符合逻辑的getRank()
和Rank的getCardValue()
更简单的getValue()
。这样代码看起来更符合逻辑:
int value = myCard.getRank().getValue();
至于你的另一个问题,“设计还可以吗”,这对这个网站来说太宽泛了,但我认为你使用继承很好,你不想过度使用继承,并且在你做的时候坚持使用组合。我还要说,你需要考虑ACE有两个可能的值,1和11
例如,可能类似于:
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;
}
}
只是想抛出一些备选方案:我可能会以不同的方式对排名的值进行建模。因为ace
实际上没有一个确定的值。一个Hand
有一个值,但即使它实际上也有一个“最佳值”,这可能算作ace
11或1
因此,我可能会删除秩的值,并引入一个手:
public-class-Hand{
私人手牌(收集卡){
...
}
private int calculateBestValue(){
...
}
}
我也不会公开这个值的计算。Hand
可以“呈现”自己,所以它也可以说你是否有一个“软”值
我还认为Deck
不应该有一个getDeck()
方法。这违反了封装。相反,它应该有一个名为:nextCard()
的方法。该方法将从卡片组顶部为您提供下一张卡片。它可能需要一个isEmpty()
方法,该方法返回牌组是否有牌。对于本网站来说,这可能不是一个合适的问题。话虽如此,您将如何处理ACE排名1和11的潜在双重值?是的,对于这个问题,一个更好的地方是获取排名,只需使用getRank()
并对返回的对象调用getValue()
。。或者不管您给这些方法起什么名字。在类Deck
中使用泛型:ArrayList
,而不是ArrayList
。谢谢。我还使用了两次getCardValue()。我刚刚将Rank版本更改为getRank()。