Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.05.2019, 09:29
Новичок на форуме
Отправить личное сообщение для fillika Посмотреть профиль Найти все сообщения от fillika
 
Регистрация: 16.05.2019
Сообщений: 6

Помогите решить задачу
Ребята, привет. Я новичок в JavaScript, помогите найти решение, нужно создать поле ввода и кнопку. В поле нужно ввести позицию из шахматной доски, а клик по кнопке должен вывести все возможные ходы коня из данной позиции.
Например, ввожу в поле D4 и он выдает мне результаты:
b3 b5 c6 c2 e6 e2 f3 f5.
Как можно было бы решить задачу?
Заранее спасибо
Ответить с цитированием
  #2 (permalink)  
Старый 16.05.2019, 11:12
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

<form id="knight-moves">
  <input name="position">
  <button>Найти ходы</button>
  <output></output>
</form>
<script>
function getPossibleMovesOfKnight(p) {
	class Position {
		constructor(position) {
			Object.assign(this, position);
		}

		get isValid() {
			return this[0] >= "A" && this[0] <= "H" && this[1] >= "1" && this[1] <= "8";
		}

		moveBy([x, y]) {
			const position = new Position([
				String.fromCodePoint(this[0].codePointAt() + x),
				String.fromCodePoint(this[1].codePointAt() + y)
			]);

			return position.isValid ? position : null;
		}

		toString() {
			return `${this[0]}${this[1]}`;
		}
	}

	const position = new Position(p.toUpperCase());
	const directions = [[-2, -1], [-2, 1], [-1, -2], [-1, 2], [1, -2], [1, 2], [2, -1], [2, 1]];

	if(!position.isValid) throw new Error(`Invalid position '${p}'`);

	return directions.map(direction => position.moveBy(direction)).filter(position => position).map(String);
}

document.getElementById("knight-moves").addEventListener("submit", event => {
  event.preventDefault();
  const moves = getPossibleMovesOfKnight(event.target.position.value);
  
  event.target.querySelector("output").innerHTML = `<b>Ходы</b>: ${moves.join(", ")}`;
});
</script>


UPD Добавлена обработка ошибки в случае ввода неправильной начальной позиции, Position теперь наследует от String
<form id="knight-moves">
  <input name="position">
  <button>Найти ходы</button>
  <output></output>
</form>
<script>
function getPossibleMovesOfKnight(p) {
	class Position extends String {
		get isValid() {
			return this.length === 2 && this[0] >= "A" && this[0] <= "H" && this[1] >= "1" && this[1] <= "8";
		}

		moveBy([x, y]) {
			const position = new Position(
				String.fromCodePoint(this[0].codePointAt() + x) +
				String.fromCodePoint(this[1].codePointAt() + y)
			);

			return position.isValid ? position : null;
		}
	}

	const position = new Position(p.toUpperCase());
	const directions = [[-2, -1], [-2, 1], [-1, -2], [-1, 2], [1, -2], [1, 2], [2, -1], [2, 1]];

	if(!position.isValid) throw new Error(`Invalid position '${p}'`);

	return directions.map(direction => position.moveBy(direction)).filter(position => position);
}

document.getElementById("knight-moves").addEventListener("submit", event => {
  event.preventDefault();
  var html;
  
  try {
    const moves = getPossibleMovesOfKnight(event.target.position.value);
    html = `<b>Ходы</b>: ${moves.join(", ")}`;
  } catch(error) {
    html = "Невозможно вычислить ходы, неверная начальная позиция!";
  }
  
  event.target.querySelector("output").innerHTML = html;
});
</script>

Последний раз редактировалось Malleys, 16.05.2019 в 11:32.
Ответить с цитированием
  #3 (permalink)  
Старый 16.05.2019, 11:39
Новичок на форуме
Отправить личное сообщение для fillika Посмотреть профиль Найти все сообщения от fillika
 
Регистрация: 16.05.2019
Сообщений: 6

Боже, как все просто выглядит. Тупо копировать не буду, обещаю, сегодня вечером разберу полностью код, чтобы в будущем самостоятельно все решать. Спасибо вам огромное!!!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите решить задачу по jQuery sasha3611 jQuery 1 27.12.2017 12:16
Помогите решить задачу. Alex14 Javascript под браузер 2 29.03.2017 12:18
Помогите решить задачу! Vor_tex Общие вопросы Javascript 0 24.06.2016 13:05
Пожалуйста помогите решить задачу на java alex01rus1991 Элементы интерфейса 9 27.11.2012 01:02
Помогите решить задачу vkg Общие вопросы Javascript 1 20.02.2008 11:59