JAVA - Как вы перемещаетесь по двумерному массиву без циклов for? - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь построить игру по поиску сокровищ, используя предоставленные мне тестовые файлы. Эти текстовые файлы имеют символы S, W, E, N и T, которые соответствуют направлениям, за исключением T, который является сокровищем. Все работает нормально, пока не сместит длину строк / столбцов. Я подозреваю, что это как-то связано с циклами for, но я не уверен. Есть ли способ сделать это без циклов for или у кого-нибудь есть какие-либо советы, чтобы вернуть это в нужное русло?

Вот мой Обновленный код до сих пор:

import java.util.*;

public class NewGridGame
{
    public static final int FALL_OFF = -1;
    public static final int GOING_IN_CIRCLES = -2;
    private int row;
    private int col;
    private char[][] gameBoard;

    NewGridGame(int conRow, int conCol, char[][] conGameBoard)
    {
        row = conRow;
        col = conCol;
        gameBoard = new char[row][col];
        for (int i = 0; i < gameBoard.length; i++)
        {
            for (int j = 0; j < gameBoard[i].length; j++)
            {
                gameBoard[i][j] = conGameBoard[i][j];
            }
        }
        System.out.println(Arrays.deepToString(gameBoard));
    }

    public int playGame()
    {
        boolean[][] beenHereBefore = new boolean[row][col];
        int turns = 0;
        int i = 0;
        int j = 0;

        while (true)
        {
            if(beenHereBefore[i][j] == true)
            {
                return GOING_IN_CIRCLES;
            }
            else
            {
                beenHereBefore[i][j] = true;
            }


            if (gameBoard[i][j] == 'N')
            {
                if(i-1 >= 0)
                {
                    i--;
                    turns++;
                    System.out.println(turns);
                    System.out.println(gameBoard[i][j]);
                }
                else
                {
                    return FALL_OFF;
                }
            }

            else if(gameBoard[i][j] == 'S')
            {
                if(i+1 < row)
                {
                    i++;
                    turns++;
                    System.out.println(turns);
                    System.out.println(gameBoard[i][j]);
                }
                else
                {
                    return FALL_OFF;
                }    
            }

            else if (gameBoard[i][j] == 'E')
            {
                if (j+1 < col)
                {
                    j++;
                    turns++;
                    System.out.println(turns);
                    System.out.println(gameBoard[i][j]);
                }
                else
                {
                    return FALL_OFF;
                }      
            }

            else if(gameBoard[i][j] == 'W')
            {
                if (j-1 >= 0)
                {
                    j--;
                    turns++;
                    System.out.println(turns);
                    System.out.println(gameBoard[i][j]);
                }
                else
                {
                    return FALL_OFF;
                }        
            }

            else if(gameBoard[i][j] == 'T')
            {
                return turns;
            }
        }
    }
}

Вот также пример тестового файла.

ES
TW

этот должен возвращать 3, что является числом ходов (поворотов, в моем коде), но вместо этого он достигает W (что занимает 2 хода) и возвращает -2, что только для случаев, когда он был в положении более одного раза. Кроме того, не все массивы являются квадратами, некоторые для примера 1x200 или 4x5. Буду очень признателен за любую помощь!

1 Ответ

0 голосов
/ 06 апреля 2020

Если вы знаете, что доска такая, что, начиная с (0, 0), вы не застрянете в oop или не сдвинетесь с доски, вы можете просто использовать что-то вроде этого:

public int playGame()
{
  int numMoves = 0; 
  int currentRow = 0;
  int currentCol = 0;

  while(gameBoard[currentRow][currentCol] != 'T')
  {
    switch (gameBoard[currentRow][currentCol])
    {
    case 'E': currentCol++; break;
    case 'W': currentCol--; break;
    case 'S': currentRow--; break;
    case 'N': currentRow++; break;
    default:
       throw new IllegalStateException("Unrecognized Move");
    }
    numMoves++;             
  }

  return numMoves;
}

Вы можете использовать if-then-else вместо switch.

Если вам нужно проверить наличие петель или ходов за бортом, вы сможете добавить эти проверки.

...