1

私は、ユーザーがロボットにメッセージを送信して、5x5グリッドのどこに行くかを伝えることができるJavaプログラムを書いています。たとえば、「FRFFLF」を送信すると、これは、前進し、右に90度走り、2回前進し、左に90度回転してから前進することを意味します。次に、プログラムはグリッド上のロボットの新しい位置を返します。

私は解決策を求めているのではなく、私のアプローチに関するいくつかのガイドラインを求めています。そのようなプログラムで利用できるデザインパターンはすでにありますか(したがって、私は車輪の再発明をしていません)、または最初から書くことは可能ですか?

グリッドの下部は(0,0)で、上部は(4,4)になります。

Robotsの位置はJavaPointクラスとして定義でき、グリッドは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

だから、私がすることは、ロボットとグリッドの2つのクラスを持つことです。

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クラスが任意の形状を格納できることです。行きたい場所が最初に有効であることを確認する限り、ロボットはグリッドがどのように見えるかを気にしません。このグリッドからロボットを引き抜いて別のグリッドに配置しても、同じように機能します。

次のビットは、送信したコマンドを読み取るものになると思います。その時点で、文字列を一度に1文字ずつ読み取り、指定されたコマンドを実行するだけかもしれません。

于 2013-08-19T09:36:44.127 に答える