主类:
公共类二十一点{
static Deck D;
static Hand P;
public static void main(String[] args) {
init();
}
private static void init() {
D=new Deck();
P=new Hand(D);
startGame();
}
private static void startGame() {
System.out.print("Your cards are: "+P.H.get(0)+", "+P.H.get(1));
}
}
手类:
import java.util.ArrayList;
import java.util.Random;
public class Hand {
ArrayList<String> H;
Random R;
public Hand(Deck D){
R=new Random();
H=new ArrayList<String>();
int C=R.nextInt(D.getP().length);
H.add(D.getP()[C]);
D.removeFromDeck(C);
int E=R.nextInt(D.getP().length);
H.add(D.getP()[E]);
D.removeFromDeck(E);
}
}
甲板等级
public class Deck {
String[] P;
public Deck(){
P=new String[52];
String Suit="Default";
int C=0;
for(int A=1;A<=4;A++){
switch(A){
case 1:
Suit="Hearts";
break;
case 2:
Suit="Diamonds";
break;
case 3:
Suit="Clubs";
break;
case 4:
Suit="Spades";
break;
}
for(int B=1;B<=13;B++){
if(B>10){
switch(B){
case 11: P[C]="Joker of "+Suit;
break;
case 12: P[C]="Queen of "+Suit;
break;
case 13: P[C]="King of "+Suit;
break;
}
}else{
P[C]=B+" of "+Suit;
}
}
}
}
public void setP(String[] p) {
P = p;
}
public String[] getP() {
return P;
}
public void removeFromDeck(int C){
System.arraycopy(P, C + 1, P, C,
P.length - C - 1);
}
}
当我编译并运行此代码时,它打印出我的2张卡为null,null。我查看了代码,似乎无法找到我的错误。也许你可以? TY给你任何帮助。
编辑:现在只返回黑桃,有人可以帮忙吗?
答案 0 :(得分:5)
你的循环都有错误的循环条件:
for(int A=1;A>=4;A++)
...
for(int B=1;B>=13;B++)
这些都不会执行任何迭代。他们应该是:
for(int A=1;A<=4;A++)
...
for(int B=1;B<=13;B++)
此外,您没有分配足够的尺寸:
P=new String[51];
背面有52张牌,而不是51张。
编辑:正如评论中所指出的那样,你总是得到代码为发布的黑桃,因为你选择套装的switch语句没有任何中断。我本来希望这会导致编译时间警告。你真的应该注意警告。你可以像这样添加break语句:switch(A) {
case 1:
S = "Hearts";
break;
case 2:
S = "Diamonds";
break;
case 3:
S = "Clubs";
break;
case 4:
S = "Spades";
break;
}
最后,我强烈建议您使用更有意义的变量名,最好遵循Java命名约定。 (实际上我会对您的代码进行各种其他更改,但从这些更改开始。)
答案 1 :(得分:1)
乍一看,问题出现在这里:for(int A=1;A>=4;A++){
和for(int B=1;B>=13;B++){
。这些循环永远不会执行,因为在第一次循环中,在第一次迭代时A将为1,因此小于4,这意味着它会破坏第一个循环的条件,同样适用于第二个循环。用>
替换<
应该会产生一些东西。
答案 2 :(得分:0)
我很困惑为什么你还没有封装Card
类,因为它会使卡的实例化变得更容易。此外,您可以随时将套装抽象到自己的类或枚举中。
无论如何,我可能会为你做太多的设计工作,但这里有一些东西可以帮助你入门:
public enum Suit {
Spade,
Heart,
Diamond,
Club;
public static Suit getSuit(int suit) {
switch (suit) {
case 3:
return Suit.Spade;
case 2:
return Suit.Heart;
case 1:
return Suit.Diamond;
case 0:
default:
return Suit.Club;
}
}
}
这是一个使用此套装的简单Card
类。
public class Card {
private Suit suit;
private int value;
public Card(Suit suit, int value) {
this.suit = suit;
this.value = value;
}
public Card(int suit, int value) {
this(Suit.getSuit(suit), value);
}
public int getValue() { return value; }
public Suit getSuit() { return suit; }
}
创建套牌很简单。这是一个简单的工厂,可以帮助您入门:
public class DeckFactory {
public static List<Card> BuildDeck() {
List<Card> cards = new ArrayList<Card>();
for (int value = 1; value <= 13; ++value) {
for (int suit = 0; suit < 4; ++suit) {
cards.add(new Card(value, suit));
}
}
return cards;
}
}
我将实际的实现留给Deck
或Hand
课程。在Card
类中,您可以覆盖toString()
方法以返回Card对象的更好的字符串表示形式。
// in Card.java
@override
public String toString() {
String output = "";
switch(this.value) {
1:
output += "Ace ";
break;
11:
output += "Jack ";
break;
12:
output += "Queen ";
break;
13:
output += "King ";
break;
default:
output += this.value;
break;
}
output += " of ";
output += this.suit.toString();
// returns the name of the enum
return output;
}
希望这会有所帮助。