我的另一个问题被标记为重复,我没有解释得太好,所以我再试一次。
所以我正在制作这个java
黑杰克控制台游戏,并在这里偶然发现了一堵小墙。我已经准备好了一个名为Card
的课程。现在我有点磕磕绊绊地创建了所有52张牌到一系列牌。好吧,我制作了有效的代码,但对于我来说,有三个嵌套for循环似乎很难看。有没有真正的方式"做我在这做的事。
所以这里将是班级Card
int value;
String suit;
String name;
public void Card(int value, int suitNumber)
this.value=value;
switch(suitNumber){
case 1 : this.suit = "Heart";
break;
.......
}
switch(value){
case 1 : this.name="Ace";
......
}
Pack
类的一部分有一个嵌套的for循环:
Card[] packOfCards = new Card[51];
for(int k=0; k<52; ){
for(int i=1; i<5; i++){
for(int j=1; j<14; j++){
packOfCards[k] = Card(j, i);
k++;
// it seems stupid for me to have 3 nested
//loops like that
}
}
}
答案 0 :(得分:1)
你需要循环:
目前,您似乎正在对两者进行循环。
以下代码使用第一种方法:
for(int i = 0; i < 52; i++) {
int suit = (i % 13) + 1;
int value = (i / 13) + 1;
packOfCards[i] = new Card(value, suit);
}
此代码使用第二种(双循环)方法:
for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 13; j++) {
int cardIndex = (13 * (i-1)) + j;
packOfCards[cardIndex] = new Card(j, i);
}
}
另请注意,您的Card
课程看错了。当我认为你想要一个构造函数时,你已经声明了void
方法,然后在创建 new 卡时错过了new
关键字(提示:编译器会提醒你很多这些错误)。
正如其他人所建议的那样,使用enums
作为卡片值和套装的类型可能更有意义,而不是在int
和String
之间进行操作。
import java.util.ArrayList;
import java.util.List;
public class Card {
private final CardValue value;
private final Suit suit;
public Card(CardValue value, Suit suit) {
this.value = value;
this.suit = suit;
}
@Override
public String toString() {
return value + " of " + suit;
}
public static void main(String[] args) {
List<Card> deck = new ArrayList<Card>();
for (Suit s : Suit.values()) {
for (CardValue v : CardValue.values()) {
deck.add(new Card(v, s));
}
}
for (Card c : deck) {
System.out.println(c);
}
Card aceOfSpades = new Card(CardValue.withValue(1), Suit.SPADES);
System.out.println(aceOfSpades);
}
public enum Suit {
HEARTS ("Hearts"),
CLUBS ("Clubs"),
DIAMONDS ("Diamonds"),
SPADES ("Spades");
private final String name;
Suit(String name) {
this.name = name;
}
@Override
public String toString() {
return this.name;
}
}
public enum CardValue {
TWO(2, "Two"),
THREE(3, "Three"),
FOUR(4, "Four"),
FIVE(5, "Five"),
SIX(6, "Six"),
SEVEN(7, "Seven"),
EIGHT(8, "Eight"),
NINE(9, "Nine"),
TEN(10, "Ten"),
JACK(11, "Jack"),
QUEEN(12, "Queen"),
KING(13, "King"),
ACE(1, "Ace");
private final int value;
private final String name;
CardValue(int value, String name) {
this.value = value;
this.name = name;
}
public int getValue() {
return value;
}
public static CardValue withValue(int value) {
for (CardValue v : CardValue.values()) {
if (value == v.value) {
return v;
}
}
return null;
}
@Override
public String toString() {
return this.name;
}
}
}
你可能想把enum
拉成单独的文件,但为了产生一个相对简洁的工作例子,我将它们放在主类中。
答案 1 :(得分:1)
通过一个for
循环可以获得相同的结果,通过节省更多时间复杂度而不是三个循环和重复。尝试,
for (int k = 1; k <= 52; k++) {
int i = k % 5;
int j = k % 14;
packOfCards[k-1] = new Card(j, i);
}