0

この迷路を配列に保持する必要があり、次のセルへの手がかりを保持する 2 桁の数字のセルをチェックします。宝物を含むセルは、独自の座標を保持するセルです。

私の場合、それは (5, 2) に保持されているため、セル 52 です。この場合、配列は 0 から始まるため、(4, 1) です。

私の問題は、私のプログラムが数字の 1 を読み取っていることです。最初の手がかりで、それは 34 につながります。これにより、セル (2, 3) に移動するはずです。代わりに (1, 2) に移動します。

-1のせいかと思ったのですが、人間の数を扱っているので、1を引く必要があり、1ではなく0が最初に対応します。

public class MazeTest
{
    public static void main(String args[])
    {
        int initRow = 1;
        int initCol = 1;
        Maze myMaze = new Maze();
        myMaze.SetCoordOne(initRow);
        myMaze.SetCoordTwo(initCol);
        System.out.println("Checking the initial cell");
        myMaze.CheckCell();

        while (myMaze.GetFound() == false)
        {
            System.out.println("Checking the next cell.");
            myMaze.ReadClue(myMaze.GetCoordOne() - 1, myMaze.GetCoordTwo() - 1);
            myMaze.NextCell(myMaze.GetClueOne() - 1, myMaze.GetClueTwo() - 1);
            myMaze.CheckCell();
        } 
    }
}

public class Maze
{
    private int[][] mazeCell = {{34, 21, 32, 41, 25}, 
                                {14, 42, 43, 14, 31}, 
                                {54, 45, 52, 42, 23}, 
                                {33, 15, 51, 31, 35}, 
                                {21, 52, 33, 13, 23} };
    private int coordOne;
    private int coordTwo;
    private int clueOne;
    private int clueTwo;
    private boolean found = false;

    public void ReadClue(int row, int col)
    {
        clueOne = mazeCell[row][col] / 10;
        clueTwo = mazeCell[row][col] % 10;
    }   

    public void NextCell(int rowNum, int colNum)
    {
        coordOne = rowNum;
        coordTwo = colNum;
    }

    public void CheckCell()
    {
        System.out.printf("Checking for treasure in %d\n", 
                          mazeCell[coordOne - 1][coordTwo - 1]);
        if (coordOne == clueOne && coordTwo == clueTwo)
        {
                TreasureFound();
        }
    }

    public void TreasureFound()
    {
        System.out.println("Congratulations, you found the treasure!");
        found = true;
    }

    public int GetMazeCell(int row, int col)
    {
        return mazeCell[row][col];
    }

    public int GetCoordOne()
    {
        return coordOne;
    }

    public void SetCoordOne(int num)
    {
        coordOne = num;
    }

    public int GetCoordTwo()
    {
        return coordTwo;
    }

    public void SetCoordTwo(int num)
    {
        coordTwo = num;
    }

    public int GetClueOne()
    {
        return clueOne;
    }

    public void SetClueOne(int num)
    {
        clueOne = num;
    }

    public int GetClueTwo()
    {
        return clueTwo;
    }

    public void SetClueTwo(int num)
    {
        clueTwo = num;
    }

    public boolean GetFound()
    {
        return found;
    }
}
4

2 に答える 2

0

あなたのコードには減算操作が多すぎると思います。

NextCell() を呼び出すと、座標が減少するため、0 からインデックスが作成されます。次のステップである CheckCell() では、座標が再び減少した mazeCell を出力します。 (2,3);

もう 1 つのことは、CheckCell では、座標を手がかりと比較することです。ここで、座標は既にデクリメントされていますが、手がかりはそうではありません。

于 2011-12-12T10:31:47.580 に答える
0

手がかりと座標をゼロベースにするか、1 ベースにするかを決定する必要があります。

手がかりにReadClue1 ベースの値を割り当てます。

呼び出すmyMaze.NextCell(myMaze.GetClueOne() - 1, myMaze.GetClueTwo() - 1);ときは、座標をゼロベースにします。

ではCheckCell()、1 から始まる手がかりと 0 から始まる座標を比較します。それがうまくいかない理由です。

NextCell への呼び出しを : に変更します。myMaze.NextCell(myMaze.GetClueOne(), myMaze.GetClueTwo());これにより、座標と手がかりの両方が 1 ベースになり、プログラムが動作するはずです。

于 2011-12-12T10:31:40.860 に答える