【问题标题】:Creating a Dungeons and Dragons dice roller创建龙与地下城骰子滚轮
【发布时间】:2015-12-16 06:30:42
【问题描述】:

我的任务是创建一个龙与地下城的掷骰子程序,其中掷四个骰子,记录最高的三个数字,并将最小的数字放在一边。

程序需要使用面向对象编程,这就是我遇到的问题。

此外,不能使用嵌套的 If 语句或循环。

我正在尝试弄清楚如何分别对每个类进行编码。

我需要一个运行程序本身的类,一个询问使用程序的人他们想掷多少组骰子的类,一个实际代表一组骰子掷骰的类,一个代表掷骰子系列(显示骰子 1 掷出的骰子、骰子 2 掷出的骰子等),最后是一个处理单个骰子掷骰的类。

我知道输出需要显示每组掷出的骰子。

输出需要如下所示:

Set 1: 11, 12, 3, 1
Set 2: 12, 3, 1, 4

等等。

此外,在尝试创建这个程序时让我失望的主要原因是我需要在没有嵌套 if 语句或循环的情况下创建它。

【问题讨论】:

  • 是否需要为每个操作使用单独的类?你可能只用两个类来完成这个任务,你的主要任务是你的 main() ——它可以处理用户提示、处理用户输入、记录骰子掷骰以及显示它们——和一个骰子类掷骰子的方法。
  • 如果我能把它浓缩成两个类,那就太好了。更少的工作和更少的跟踪。我也忘了提到我不能使用嵌套的 if 语句或循环。这就是让我失望的部分,这就是为什么我不知道如何设置它。
  • 用户可以掷的骰子数量是否有限?意思是,用户只能掷 1、2、3 或 4 组骰子,还是可以选择掷任意数量的骰子?
  • 用户可以掷出尽可能多的骰子。我正在考虑使用扫描仪询问用户他们想要掷多少个骰子,然后在 for 循环中使用它来循环用户说的多次掷骰子。
  • 好吧,当你说你不能使用循环时我误解了。我以为你是说你不能使用任何循环。你的意思是你不能正确使用嵌套循环?如果是这样,我同意,使用扫描仪询问用户他们想掷多少组骰子。然后,根据要滚动的集合数,将其用作循环条件(例如 i

标签: java dice


【解决方案1】:

这个问题的解决方案应该可以使用两个类来完成:你的主类和一个 Dice 类。

你的主类应该有你的main(){},其中包含提示用户输入和打印骰子的代码。

您的Dice 类中可能只需要两个方法,它们将是一个构造函数和一个获取骰子值的方法。

创建骰子时,您的骰子构造函数可以将骰子对象的掷骰值设置为从 1 到 6 的随机数(假设您使用 D6 进行 DnD 掷骰)。这将使您无需调用另一个方法来实际“滚动”骰子。

然后,您可以使用来自main() 的滚动值的 getter 来获取滚动值。这个getter只需要返回roll的值。

您的 Dice 类需要一个成员变量,该变量可以保存为新骰子生成的随机值——我建议您使用 int,因为您只需要整数。

在您的main(){} 中,您可以使用扫描仪来获取用户的输入,以了解他们想要掷多少骰子。根据他们的输入,您可以使用 for 循环,根据用户的输入检查条件。 (例如for(int i = 0 ; i <userInput ; i ++))。该循环将为用户想要滚动的每组骰子迭代一次。

在这个循环中,您可以在循环的每次迭代中创建四个Dice 对象。这将有效地给你四个“掷骰子”,因为每个骰子都用一个随机数实例化。

假设您为将在“骰子”类中保存骰子值的成员变量命名为 roll,您可以通过像这样的点符号访问骰子的值 dice1.roll() 这也可以在您的输出中使用,而不是而不是需要将返回的值分配给另一个变量。

最后,要检查哪个卷最低,您可以使用一系列 if - else 语句来检查哪个卷最低。我建议使用如下条件

if(dice1.roll() < dice2.roll() && dice1.roll() < dice3.roll() && dice1.roll() < dice3.roll()){ //print your dice rolls. If the condition is true, we know that dice1 had the //lowest roll }

然后您可以使用 else 检查 dice2 是否最低,另一个 else if 检查 dice3 和另一个检查 dice4。

在 sudo 代码中,您的主类可能看起来像这样

\\main

\\declare a scanner
\\declare int for user input

\\output: How many dice would you like to roll
\\input user input var is assigned the value of user input


\\for loop checking if i < userInput
   \\Create new dice object dice1
   \\Create new dice object dice2
   \\Create new dice object dice3
   \\Create new dice object dice4

   \\check if dice1 is lowest
       \\print out die rolls, totals, and lowest roll
   \\else if check dice2 is lowest
       \\print out die rolls, totals, and lowest roll
   \\else if check dice3 is lowest
       \\print out die rolls, totals, and lowest roll
   \\else if check dice4 is lowest
       \\print out die rolls, totals, and lowest roll

\\end for loop this loop will iterate how ever many times the user input
    \\each loop will create 4 dice objects with random D6 values
    \\essentially give you 4 "rolls" for each iteration of the loop

这个主类没有嵌套循环或 if 语句。

你的 Dice 类可能看起来像这样

\\ Dice

\\declare a private int named something like roll to hold the random value

\\constructor
    \\assign roll a random int value between 1 and 6


\\getter
    \\return the random value

这应该足以让您入门。

作为额外的奖励,如果您想让程序“运行”并要求用户提供另一组骰子并再次滚动它们 - 一遍又一遍,直到您关闭程序 - 您可以将main() 的主体,在提示用户输入之前开始,带有一个始终为 true 的 while 循环。这会创建一个无限循环(和嵌套循环,因此它不适用于您的解决方案)。但是,此循环将允许您的程序“运行”,直到您终止它正在运行的控制台。同样,如果您想将其用于您自己的用途,它不会满足您的特定问题的要求,如果您包括while(true){} 循环。

希望对大家有帮助

Mkreegs

【讨论】:

  • 非常感谢!这正是我一直在寻找的。但是 Else If 算作嵌套 if 语句吗?除此之外,这回答了我的大部分问题。我会开始做这件事,如果我需要更多帮助,我会回来。
  • 不,一个 else if 没有嵌套。只有在它之前的条件为假时才会执行 else if。如果它们是嵌套的,则先前的条件必须为真。 else if 类似于 else 语句,只是您正在检查另一个条件,而不是仅仅说“如果那不是真的,请执行此操作”。在英语中,if/else if 可能听起来像这样:“如果你是兔子,跳。否则,如果你是小猫,喵。否则,如果是狗,汪。”嵌套的 if 看起来像:“如果你是兔子,如果你是小猫,如果你是狗……”这有意义吗?
  • 我的最后一个问题。感觉这适用于龙与地下城,典型的规则是掷 4 个 6 面骰子并丢下最低的骰子。在这种情况下,增加了重新滚动最低点的规则。我的意思是,如果用户掷出 5、4、3 和 2,则 2 将作为最低掷出,而 5、4 和 3 将加在一起形成 12。我能做什么?强制用户重新滚动他们的最低滚动(在本例中为 3)?我所说的武力,是指武力。我不希望用户可以选择跳过这个(我不希望任何人作弊)。
  • 在适当的 if 块中创建另一个骰子对象,并使用该新骰子对象的掷骰值作为重新掷骰。同样,我只是使用新对象,因为它们每次都返回一个随机值。您可以在 Dice 类中创建一个方法来重新掷骰子。但是,您仍然会生成一个新的随机数,这正是您每次创建新骰子对象时所做的。
  • 但是请记住,如果用户一次要掷 10000000000 组骰子,这种解决方案可能不是最好的。通过一遍又一遍地创建和销毁 4 或 5 个骰子,Java 将更频繁地进行垃圾收集。但是,我仍然觉得这是解决您的问题的最简单和最短的解决方案。
【解决方案2】:

如果您绝对需要使用您描述的四个类,这里​​有一个解决方案:

注意:避免循环的两种方法是:a) 将代码键入 n 次(如果常量迭代很少),b) 改用递归方法。

主要:

  • 询问用户套数
  • 使用递归方法重复 printSet() n 次

SetCreator:

  • 实例化 SeriesRoller
  • 排序 int[],并按照您的描述格式化
  • getSet() 返回字符串

SeriesRoller:

  • 实例化 DieRoller
  • 使用递归方法滚动骰子数次
  • getSeries() 返回 int[]

压模机:

  • 实例化一个随机数
  • getRoll() 返回从 1 到 6 的数字

【讨论】:

    猜你喜欢
    • 2021-12-25
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2017-07-24
    • 2016-08-10
    • 2018-09-24
    • 1970-01-01
    • 2021-01-16
    相关资源
    最近更新 更多