gpt4 book ai didi

java - 纸牌 JAVA

转载 作者:搜寻专家 更新时间:2023-10-30 19:49:36 27 4
gpt4 key购买 nike

我已经创建了我的牌组,可以处理每张牌和一套花色,直到没有牌为止。对于我的项目,我需要将它分成 3 个类,其中包括一个驱动程序类。我首先创建了一个包含所有内容的类,所以我知道如何让它全部工作。

public class DeckOfCards2 {
public static void main(String[] args) {
int[] deck = new int[52];
String[] suits = {"Spades", "Hearts", "Diamonds", "Clubs"};
String[] ranks = {"Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"};

// Initialize cards
for (int i = 0; i < deck.length; i++) {
deck[i] = i;
}

// Shuffle the cards
for (int i = 0; i < deck.length; i++) {
int index = (int)(Math.random() * deck.length);
int temp = deck[i];
deck[i] = deck[index];
deck[index] = temp;
}

// Display the all the cards
for (int i = 0; i < 52; i++) {
String suit = suits[deck[i] / 13];
String rank = ranks[deck[i] % 13];
System.out.println( rank + " of " + suit);
}
}
}

现在尝试将其分成 3 类。我的 DeckOfCards 类上的所有套牌/套装变量上都出现了红色波浪线。我不知道如何修复它。

public class DeckOfCards {
private Card theCard;
private int remainingCards = 52;

DeckOfCards() {
theCard = new Card();
}

public void shuffle(){
for (int i = 0; i < deck.length; i++) {
int index = (int)(Math.random() deck.length);
int temp = deck[i];
deck[i] = deck[index];
deck[index] = temp;
remainingCards--;
}
}

public void deal(){
for (int i = 0; i < 52; i++) {
String suit = suits[deck[i] / 13];
String rank = ranks[deck[i] % 13];
System.out.println( rank + " of " + suit);
System.out.println("Remaining cards: " + remainingCards);
}
}
}

卡片类:

public class Card {
int[] deck = new int[52];
String[] suits = {"Spades", "Hearts", "Diamonds", "Clubs"};
String[] ranks = {"Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"};

Card() {
for (int i = 0; i < deck.length; i++) {
deck[i] = i;
}
}
}

经销商类

public class Dealer {
public static void main(String[]args){
System.out.println("The deck will randomly print out a card from a full deck each time");

DeckOfCards player = new DeckOfCards();
player.deal();
}
}

最佳答案

正如其他人所说,您的设计不是很清晰和面向对象。

最明显的错误是在您的设计中一张卡片知道一副纸牌。 Deck 应该了解卡片并在其构造函数中实例化对象。例如:

public class DeckOfCards {
private Card cards[];

public DeckOfCards() {
this.cards = new Card[52];
for (int i = 0; i < ; i++) {
Card card = new Card(...); //Instantiate a Card
this.cards[i] = card; //Adding card to the Deck
}
}

之后,如果需要,您还可以扩展 Deck 以构建不同的卡片组(例如超过 52 张卡片,Jolly 等)。例如:

public class SpecialDeck extends DeckOfCards {
....

我要更改的另一件事是使用字符串数组来表示花色和等级。从 Java 1.5 开始,该语言支持 Enumeration,这非常适合此类问题。例如:

public enum Suits {
SPADES,
HEARTS,
DIAMONDS,
CLUBS;
}

使用枚举,您可以获得一些好处,例如:

1) Enum 是类型安全的,除了预定义的 Enum 常量之外,您不能将任何其他内容分配给 Enum 变量。例如,您可以按如下方式编写 Card 的构造函数:

public class Card {

private Suits suit;
private Ranks rank;

public Card(Suits suit, Ranks rank) {
this.suit = suit;
this.rank = rank;
}

通过这种方式,您可以确保构建只接受枚举值的一致卡片。

2) 您可以在 Java 中的 Switch 语句中使用 Enum,例如 int 或 char 基本数据类型(这里我们不得不说,因为 Java 1.7 switch 语句也允许在 String 上使用)

3) 在 Java 的 Enum 上添加新常量很容易,您可以在不破坏现有代码的情况下添加新常量。

4) 您可以遍历 Enum,这在实例化 Cards 时非常有用。例如:

/* Creating all possible cards... */
for (Suits s : Suits.values()) {
for (Ranks r : Ranks.values()) {
Card c = new Card(s,r);
}
}

为了不再重复发明轮子,我还改变了将 Cards 从数组保存到 Java Collection 的方式,这样您就可以获得许多强大的方法来处理您的套牌,但最重要的是您可以使用Java Collection's shuffle function洗牌。例如:

private List<Card> cards = new ArrayList<Card>();

//Building the Deck...

//...

public void shuffle() {
Collections.shuffle(this.cards);
}

关于java - 纸牌 JAVA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15942050/

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