2

L_Gameでプロジェクトを作成していますが、コードが次の move メソッドに固執しています。

public void move(int row, int col) {
        char [][] temp= new char [cells.length][]; 
        for (int i= 0; i< cells.length; i++) {
            int destRow = (i+row)%cells.length;
            temp[destRow] = new char [cells[i].length];
            for (int j= 0; j < cells[i].length; j++)
                temp[destRow][(j+col)%cells[i].length] = cells[i][j];
            }
              cells= temp;
        }

私の移動メソッドは、オブジェクトを正しく移動していないようです..

したがって、出力は左側のようになると思われ、右側は私のコードからの出力です。明らかに正しく動かしていないことはわかっていますが、何が間違っているのかわかりません...

    $ slide.move(0,2)                             $ slide.move(0,2)
    $ slide.cells -> {                            $ slide.cells -> {
    { , ,o, },                                 |  { , , , },
    { , ,o, },                                 |  { , , ,o},
    { , ,o,o},                                 |  { , , ,o},
    { , , , }                                  |  {o, , ,o}
    }                                             }
    $ slide.move(1,2)                             $ slide.move(1,2)
    $ slide.cells -> {                            $ slide.cells -> {
                                                > { ,o,o, },
    { , , , },                                    { , , , },
    { , ,o, },                                 |  { ,o, , },
    { , ,o, },                                 |  { ,o, , }
    { , ,o,o}                                  <
    }                                             }
  • 「|」記号は、異なる行を示します。
  • 「<」記号は、右の列にない左の列の行を指します。
  • 「>」記号は、左の列にない右の列の行を指します。

move メソッドを修正して正しく移動させる方法について何か考えはありますか?

ありがとう

4

2 に答える 2

1

L を最後の位置に対して相対的に移動しているように見えますが、左の例では、上部の「o」の絶対位置を指定していますrowcol

于 2013-10-25T22:58:50.380 に答える
0

grexter89の回答から外れて、move(r,c)Lをその位置に配置することになっていると仮定します(指定された量だけLを移動するのではなく、間違っている場合は修正してください):

プログラムは、動作するように指示したとおりに動作しています。

  • 現在の状態を移動し、結果を新しい一時的な状態に保存します。
  • 現在の状態を新しい移動状態に設定します。

それがあなたが書いたプログラムであるため、あなたの動きは段階的です。これらの種類のことについては、「翻訳」のようなものと考えてください。やりたいことを英語 (または何でも) で表現し、それをコードに翻訳します。上記の 2 つの手順を実行したくない場合は、間違った考えから始めたことになります。

あなたが本当にやりたいことはこれのようです。最初に、L が左上隅にある初期状態を定義し、開始時に現在の状態をその初期状態に設定します。次に move はこれを行います:

  • 初期状態を移動し、結果を新しい一時状態に保存します。
  • 現在の状態を新しい移動状態に設定します。

違いを見ます?上記の手順では、現在の状態に段階的に適用されるのではなく、すべての移動が初期状態から開始されます。

もちろん、上記を少し単純化することもできます (一時的な状態は実際には必要ありません) が、例を単純に保つようにしています。

あなたのコードは、グリッドを正しく移動するという点で基本的に正しいです。それを適用しようとしていた (初期状態) グリッド (現在の状態) に適用していないだけです

うまくいけば、それで十分です。

于 2013-10-26T18:36:30.130 に答える