C ++ if / else网格系统

时间:2016-01-31 20:23:50

标签: c++ function loops if-statement

我正在尝试创建一个C ++程序,它将在4x4网格上移动X并显示每个移动。我们不允许使用数组,因为我们还没有学到如何。我知道我应该使用16个if / else语句,但我不知道该怎么做。我知道有一种比绘制每个可能的选项更简单的方法,因为这将需要永远!我该怎么办???

编辑:只允许向上/向下/向左/向右移动。我的意思是显示每一个动作它首先应该显示用户的起点(我已经设置)然后它应该打印网格连续移动它们包括所有先前的移动,直到它到达终点。

2 个答案:

答案 0 :(得分:2)

注意:我最初根据对结果错误的任务的假设写了这个答案。但是,我会留下答案,因为我认为它可能仍然包含OP的有用信息。

当您有 x 不同的可能情况时,您并不总是需要if / else x 分支。诀窍是找到一种方法来使用相同的计算(通常是一个或多个数学表达式,可能还有循环)来处理所有或大多数情况。

在这种情况下,4x4网格上确实存在16个不同的位置,并且表示位置的一种方式是存储其行和列编号(每个都是0到3之间的值)。通过使用两个循环,一个在另一个循环中(嵌套循环),您可以生成行和列位置的所有16个组合。我现在假设您应该打印,例如.在网格的空单元格上。在内循环内部,您需要确定是否应该打印.X。为了弄清楚这一点,你应该问什么问题?简单"是嵌套循环当前与X的位置在同一行和列号的行号和列号?"

看到更新后进行编辑:即使使用网格,只有在必须存储有关每个单元格的信息时才需要数组,因此如果可以生成,有时可以在没有数组的情况下离开来自较少信息的网格信息(例如X的位置)。但是,如果您需要跟踪以前的位置,则需要一个数组(一维或二维)才能优雅地完成。我会说"没有阵列"限制这项任务不具有教育意义,因为它迫使一种不自然且非常麻烦的方式来解决这一任务。 :-((但是,如果您的教师随后给出相同的任务并允许您使用循环,那么将很好地证明循环有用的原因。)

您可以做的是使用boolfalsegrid00之类的16个grid01变量(最初设置为grid02), grid03grid10,...,grid33。然后制作两个使用16向bool isOccupied(int row, int column) / void occupy(int row, int column)语句的方法ifelse,以便您轻松读取和更改与给定位置对应的变量。

答案 1 :(得分:0)

  

我知道我应该使用16个if / else语句,但我不是   确定从那里做什么。

如果这是您的教师给您的解决方案的约束,则意味着您需要在单独的{}块中处理16个可能的网格位置中的每一个。你必须有一个代表每对的枚举。喜欢:

e_1_1,e_1_2,e_1_3,e_1_4,

e_2_1,e_2_2,e_2_3,e_2_4,

e_3_1,e_3_2,e_3_3,e_3_4,

e_4_1,e_4_2,e_4_3,e_4_4,

并且您必须在switch语句中手动将当前位置更新为新位置。在一个名为' position'。

之类的变量中跟踪您当前的位置
  

我知道有一种比绘制每个可能选项更简单的方法   因为那需要永远!

欢迎编程。 ; - )

复制和粘贴是你的朋友,这个必须编写许多类似但略有不同的代码的问题对于许多编程任务来说是相当普遍的。成为一名优秀的程序员意味着学习如何尽可能避免重复代码。你还没有,或者你不会问。所以这第一步对您来说将是一个重要的教训。一点点痛苦将帮助您了解下次将使用的方法会有多好。

但这不是那么多工作。一位经验丰富的C ++程序员可以在不到5到10分钟内完成这项工作。经验丰富,可能是20到30岁。学习程序员可能需要几个小时或更长时间。

有更简洁的方法来处理这个问题而不需要16个单独的块,但是,它们都不容易理解。如果这是一个类学习项目的要求,那么你会发现以这种方式做到这一点是有益的,然后作为下一步,尝试用更复杂的逻辑来做。

<强>建议

有经验的程序员会将移动可能性定义为枚举。然后使用switch语句在if语句的{}块内处理移动,该语句处理与四个移动相对应的四个枚举中的每一个。如果您还不知道switch语句,那么您可以使用if ... else if ... else if ...检查四个移动中的每一个。

首先处理第一个左上角位置,然后移动一个较小的2 x 2网格。然后为2 x 2网格添加其他三个位置。一旦你完成了这项工作,你应该能够很容易地理解如何将解决方案扩展到4 x 4和任意大的网格。

您希望拥有一个打印每次移动后调用的位置数组的函数。目前,您必须检查枚举的值并手动打印。类似的东西:

  1. 位置== e_1_1?打印&#39; *其他打印&#39; _&#39;
  2. 位置== e_1_2?打印&#39; *其他打印&#39; _&#39;
  3. 位置== e_1_3?打印&#39; *其他打印&#39; _&#39;
  4. 位置== e_1_4?打印&#39; *其他打印&#39; _&#39;
  5. 打印换行符
  6. 位置== e_2_1?打印&#39; *其他打印&#39; _&#39;
  7. 位置== e_2_2?打印&#39; *其他打印&#39; _&#39;
  8. 位置== e_2_3?打印&#39; *其他打印&#39; _&#39;
  9. 位置== e_2_4?打印&#39; *其他打印&#39; _&#39;
  10. 一些易于调试的指针:

    将上,下,左,右的枚举值设置为可以打印出来并轻松跟随的内容,即e_up =&#39; u&#39;和e_down =&#39; d&#39;。如果您没有可以轻松查看枚举值的IDE,那么这将使调试变得更容易,并且您可以直接在开头打印出移动。

    以较小的增量对代码进行更改。运行代码,一旦您知道您添加的部分有效,请继续。如果你一次添加太多,就很难弄清楚事情在哪里被破坏,特别是当你是新手时。

    使用数组的未来解决方案

    一些提示:您将要使用二维数组。

    首先在2 x 2阵列上试一试,让您的生活更轻松。然后,当逻辑工作时,更改数组大小。要使此过程更容易,请使用const整数来定义用于定义数组的值以及使用for循环进行打印,以便在从以下位置更改常量时:

    const int array_size = 2

    const int array_size = 4

    其余代码将正常工作。为了额外的功劳,通过为array_height和array_width使用单独的常量来支持不同高度和宽度的数组。学会做得好,以及专业人士的方式,你就可以更快地养成职业习惯并获得专业工资。

    请记住使用for循环打印使用您定义的常量的行和列。

    您希望代码运行循环查找输入,然后处理移动,然后打印出新网格。