只是另一位新手Java编码员要求批准

时间:2011-02-19 15:56:59

标签: java

所以...我最近正在学习一些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();
}

4 个答案:

答案 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;
  }
}

这将是纸牌游戏的一个起点。

干杯, 斯文