frenneruruu
@frenneruruu
writer, game designer, java/kotlin/lua developer

Как сделать код лучше?

В целях изучения программирования я делаю на java игру 2048. В игре есть класс, в котором есть много повторяющихся фрагментов - циклы перебора поля. Вопрос заключается в том, можно ли создать такой метод, который будет принимать значения границ перебора и исполняемый код?

Что-то типо такого:
public void fun(int borderX, int borderY, ??? code){
	for (int x = 0; x < borderX; x++)
		for (int y = 0; y < borderY; y++)
			do code
}


Если же нет, можете порекомендовать как сделать код лучше? Спасибо за ваше внимание.

Собственно, код
public class Field {
	private int[][] field; // игровое поле
	private int width, heigth; // размеры поля

	public Field(int sizeX, int sizeY) { // инициализатор
		this.width = sizeX;
		this.heigth = sizeY;
		this.field = new int[sizeX][sizeY];
	}

	public int getCell(int x, int y) { // показать значение ячейки
		return this.field[x][y];
	}

	public void setCell(int val, int x, int y) { // присвоить ячейке значение
		this.field[x][y] = val;
	}

	public void reset() { // сбросить поле (новая игра, рестарт)
		for (int x = 0; x < width; x++)
			for (int y = 0; y < heigth; y++)
				this.field[x][y] = 0;
	}

	public void copyOf(Field f) { // копировать значения клеток поля (для функции отмена хода)
		for (int x = 0; x < width; x++)
			for (int y = 0; y < heigth; y++)
				this.field[x][y] = f.getCell(x, y);
	}

	public boolean isEqualTo(Field f) { // для проверки: привело ли нажатие на клавишу к смещению плиток?
		for (int x = 0; x < width; x++)
			for (int y = 0; y < heigth; y++)
				if (field[x][y] != f.getCell(x, y))
					return false;
		return true;
	}

	private boolean canMergeY() { // можно ли сдвинуть плитки по вертикали?
		for (int x = 0; x < width; x++)
			for (int y = 0; y < heigth - 1; y++)
				if (field[x][y] == field[x][y + 1])
					return true;
		return false;
	}

	private boolean canMergeX() { // можно ли сдвинуть плитки по горизонтали?
		for (int x = 0; x < width - 1; x++)
			for (int y = 0; y < heigth; y++)
				if (field[x][y] == field[x + 1][y])
					return true;
		return false;
	}

	public boolean canMerge() { // проверка на возможность продолжения игры
		return canMergeX() && canMergeY();
	}

	public boolean contains(int i) { // для поиска плиток 0 и 2048 для разных задач
		for (int x = 0; x < width; x++)
			for (int y = 0; y < heigth; y++)
				if (field[x][y] == i)
					return true;
		return false;
	}
}
  • Вопрос задан
  • 102 просмотра
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Да, можно, с помощью лямбда-функций. Это анонимные функции. В твоем случае нужен такой интерфейс:
@FunctionalInterface
interface BiIntFunction {
    void apply(x: int, y: int);
}

и применять примерно так:
void doSomething(int borderX, int borderY, body: BiIntFunction) {
    for (int x = 0; x < borderX; x++) {
        for (int y = 0; y < borderY; y++) {
           body.apply(x, y);
        }
    }
}
//....
doSomething(sizeX, sizeY, (x, y) -> { ... your code here ... });
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
ОТП Банк Москва
от 240 000 до 270 000 ₽
Sportmaster Lab Санкт-Петербург
от 150 000 ₽
Эвотор Москва
от 180 000 до 250 000 ₽