【问题标题】:java letter game [homework assignment]java字母游戏【家庭作业】
【发布时间】:2012-03-22 09:34:27
【问题描述】:

我的家庭作业有问题。我不要求任何代码。我所要求的只是一些关于如何实施任务的某些部分的建议。

分配如下:N 名玩家(n 由用户指定)和一个带有字母的“盒子”(A-Z,未指定的字母数量或问题中所述:无限制)。每个字母都有一个索引。 A=0,B=1,..,Z=25。 每个玩家都会收到一封随机的信件。第一个形成大小为 p >= 3(p 由用户给出)的单词的玩家具有以下属性:字母的索引应该是等差数列。例如,如果 p=3,则 ABC 或 ZXV 是获胜组合。

程序应该在每次迭代中显示每个玩家的字母。当一名玩家获胜时,程序应显示获胜的玩家和获胜的单词。

建议是:使用 Math.random() 和 StringBuilder 处理字符串。

我认为该程序的入口点的方式是要求用户提供玩家数量。之后我应该生成 N 个对象(给定一个 Player 类)。第一个愚蠢的问题:我如何生成 N 个对象。类似的东西:

for (int i = 0 ; i < n ; i++) {
    Player player1 = new Player();
    //how do I allocate the other objects?
}

有没有办法为字母分配索引?我能想到的只是生成随机字母,例如:

    Random r = new Random();
    box = new char[9999];
    for (int i = 0; i < 9999; i++){
        box[i]= (char)(r.nextInt(25)+65); //there are 26 letters and A starts on position 65
    }

还有其他想法吗?非常感谢有关如何思考解决此问题的任何建议。

【问题讨论】:

  • "和一个带有字母的“盒子”(A-Z,未指定的字母数量或问题中所述:无限制)" ... wha?
  • 我假设一个包含随机字母的数组,但大小相当大。
  • 您可能不需要一个数组来实际保存所有这些随机字母。只需在需要时生成一个新的。
  • @Greg Hegwill,意思是我在每次迭代中为每个玩家分配一个随机字母并将其存储在他们的数组中还是什么?
  • 没错。因为问题说您从中绘制的框是“无限”大小的,所以绘制下一个字母的概率总是与随机选择一个字母相同。如果盒子的大小是有限的,这不会为真,因为你选择了一个字母,例如Q,下次会少一个Q(因此概率会改变)。

标签: java letter


【解决方案1】:

如何生成 N 个对象

使用列表或数组。大多数惯用的 Java 代码在数组上使用列表

List<Player> players = new ArrayList<Player>();
for (int i = 0; i < n; i++) {
    players.add(new Player());
}

现在players 包含所有n 玩家,要引用特定玩家k(从0 到n - 1),您可以使用players.get(k),例如

players.get(k).takeTurn();

会在第 k 个玩家上调用 takeTurn

有没有办法给字母分配索引?

我不太清楚你的意思是什么,或者你为什么要生成 9999 个字符,但是你生成 9999 个随机字符的方式现在不起作用,因为它会排除“Z”。每当您调用r.nextInt 时,您实际上指定的1 超出了您想要的上限。因此,要生成从 'A' 到 'Z' 的 9999 个随机字符,您需要

Random r = new Random();
box = new char[9999];
for (int i = 0; i < 9999; i++){
    box[i] = (char)(r.nextInt((int)'Z' - (int)'A' + 1) + 'A');
}

它利用了 char 与 Java 中的整数类型共享许多特征这一事实。

【讨论】:

  • 我不太确定老师到底想从我这里得到什么。问题指出:“一个带有英文字母(A-Z,无限制)的盒子,每个字母都分配了索引(即 A=0; B=1; ..; Z=25)。
  • 当使用 List 玩家 = new ArrayList(); for (int i = 0; i
  • 据我了解,AbstractList 有一个包含 48 个默认对象的列表。所以我在使用另一个循环时找到了一个解决方案,我将循环运行到 player.size()-48 。如果有的话,想要一个更优雅的解决方案。谢谢
  • @Constantin 不,对于 n = 3 有 51 个对象根本没有意义。 AbstractList 没有包含 48 个默认对象的列表(尽管它会在您构建新列表时预先分配一些空间,这对于使用 ArrayList 的代码不可见)。如果我创建一个程序,其 main() 方法只是创建一个新的 ArrayList 并添加三个元素,则列表的大小为 3 而 not 51.
【解决方案2】:

关于问题1:你可以声明一个Player对象的数组:

Player[] players;

那么一旦你知道了玩家的数量,你就可以给它分配一个合适大小的数组:

players = new Player[n];

这个数组仍然是null,所以你可以用你的循环使用下标来初始化它:

for (int i = 0; i < n; ++i) {
    players[i] = new Player();
}

(您也可以为此使用ArrayList,但这样做没有任何好处(除了了解收集框架),因为您确切知道需要多少Player 对象。)

关于您的第二个问题,有多种技术。你可以定义一个char数组:

char[] chars = { 'A', 'B', /* etc */, 'Z' };

然后您可以通过下标访问每个字符。或者你可以定义一个字符串:

String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

然后,您可以使用chars.charAt(i) 将单个字符提取为char,或者使用chars.substring(i, i + 1) 将其提取为一个字符的字符串。

【讨论】:

    【解决方案3】:

    您可以将“播放器”的实例放入一个数组(动态大小的数组列表)。 刚刚看到有人发布了数组列表的代码。看看吧!

    【讨论】:

      【解决方案4】:

      要创建多个播放器,需要使用容器:

      Vector<Player> players = new Vector<Player>();
      for ( int i = 0 ; i < n ; i++ )
          players.add(new Player());
      

      Vector 只是一个例子,你可以从中选择很多。

      对于将数字与字母相关联,我也会使用Vector。或者可能是从intcharHashMap。但由于整数是连续的,Vector 也可以。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-20
        • 2019-04-22
        • 2019-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多