【问题标题】:How to create an overarching if statement? As in, "if this happens at any point in the program..."如何创建一个总体 if 语句?如,“如果这发生在程序中的任何一点......”
【发布时间】:2013-07-29 14:31:01
【问题描述】:

我的任务是为 karel 机器人创建一个算法,用于退出迷宫并在到达蜂鸣器时停止。我已经成功地创建了这个算法,除了让 karel 在它到达蜂鸣器时停止。这只是我的代码的一部分,但你会看到我基本上在每一步都插入了一个蜂鸣器检查点。我不禁觉得有一种更简单的方法,另外,当我尝试使用新插入的蜂鸣器检查执行时,它给了我这个错误:线程“main”中的异常 java.lang.StackOverflowError

    while(!arg.rightIsClear() && arg.frontIsClear() && !arg.nextToABeeper())
    {
        arg.move();
    }
    if(arg.rightIsClear() && !arg.nextToABeeper())
    {
        arg.turnRight();
        arg.move();

所以,如果可能的话,我只想在整个程序的每个时间间隔检查一个 if 语句。谢谢。

【问题讨论】:

    标签: java karel


    【解决方案1】:

    我认为:Create a custom event in Java 是您正在寻找的内容。

    当您不小心在循环中调用了相同的方法时,通常会发生堆栈溢出。这段代码是否位于turnRight()move() 方法中?

    【讨论】:

    • 感谢您的回复。那个自定义事件链接确实是我想要的,但它的实现比我想象的要长一些。我以为你可以有一个 1 行长的语句来解决我的问题。我正在做的实际上更快!无论如何,为了尝试修复 stackoverflow 错误,我从 while/if 括号内切换了蜂鸣器检查,并将其移动到 move() 方法之前,它成功了。谢谢你的帮助。
    • 创建事件是正确的方法。一旦您熟悉了它们,它们就更易于使用和维护。
    • 我明白了。好吧,我想我会检查出来的。
    【解决方案2】:

    想象一下,在 Karel 编程语言中有“总体 if 语句”之类的东西。为了争论,我们称它为“何时”。现在假设您编写了以下代码:

    when (facingEast())
    {
        turnLeft();
    }
    
    when (facingEast())
    {
        turnRight();
    }
    

    如果卡雷尔面向东方会发生什么?应该左转吗?他应该右转吗?是不是应该只做其中一件,因为转身后就不再面向东方了?或者他应该两者都做?如果是这样,按什么顺序?请注意,这会使他再次面向东方,并且他会陷入无限循环。

    如上例所示,这样的“总体 if 语句”会很快导致歧义和矛盾。把它放在编程语言中没有多大意义。

    我的任务是为 karel 机器人创建一个算法,用于退出迷宫并在到达蜂鸣器时停止。

    那么我会提出以下基本算法布局:

    while (noBeepersPresent())
    {
        turnInTheDesiredDirection();   // you have to write this method
        move();
    }
    

    这样,Karel 将在每次移动后检查蜂鸣器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多