1

我正在编写一个 Java 程序,它允许用户向机器人发送消息,告诉它在 5x5 网格上去哪里。例如,如果我发送它'FRFFLF',这意味着向前,向右跑 90 度,向前两次,向左转 90 度,然后向前。然后程序返回机器人在网格上的新位置。

我不是在寻求解决方案,只是对我的方法的一些指导。是否已经有可用于此类程序的设计模式(所以我没有重新发明轮子)或者是否可以从头开始编写?

网格的底部是(0,0,顶部是(4,4)。

我在想 Robots 位置可以定义为 Java Point 类,而网格是 2D 数组?

像下面这样的事情会是一个开始吗?

    public Point forward(Point p) {
    p.x +=1;
    return p;
}

有没有人尝试过编写这样的程序?可能吗?

编辑:我考虑过以下几点:首先我需要机器人的方向及其当前位置。从那里我将封装网格,围绕边界创建一些规则。基本上,我将更新机器人的位置,解释传递给它的命令并更新基于机器人的位置。显然,机器人只需要在网格范围内移动。

4

1 回答 1

1

首先,我会决定 x 和 y 的含义。在这种情况下,我会说当你向“东”移动时 x 会变大,而当你向“南”移动时 y 会变大。这通常是它在计算机图形中的工作方式 - 0,0 点通常位于左上角,如下所示:http: //graphics.comsci.us/notes/coord.html

所以,我要做的是有两个类,机器人和网格。

Grid 类应具有以下属性:

  • minX,它是一个 int
  • maxX,它是一个 int
  • minY,它是一个 int
  • maxY,它是一个 int

还有这些方法:

  • isValid(int x, int y)

Robot 类应具有以下属性:

  • 位置,这是一个点
  • 方向,这是一个方向
  • 网格,其中包含网格对象

它还应该有这些方法:

  • 向前()
  • 剩下()
  • 正确的()

无论您如何存储方向 - 0、1、2、3 或“北”、“东”、“南”、“西”或“上”、“右”、“下”、“左” ,甚至可能是 0、90、180、270、360(度)或弧度。重要的是您在使用方向时保持一致。

现在,在left()right()中,您可以更改机器人的方向。所以你可以做这样的事情:

public void left() {
  switch (orientation) {
    case "north": orientation = "west"; break;
    case "east": orientation = "north"; break;
    ...
  }
}

您将按顺序更改方向,并在right()函数中以相反的顺序执行它们。

内部forward()是您与grid对象交互的地方:

public void forward() {
  switch (orientation) {
    case "north":
      if (grid.isValid(position.x, position.y+1)) {
        position.y += 1;
      } else {
        System.out.println("Can't go there!");
      }
      break;
    ...
}

值得注意的是,Grid 类可以存储任何形状。只要你先检查你想去的地方是否有效,机器人并不关心网格是什么样子的。你可以把你的机器人从这个网格上拉下来,然后把它放在另一个网格上,它仍然会以同样的方式工作。

我想,下一点将是读取您发送给它的命令的东西。那时,也许您一次只读取一个字符的字符串,然后执行它指定的命令。

于 2013-08-19T09:36:44.127 回答