如何将代码从程序转换为 class(Getters 和 setter)

How to convert code from program to class (Getters and setter)

我正在尝试创建一个纸牌游戏,它会从不同的 class 中随机生成一张纸牌。问题是专用于随机卡的代码块很大。有没有办法将这部分代码转移到我的Cardclass中,并在主程序中使用getters和setters?或者有没有办法让生成随机卡的代码更简单?

主程序:

String NewCard = "";
int theSuit, theRank;

for(int i=0; i<1; i++) { 
theRank= (int)(Math.random()*13);
theSuit = (int)(Math.random()*5);

clsCard cardFace = new clsCard( theSuit, theRank);

NewCard =cardFace.toString();
System.out.println(" Your new card  is " + NewCard);

卡片Class:

public class clsCard {

    private int value;
    private int rank, suit;
    private final int MaxFaceValue= 10;
    private static String[] suits = {"Joker","hearts","spades","diamond","clubs"};
    private static String[] ranks = {"Joker","Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"};

    public clsCard(int suit, int rank)
    {
        this.rank=rank;
        this.suit=suit;
    }

    public @Override String toString()
    {
        if(ranks[rank].equals("Joker") || suits[suit].equals("Joker"))
            return "Joker";
        else
            return ranks[rank] + " of " + suits[suit];
    }

    public int getRank()
    {
        return rank;
    }

    public int getSuit()
    {
        return suit;
    }
}

创建一个生成随机值的构造函数

 public clsCard() {
    this.rank= (int)(Math.random()*ranks.length);
    this.suit= (int)(Math.random()*suits.length);
}

new clsCard()在另一个class

你也可以做一些public static List<clsCard> generateCards(int amount)方法来不污染你的主方法。

那你可以

for (clsCard c : clsCard.generateCards(1)) {
    System.out.println(" Your new card  is " + c);
} 

我能想到两个方案:

您可以决定 clsCard 的不带参数的构造函数将随机生成值,使用它:

public clsCard() {
    this.suit = (int)(Math.random() * suits.length);
    this.rank = (int)(Math.random() * ranks.length);
}

但这似乎有点武断。

您还可以在 clsCard 中创建一个 static 方法来生成随机实例。

public static clsCard generateRandomCard() {
    return new clsCard((int)(Math.random() * suits.length), 
                       (int)(Math.random() * ranks.length));
}

顺便说一下,与您的问题无关的评论:您生成随机卡片的方法并没有真正使每张卡片的 52 张中有 1 张(小丑出现的频率更高)。如果这很重要,您可能需要考虑一下。

人们告诉你给你的卡片一个生成随机卡片的构造函数,我不同意。如果这是你的目标,select 一张随机卡片,如果你的目标是让你的代码反映现实,那么要正确解决这个问题,你需要另一个 class,一个 Deck class,一张持有 collection 张牌的牌,可能是 List<Card>ArrayList<>。然后你可以通过调用 Collections.shuffle(cardList);shuffle 牌组(它的 collection),并通过调用它的 .remove(0) 方法从 ArrayList 中提取洗牌,一个从 collection 和 returns 中删除第一张卡片。

另请注意,此类程序经常用于有关如何以及在何处使用枚举的教程中,因为卡片的花色和等级(或值)非常适合作为枚举。例如:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CardFun {
    public static void main(String[] args) {
        Deck deck = new Deck();
        for (int i = 0; i < 5; i++) {
            System.out.println(deck.deal());
        }
    }
}

enum Rank {
    JOKER(0), ACE(1), TWO(2), THREE(3), FOUR(4), FIVE(5), SIX(6), SEVEN(7), EIGHT(8), NINE(9),
    TEN(10), JACK(11), QUEEN(12), KING(13);
    private int value;

    private Rank(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

}

enum Suit {
    CLUBS, DIAMONDS, HEARTS, SPADES  
}

class Card {
    private Suit suit;
    private Rank rank;
    public Card(Suit suit, Rank rank) {
        this.suit = suit;
        this.rank = rank;
    }
    public Suit getSuit() {
        return suit;
    }
    public Rank getRank() {
        return rank;
    }

    @Override
    public String toString() {
        if (rank == Rank.JOKER) {
            return "joker";
        } 
        return "" + rank + " of " + suit;            
    }

    // equals and hashCode    
}

class Deck {
    private List<Card> cardList = new ArrayList<>();

    public Deck() {
        regenerate();
    }

    final public void regenerate() {
        cardList = new ArrayList<>();
        for (Suit suit : Suit.values()) {
            for (int i = 1; i < Rank.values().length; i++) {
                Rank rank = Rank.values()[i];
                Card card = new Card(suit, rank);
                cardList.add(card);
            }
        }
        Collections.shuffle(cardList);
    }

    public Card deal() {
        if (cardList.size() == 0) {
            // throw an exception
        }
        return cardList.remove(0);
    }
}