Java 一副纸牌
我已经创建了一副牌,可以处理每一张牌和一套衣服,直到没有剩余的牌为止。对于我的项目,我需要将其分为3个类,其中包括一个驱动程序类。我首先创建了一个包含所有内容的类,因此我知道如何使所有内容都工作Java 一副纸牌,java,Java,我已经创建了一副牌,可以处理每一张牌和一套衣服,直到没有剩余的牌为止。对于我的项目,我需要将其分为3个类,其中包括一个驱动程序类。我首先创建了一个包含所有内容的类,因此我知道如何使所有内容都工作 public class DeckOfCards2 { public static void main(String[] args) { int[] deck = new int[52]; String[] suits = {"Spades", "Hearts", "Diamonds
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);
}
}
}
首先,您的类有一个架构问题。您将属性
卡片组
移动到了类卡片
中。但当然,它是卡片组的一个属性,因此必须在类DeckOfCards
中。然后,初始化循环不应该在卡的构造函数中,而应该在您的deck类中。此外,当前的牌组是int
的数组,但应该是卡的数组
第二,在方法Deal
中,您应该将suits
称为Card.suits
,并将此成员设为最终成员。与等级相同
最后,请遵守命名约定。方法名称总是以小写字母开头,即shuffle
而不是shuffle
您的设计有问题。试着让你的类代表真实世界的事物。例如:
private List<Card> cards = new ArrayList<Card>();
//Building the Deck...
//...
public void shuffle() {
Collections.shuffle(this.cards);
}
- 班级卡应代表一张卡,即“卡”的性质。卡片类不需要了解甲板
- 牌组类应该包含52个牌对象(加上小丑?)李>
您的代码中有许多错误,例如,您只是在Shuffle
方法中键入deck
,而不是真正调用您的deck。您只能通过键入card.deck
我已更改您的洗牌方法:
public void Shuffle(){
for (int i = 0; i < theCard.deck.length; i++) {
int index = (int)(Math.random()*theCard.deck.length );
int temp = theCard.deck[i];
theCard.deck[i] = theCard.deck[index];
theCard.deck[index] = temp;
remainingCards--;
}
}
public void Shuffle(){
for(int i=0;i
还有,据说你有结构性问题。你应该按照你在现实生活中的理解命名类,例如,当你说卡片时,它只是一张卡片,当你说卡片时,它应该是52+2张卡片。这样你的代码就更容易理解了。正如其他人所说,你的设计不是很清晰,也不是面向对象的
最明显的错误是,在你的设计中,一张牌知道一副牌。卡片组应该了解卡片并在其构造函数中实例化对象。例如:
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
}
}
public class SpecialDeck extends DeckOfCards {
....
/* Creating all possible cards... */
for (Suits s : Suits.values()) {
for (Ranks r : Ranks.values()) {
Card c = new Card(s,r);
}
}
我要改变的另一件事是使用字符串数组来表示西服和军衔。自Java1.5以来,该语言支持枚举,这非常适合此类问题。例如:
public enum Suits {
SPADES,
HEARTS,
DIAMONDS,
CLUBS;
}
使用Enum,您可以获得一些好处,例如:
private List<Card> cards = new ArrayList<Card>();
//Building the Deck...
//...
public void shuffle() {
Collections.shuffle(this.cards);
}
1) Enum是类型安全的。除了预定义的Enum常量,您不能为Enum变量分配任何其他内容。例如,您可以按照以下方式编写卡的构造函数:
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语句也可以用于字符串)
3) 在Java中的Enum上添加新常量很容易,您可以在不破坏现有代码的情况下添加新常量
4) 您可以迭代枚举,这在实例化卡片时非常有用。例如:
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
}
}
public class SpecialDeck extends DeckOfCards {
....
/* Creating all possible cards... */
for (Suits s : Suits.values()) {
for (Ranks r : Ranks.values()) {
Card c = new Card(s,r);
}
}
为了避免再次发明轮子,我还将改变将卡片从数组保存到Java集合的方式,通过这种方式,您可以在牌组上使用许多强大的方法,但最重要的是,您可以使用来洗牌牌组。例如:
private List<Card> cards = new ArrayList<Card>();
//Building the Deck...
//...
public void shuffle() {
Collections.shuffle(this.cards);
}
private List cards=new ArrayList();
//建造甲板。。。
//...
公开无效洗牌(){
收集。洗牌(这张牌);
}
您的程序中有很多错误
指数的计算。我想应该是Math.random()%deck.length
在卡片的展示中。根据我的说法,你应该制作一个等级适合的卡片类别,并制作该类别类型的数组
如果你愿意,我可以给你完整的结构,但最好是你自己做这里有一些代码。它使用两个类(Card.java和Deck.java)来完成这个问题,并且在创建Deck对象时,它会自动为您排序。:)
import java.util.*;
公共课2{
ArrayList cards=新的ArrayList();
字符串[]值={“A”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”、“10”、“J”、“Q”、“K”};
字符串[]套装={“俱乐部”、“黑桃”、“钻石”、“心脏”};
静态布尔值firstThread=true;
公众谘询委员会2(){
对于(int i=0;i我认为解决方案与此一样简单:
Card temp = deck[cardAindex];
deck[cardAIndex]=deck[cardBIndex];
deck[cardBIndex]=temp;
这是我的实现:
public class CardsDeck {
private ArrayList<Card> mCards;
private ArrayList<Card> mPulledCards;
private Random mRandom;
public enum Suit {
SPADES,
HEARTS,
DIAMONDS,
CLUBS;
}
public enum Rank {
TWO,
THREE,
FOUR,
FIVE,
SIX,
SEVEN,
EIGHT,
NINE,
TEN,
JACK,
QUEEN,
KING,
ACE;
}
public CardsDeck() {
mRandom = new Random();
mPulledCards = new ArrayList<Card>();
mCards = new ArrayList<Card>(Suit.values().length * Rank.values().length);
reset();
}
public void reset() {
mPulledCards.clear();
mCards.clear();
/* Creating all possible cards... */
for (Suit s : Suit.values()) {
for (Rank r : Rank.values()) {
Card c = new Card(s, r);
mCards.add(c);
}
}
}
public static class Card {
private Suit mSuit;
private Rank mRank;
public Card(Suit suit, Rank rank) {
this.mSuit = suit;
this.mRank = rank;
}
public Suit getSuit() {
return mSuit;
}
public Rank getRank() {
return mRank;
}
public int getValue() {
return mRank.ordinal() + 2;
}
@Override
public boolean equals(Object o) {
return (o != null && o instanceof Card && ((Card) o).mRank == mRank && ((Card) o).mSuit == mSuit);
}
}
/**
* get a random card, removing it from the pack
* @return
*/
public Card pullRandom() {
if (mCards.isEmpty())
return null;
Card res = mCards.remove(randInt(0, mCards.size() - 1));
if (res != null)
mPulledCards.add(res);
return res;
}
/**
* Get a random cards, leaves it inside the pack
* @return
*/
public Card getRandom() {
if (mCards.isEmpty())
return null;
Card res = mCards.get(randInt(0, mCards.size() - 1));
return res;
}
/**
* Returns a pseudo-random number between min and max, inclusive.
* The difference between min and max can be at most
* <code>Integer.MAX_VALUE - 1</code>.
*
* @param min Minimum value
* @param max Maximum value. Must be greater than min.
* @return Integer between min and max, inclusive.
* @see java.util.Random#nextInt(int)
*/
public int randInt(int min, int max) {
// nextInt is normally exclusive of the top value,
// so add 1 to make it inclusive
int randomNum = mRandom.nextInt((max - min) + 1) + min;
return randomNum;
}
public boolean isEmpty(){
return mCards.isEmpty();
}
}
公共类shuffleCards{
公共静态void main(字符串[]args){
String[]cardsType={“俱乐部”、“黑桃”、“心脏”、“钻石”};
字符串[]cardValue={“Ace”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”、“10”、“国王”、“女王”、“杰克”};
列表卡=新的ArrayList();
对于(inti=0;iimport java.util.List;
导入java.util.ArrayList;
导入静态java.lang.System.out;
进口龙目织机;
进口龙目吸气剂;
导入java.awt.Color;
公务舱甲板{
私有静态@Getter List deck=null;
最终国际诉讼数量=4;
最终整数值_计数=13;
公共甲板(){
deck=newarraylist();
卡片=空;
int suiteindex=0,valueIndex=0;
while(suiteindeximport java.util.List;
import java.util.ArrayList;
import static java.lang.System.out;
import lombok.Setter;
import lombok.Getter;
import java.awt.Color;
public class Deck {
private static @Getter List<Card> deck = null;
final int SUIT_COUNT = 4;
final int VALUE_COUNT = 13;
public Deck() {
deck = new ArrayList<>();
Card card = null;
int suitIndex = 0, valueIndex = 0;
while (suitIndex < SUIT_COUNT) {
while (valueIndex < VALUE_COUNT) {
card = new Card(Suit.values()[suitIndex], FaceValue.values()[valueIndex]);
valueIndex++;
deck.add(card);
}
valueIndex = 0;
suitIndex++;
}
}
private enum Suit{CLUBS("Clubs", Color.BLACK), DIAMONDS("Diamonds", Color.RED),HEARTS("Hearts", Color.RED), SPADES("Spades", Color.BLACK);
private @Getter String name = null;
private @Getter Color color = null;
Suit(String name) {
this.name = name;
}
Suit(String name, Color color) {
this.name = name;
this.color = color;
}
}
private enum FaceValue{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 @Getter int cardValue = 0;
FaceValue(int value) {
this.cardValue = value;
}
}
private class Card {
private @Getter @Setter Suit suit = null;
private @Getter @Setter FaceValue faceValue = null;
Card(Suit suit, FaceValue value) {
this.suit = suit;
this.faceValue = value;
}
public String toString() {
return getSuit() + " " + getFaceValue();
}
public String properties() {
return getSuit().getName() + " " + getFaceValue().getCardValue();
}
}
public static void main(String...inputs) {
Deck deck = new Deck();
List<Card> cards = deck.getDeck();
cards.stream().filter(card -> card.getSuit().getColor() != Color.RED && card.getFaceValue().getCardValue() > 4).map(card -> card.toString() + " " + card.properties()).forEach(out::println);
}