Всем привет! Пожалуйста, помогите понять, что не так в методах 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;
	}
}