Добавить элемент в ArrayList в позиции x,y

Я пытаюсь закончить это задание в игре Tic Tac Toe. Мне удалось выполнить все остальные требования, кроме методов AddPiece и GetPieceAt. Я погуглил практически все о том, как внедрить это в ArrayList и как установить его в (x,y) ArrayList. Мне кажется, что я неправильно понимаю задание, но на данный момент я понятия не имею, что делать. У меня есть некоторые записанные идеи, но я исключил большинство вещей, которые, как я думал, будут использоваться в этих двух методах.

Чтобы облегчить добавление всех остальных файлов здесь, это ссылка на то, где размещено назначение. http://go.code-check.org/codecheck/files/1404121614cuepj4pvhuprowa1awz8s0642

Любая помощь и рекомендации будут очень признательны.

Это код, который у меня есть для имени файла TicTacToeBoard.java

import java.util.ArrayList;


public class TicTacToeBoard extends GameBoard
{
/**
 * The pieces in this game.
 */
ArrayList<TicTacToePiece> GamePieces;

/**
 * Constructor. Instantiate the GamePieces ArrayList.
 */
public TicTacToeBoard()
{
    // YOUR CODE HERE
    super(0, 0);
    GamePieces = new ArrayList<TicTacToePiece>();
}

/**
 * empty out the GamePieces ArrayList
 */
public void Reset()
{
    // YOUR CODE HERE
    GamePieces.clear();
}


/**
 * Fill a space with the newPiece, IF THAT SPACE IS EMPTY.
 * 
 * @param x the first, horizontal coordinate for the next move 
 * @param y the second, vertical coordinate for the next move
 * @newPiece the piece to place at the location
 */
public void AddPiece(int x, int y, TicTacToePiece newPiece)
{
    // YOUR CODE HERE
    GamePiece gp = new GamePiece(x,y);


    gp.GetPosition();


//      GamePieces.add((int) gp.GetPosition(), newPiece);


}

/**
 * Get a GamePiece at a specific position.
 * 
 * @param x the first, horizontal coordinate for the next move 
 * @param y the second, vertical coordinate for the next move
 * @return the game piece at position x, y. or null if there is none
 */
public TicTacToePiece GetPieceAt(int x, int y)
{
    // YOUR CODE HERE


    return null;

}

/**
 * Checks the board for win or draw conditions and update the GameState property appropriately.
 * 
 * @return the GameStatus of this game
 */
public GameStatus CheckForWin()
{
    TicTacToeGame t = new TicTacToeGame();


    if(t.GetGameState() == GameStatus.ON)
        return GameStatus.ON;
    else if(t.GetGameState() == GameStatus.WIN_PLAYER_1)
        return GameStatus.WIN_PLAYER_1;
    else if(t.GetGameState() == GameStatus.WIN_PLAYER_2)
        return GameStatus.WIN_PLAYER_2;
    else
        return GameStatus.DRAW;


    // YOUR CODE HERE

}

/**
 * Create a Board[][] array. This is a helper function that I used so that I could reuse code from Assignment 1. You do not have to implement this method. 
 * 
 * @return a two dimensional array of Strings
 */
private String[][] GetGameBoard()
{
    // YOUR CODE HERE
    String[][] Board = new String[3][3];

    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            Board[i][j] = "-";

    return Board;
}

//  /**
//   * Checks a string for win conditions. If three in a row occur, then it returns the proper GameState.
//   * This is a helper function that I used, but is not required for you to implement.
//   * 
//   * @param Input a representation of a row, column, or diagonal in the game. 
//   * 
//   * @return the proper GameStatus for a row, column, or diagonal represented by the Input String
//   *         "---" would indicate an entirely free row, column or diagonal, in which case it should return GameStatus.ON.
//   *         "000" indicates a row, column, or diagonal that has been won by player     1.
//   *         "111" indicates a row, column, or diagonal that has been won by player 2.
//   */
//  private GameStatus CheckStringForThree(String Input)
//  {
//      // YOUR CODE HERE
//  }

/**
 * Print the game board to stdout.
 * 0 should be used to represent moves by player 1.
 * 1 should be used to represent moves by player 2.
 * - should be used to represent a free space.
 * One blank space should occur between each space.
 * So an empty game board would be
 * - - -
 * - - -
 * - - -
 * And a game might look like
 * 0 - 1
 * 0 - -
 * 1 - 0
 * WARNING: If you are storing the game board as Board[x][y], then the traditional nested loops won't 
 * print the board properly. x should be the horizontal coordinate. y should be the vertical coordinate.
 */
public void Print()
{
    // YOUR CODE HERE

    for(int r = 0; r < 3; r++)
    {
        for(int c = 0; c < 3; c++)
        {
                System.out.print(GetGameBoard()[r][c]);
        }
        System.out.println();
    }
    System.out.println(GamePieces);
}

}

2 ответа

Решение

Ваш TicTacToePiece содержит значения x и y

public TicTacToePiece(int newX, int newY, int newPlayerNumber, String newSymbol)

И ваш GamePieces состоит из TicTacToePieces

GamePieces = new ArrayList<TicTacToePiece>();

И так как ваш AddPiece функция принимает x,y,newPiece в качестве входных данных, вам, вероятно, придется

  1. проверьте, занято ли место (x,y) на доске, вы можете сделать это, выполнив итерацию по списку
  2. если место не занято, добавьте новый кусок на доску (arraylist) после установки newPieces x,y значения соответственно при необходимости.

редактировать:::

for (TicTacToePiece tttp : GamePieces) {
/* Note that this 'tttp' is each element in the Gameieces arraylist
   You are just iterating through all elements in the array checking if condition meets */
    if (tttp.x == x && tttp.y == y) {
        //x and y value match, do something
    }
}

Выше эквивалентно приведенному ниже коду

for (int i = 0; i < GamePieces.size(); i++) {
    if (GamePieces.get(i).x == x && GamePieces.get(i).y == y)
           //dosomething
    }
}

Позиции TicTacToe также могут быть представлены в ArrayList. Здесь нам не нужно делать плату, используя двумерную структуру данных.

Например, игра TicTacToe имеет девять позиций, вы можете сохранять позиции в массиве размером 9 и сохранять позиции от 0 до 8 индексов.

Если вы хотите отобразить координаты X и Y в ArrayList, используйте публичный HashMap, который отображает позиции X и Y с индексами ArrayList, как показано ниже (это сопоставление должно быть сделано изначально)

HashMap<Integer, Integer> hMap=new HashMap<Integer, Integer>();
        hMap.put(00, 0);
        hMap.put(01, 1);
        hMap.put(02, 2);
        hMap.put(10, 3);
        hMap.put(11, 4);
        hMap.put(12, 5);
        hMap.put(20, 6);
        hMap.put(21, 7);
        hMap.put(22, 8);

В hMap 00 отображается на 0-й индекс в ArrayList,01 отображается на 1-й индекс и продолжается.

Поэтому, когда вы получаете значения x и y из параметра функции, создайте строку 'xy' и получите соответствующую позицию из ArrayList, как показано ниже:

        int pos=0;
        int x=1;
        int y=2;

        pos=Integer.parseInt(String.valueOf(x)+String.valueOf(y));
        int listPos=hMap.get(pos);

А чтобы получить позиции X и Y, выполните итерацию по всему объекту ArrayList, получите индекс, а с помощью индекса получите значения X и Y из HashMap.

Другие вопросы по тегам