Добавить элемент в 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 в качестве входных данных, вам, вероятно, придется
- проверьте, занято ли место (x,y) на доске, вы можете сделать это, выполнив итерацию по списку
- если место не занято, добавьте новый кусок на доску (arraylist) после установки
newPiece
s 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.