所以...我最近正在学习一些Java,如果你愿意的话,我希望你帮助我完成我的第一个程序。这是我的程序代码,它显示了套牌中的随机卡。
我的问题如下:有没有更聪明的方法让这个程序有效?
/*
* File: RandomCard.java
* ----------------
* This program display random card from the deck with it's own rank
* (Ace, 2, 3, 4, 5, 6, 7, 8, 9, 10, Jack, Quenn, King) and suit (Clubs,
* Diamonds, Hearts, Spades).
*/
import acm.program.*;
import acm.util.*;
public class RandomCard extends ConsoleProgram {
/* Run the program */
public void run() {
println("This program displays a random card from the deck.");
println("You random card is " + getRandomRank() + " "
+ getRandomSuit() + ".");
}
/* Get random rank for the card. */
private String getRandomRank() {
int rank = rgen.nextInt(1, 13);
switch (rank) {
case 1: return "Ace";
case 2: return "2";
case 3: return "3";
case 4: return "4";
case 5: return "5";
case 6: return "6";
case 7: return "7";
case 8: return "8";
case 9: return "9";
case 10: return "10";
case 11: return "Jack";
case 12: return "Queen";
case 13: return "King";
default: return null;
}
}
/* Create random suit from within Clubs, Diamonds, Hearts and Spades. */
private String getRandomSuit() {
int suit = rgen.nextInt(0, 3);
switch (suit) {
case 0: return "Clubs";
case 1: return "Diamonds";
case 2: return "Hearts";
case 3: return "Spades";
default: return null;
}
}
/* Create an instance variable for the random number generator */
private RandomGenerator rgen = new RandomGenerator();
}
答案 0 :(得分:4)
一个小改进:任何时候你都有这样的switch语句:
switch (rank) {
case 1: return "Ace";
case 2: return "2";
case 3: return "3";
case 4: return "4";
case 5: return "5";
case 6: return "6";
case 7: return "7";
case 8: return "8";
case 9: return "9";
case 10: return "10";
case 11: return "Jack";
case 12: return "Queen";
case 13: return "King";
default: return null;
}
您可以改为声明一个数组:
String[] ranks = { "Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10",
"Jack", "Queen", "King" };
然后:
if (rank < 1 || rank > 13) return null;
return ranks[rank - 1]; // arrays are zero-based
答案 1 :(得分:4)
建议,而不是为Rank和Suite返回String
,我会改为使用enum
,这样他们就是类型安全的。
public enum Rank { DEUCE, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE }
public enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES }
请在此处查看完成方式:{{3}}
答案 2 :(得分:3)
你可以对这个小程序做很多不同的事情。
然而,在这种情况下首先要问自己的是:你想要学习关于下一步的内容是什么?毕竟,练习的目的是成长为程序员。
我追求的一些例子:
数组处理:@JUST MY正确的OPINION和@Daniel都提供了一种摆脱switch语句并将其作为数组处理的方法。
另一个可能是通过创建一个Card类并使用一个集合来存储各种卡以及检索它们来了解类和集合。
你甚至可以扩展程序来玩像二十一点这样的简单游戏。关于在集合(玩家手,牌组,经销商手)之间移动物体(牌),有许多事情需要学习。也许你可以通过重新组织有序列表来模拟洗牌。
您可以通过将当前“游戏”保存到xml或json文件来添加持久性。
上述想法具有现实世界的含义,不需要任何“图形”或在线界面。
您目前拥有的是非常优质的代码,所以值得称赞。只需选择一个新概念并将其应用于更好的自己。
答案 3 :(得分:0)
将此方法与独立的枚举列表一起使用效果不佳。对于你创建的应用程序来说可能已经足够了,但是如果你创建某种纸牌游戏,你最终会得到像两张心脏一样的双卡。我建议你创建一个类卡,其中包含排名和套件作为枚举。创建一个类Deck,它通过创建卡片的所有卡片进行初始化。然后你可能有一个方法Card drawNextRandom(),它从牌组中返回下一张随机牌并将其从牌组中移除。
public class Card{
public enum Rank { DEUCE, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE };
public enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES };
private Rank rank;
private Suite suite;
public Card(Rank rank, Suite suite){
this.rank = rank;
this.suite = suite;
}
// don't forget getters, equals and hashcode
}
public class Deck{
private RandomGenerator rgen = new RandomGenerator();
private List<Card> cards = new ArrayList<Card>();
public Deck(){
for(Rank rank : Rank.values()){
for(Suite suite : Suite.values()){
cards.add(new Card(rank, suite));
}
}
}
public Card nextRandomCard(){
int nextCard = rgen.nextInt(0, cards.size());
Card card = cards.remove(nextCard);
return card;
}
}
这将是纸牌游戏的一个起点。
干杯, 斯文