我正在尝试在android sdk中重新创建推拉式纸牌游戏。对于那些不熟悉的人来说,推高游戏是你从一副普通扑克牌中抽出一张牌,根据套装和等级,你必须进行一定程度的推升。例如,绘制5颗钻石需要你完成5个钻石样式(双手合拢)俯卧撑。套装和相应的上推式列出如下: 心 - 常规 钻石 - 钻石 俱乐部 - 交错 锹 - 宽臂 (你可以在这里阅读有关游戏的更多信息:http://www.nexercise.com/2012/12/fitness-game-the-push-up-game/)
我还没有实现扑克牌的图像所以,现在,我只是想让文字正确显示。基本上,一旦应用程序启动,我希望用户能够按下按钮以生成新卡,然后在屏幕上打印消息,说明用户要完成的俯卧撑的数量和类型。
无论如何,这是我迄今为止所使用的代码:
public class Card {
public enum Suit {
HEARTS, DIAMONDS, CLUBS, SPADES
}
public enum Rank {
ACE, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, JACK, QUEEN, KING
}
public enum PushUp {
REGULAR, DIAMOND, STAGGERED, WIDEARMED
}
private Suit mSuit;
private Rank mRank;
private PushUp mPushUp;
public Card(Suit mSuit, Rank mRank, PushUp mPushUp) {
this.mSuit = mSuit;
this.mRank = mRank;
this.mPushUp = mPushUp;
}
public Suit getSuit() {
return mSuit;
}
public void setSuit(Suit suit) {
mSuit = suit;
}
public void setRank(Rank rank) {
mRank = rank;
}
public void setPushUp(PushUp pushUp) {
mPushUp = pushUp;
}
public Rank getRank() {
return mRank;
}
public PushUp getPushUpType() {
return mPushUp;
}
@Override
public String toString() {
return "Card:" + mRank.name() + "of" + mSuit.name() + "/n" +
"Complete:" + mRank.name() + "of" + mPushUp.name() + "push ups.";
}
卡片类使用3种不同的枚举(套装,等级,俯卧撑类型)来创建卡片对象。该类有一个toString方法将卡信息转换为字符串。
public class Deck {
private Card[] deck;
public Deck() {
this.deck = new Card[52];
for (int i = 0; i < deck.length; i++)
for (Card.Suit s : Card.Suit.values())
for (Card.PushUp p : Card.PushUp.values())
for (Card.Rank r : Card.Rank.values()) {
Card c = new Card(s, r, p);
this.deck[i] = c;
}
}
public Card pickACard() {
Random randomGenerator = new Random();
int randomNumber = randomGenerator.nextInt(this.deck.length);
Card card = this.deck[randomNumber];
return card;
}
public String setText() {
String text = pickACard().toString();
return text;
}
}
甲板类创建一个充满所有不同卡片的阵列。甲板类有一种绘制随机卡的方法和从该随机卡中提取文本的方法。
public class MainActivity extends AppCompatActivity {
private Button mButton;
private TextView mTextView;
private Deck mNewDeck;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.textView);
mButton = (Button) findViewById(R.id.button);
View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
String text = "";
text = mNewDeck.setText();
mTextView.setText(text);
}
};
mButton.setOnClickListener(listener);
}
}
主要活动类是应用程序启动时弹出的主屏幕。它有一个按钮和一个文本视图。按钮应该在每次按下时生成一张新卡和一个新字符串。
当我尝试在模拟器中运行应用程序时,出现以下错误:
块引用
致命的例外:主要 处理:com.example.aman.pushupgame,PID:3325 java.lang.NullPointerException:尝试调用虚拟&gt;方法&#39; java.lang.String com.example.aman.pushupgame.Deck.setText()&#39;在null&gt;对象引用上 在com.example.aman.pushupgame.MainActivity $ 1.onClick(MainActivity.java:29)
我目前最关心的是让代码运行,因为我不知道如何修复此错误。我对java和android都很新,我正在做这个项目作为学习经验,以加强我迄今为止学到的概念。任何帮助深表感谢。
答案 0 :(得分:3)
您的代码第29行引发NullPointerException
。它在我看来你的线(没有行号)
text = mNewDeck.setText();
是问题所在。你永远不会实例化它,因此它是null并抛出这个错误。
在使用Deck类中的setText()方法之前,需要在某处调用mNewDeck = new Deck()
(如onCreate()方法)。