Всем привет! Пожалуйста, помогите понять, что не так в методах left(), right(), up(), down() класса Figure? Методы-то up(), down() точно соответствуют требованиям, или я не прав? Я допускаю, что не прав в методах left(), right() в части проверки isCurrentPositionAvailable(), но тогда какой должна быть эта проверка?
Поведение логичное при этом:
При нажатии на Left фигурка перемещается влево до конца поля, пока не коснется левого края - за край не выходит.
При нажатии на Right фигурка перемещается вправо до конца поля, пока не коснется правого края - за край не выходит.
При достижении фигурки дна она исчезает (т.к. метод landed() еще не реализован), затем вверху появляется новая.
Где же я не прав, подскажите.
package com.javarush.task.task22.task2213;
/**
* класс, описывающий фигуру
*/
public class Figure {
private int x; // координата фигуры
private int y; // координата фигуры
private int[][] matrix; // форма фигуры - матрица. Двумерный массив 3×3, состоящий из единиц и нулей.
private Field field;
public Figure(int x, int y, int[][] matrix, Field field) {
this.x = x;
this.y = y;
this.matrix = matrix;
this.field = field;
}
/**
* для движения фигурки влево.
*/
public void left() {
this.x--;
if (!isCurrentPositionAvailable()) {
this.x++;
}
}
/**
* для движения фигурки вправо.
*/
public void right() {
this.x++;
if (!isCurrentPositionAvailable()) {
this.x--;
}
}
/**
* для движения фигурки вниз.
*/
public void down() {
this.y++;
}
/**
* для движения фигурки вверх.
*/
public void up() {
this.y--;
}
/**
* для поворота фигурки вокруг главной оси
*/
public void rotate() {
}
/**
* для движения фигурки вниз до дна
*/
public void downMaximum() {
}
/**
* проверка - может ли фигурка быть помещена в текущую позицию
*/
public boolean isCurrentPositionAvailable() {
return this.x + 1 > 0 && (this.x + getRightX()) < field.getWidth() && (this.y + getLowY()) < field.getHeight();
}
private int getRightX() {
int rightX = 0;
for (int y = 0; y < 3; y++) {
for (int x = 0; x < 3; x++) {
if (matrix[y][x] == 1 && rightX < x) {
rightX = x;
}
}
}
return rightX;
}
private int getLowY() {
int lowY = 0;
for (int y = 0; y < 3; y++) {
for (int x = 0; x < 3; x++) {
if (matrix[y][x] == 1 && lowY < y) {
lowY = y;
}
}
}
return lowY;
}
/**
* вызывается, когда фигурка достигла дна или уперлась в другую фигурку
* Все ее занятые клетки теперь должны добавиться в Field.
*/
public void landed() {
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public int[][] getMatrix() {
return matrix;
}
}package com.javarush.task.task22.task2213;
import java.util.ArrayList;
/**
* Класс Field описывает "поле клеток" игры Тетрис
*/
public class Field {
//ширина и высота
private int width;
private int height;
//матрица поля: 1 - клетка занята, 0 - свободна
private int[][] matrix;
public Field(int width, int height) {
this.width = width;
this.height = height;
matrix = new int[height][width];
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public int[][] getMatrix() {
return matrix;
}
/**
* Метод возвращает значение, которое содержится в матрице с координатами (x,y)
* Если координаты за пределами матрицы, метод возвращает null.
*/
public Integer getValue(int x, int y) {
if (x >= 0 && x < width && y >= 0 && y < height)
return matrix[y][x];
return null;
}
/**
* Метод устанавливает переданное значение(value) в ячейку матрицы с координатами (x,y)
*/
public void setValue(int x, int y, int value) {
if (x >= 0 && x < width && y >= 0 && y < height)
matrix[y][x] = value;
}
/**
* Метод печатает на экран текущее содержание матрицы
*/
public void print() {
//Создаем массив, куда будем "рисовать" текущее состояние игры
int[][] canvas = new int[height][width];
//Копируем "матрицу поля" в массив
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
canvas[i][j] = matrix[i][j];
}
}
//Копируем фигурку в массив, только непустые клетки
int left = Tetris.game.getFigure().getX();
int top = Tetris.game.getFigure().getY();
int[][] brickMatrix = Tetris.game.getFigure().getMatrix();
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (top + i >= height || left + j >= width) continue;
if (brickMatrix[i][j] == 1)
canvas[top + i][left + j] = 2;
}
}
//Выводим "нарисованное" на экран, но начинаем с "границы кадра".
System.out.println("---------------------------------------------------------------------------\n");
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
int index = canvas[i][j];
if (index == 0)
System.out.print(" . ");
else if (index == 1)
System.out.print(" X ");
else if (index == 2)
System.out.print(" X ");
else
System.out.print("???");
}
System.out.println();
}
System.out.println();
System.out.println();
}
/**
* Удаляем заполненные линии
*/
public void removeFullLines() {
//Создаем список для хранения линий
ArrayList<int[]> lines = new ArrayList<int[]>();
//Копируем все непустые линии в список.
for (int i = 0; i < height; i++) {
//подсчитываем количество единиц в строке - просто суммируем все ее значения
int count = 0;
for (int j = 0; j < width; j++) {
count += matrix[i][j];
}
//Если сумма строки не равна ее ширине - добавляем в список
if (count != width)
lines.add(matrix[i]);
}
//Добавляем недостающие строки в начало списка.
while (lines.size() < height) {
lines.add(0, new int[width]);
}
//Преобразуем список обратно в матрицу
matrix = lines.toArray(new int[height][width]);
}
}