Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Срабатывание функции с определенным значением (https://javascript.ru/forum/misc/60664-srabatyvanie-funkcii-s-opredelennym-znacheniem.html)

diga 13.01.2016 12:56

Срабатывание функции с определенным значением
 
Доброго времени суток, имеется скрипт шахматы (найден в сети), хочу сделать возможность просмотра сделанных ходов.
Ходы формируются вида PGN: 1. e4 f5 2. a4 b6 (например). Хочу чтоб при на один из ходов, была показана на доске каким образом был сделан ход. Для этого имеется некоторая функция которая показывает перемещение всех фигур на доске, выглядит она следующим образом:

$('#moveBtn').on('click', function() {
  board.move('a2-a4', 'h7-h5');
});


т.е. фигура с a2 перешла в a4 и фигура с h7 перешла в h5, таким образом PGN будет выглядить как 1.a4 h7. PGN составляется следующим образом:
<span id="pgn"></span>

move_string = '</a>'+pgn_move_number + '.'+'<a href="#">';
move_string = move_string + ' ' + move_to_san(move);


т.е. результат имеет вид:
<span id="pgn">1.<a href="#"> d3 c6 </a>2.<a href="#"> b4 a6</a></span>


Собственно вопрос как зная только PGN можно посмотреть движение фигуры? Т.е. кликнул по первой ссылке, получил движение фигуры, кликнул по второй получил новое движение фигуры.

Буду очень благодарен, если поможете!

рони 13.01.2016 13:09

diga,
попробуйте ещё раз обьяснить, не упоминая PGN.
может макет какой и описание какое-никакое -типа жмак сюда, а оно как бух?

diga 13.01.2016 13:35

Цитата:

Сообщение от рони (Сообщение 403551)
diga,
попробуйте ещё раз обьяснить, не упоминая PGN.
может макет какой и описание какое-никакое -типа жмак сюда, а оно как бух?

в общем, есть игра шахматы

есть информация по ходам, которая формируется справа от доски


хочу, чтоб при нажатии на один из ходов (гиперссылка), фигуры на доске поменялись (которые соответствуют данному ходу)

для этого есть функция, о которой я писал выше, но вот как их соединить я не знаю ))))

laimas 13.01.2016 13:45

Цитата:

Сообщение от diga
span id="pgn"

Такого не может быть, id должно быть уникальным. А чтобы сделать ход по истории, нужно обрабатывать щелчок по ним, а текст их дочерних элементов передавать в board.move(). Формируйте либо уникальные id у span, либо назначьте класс (а может он уже есть?), ну а далее уже установка обработчика.

PS. Видимо нужно еще и сбрасывать ход по истории, вернув состояние игры до этого, чтобы можно было ее продолжить?

рони 13.01.2016 13:47

diga,
наверно где-то есть данные всех ходов -- и прежде чем показать ход из середины партии наверно надо вывести все предыдущие ходы до выбранного ... это так мысли вслух ... интересно что вы там хотите соединить ... это так мысли вслух ... проблемку бы локализовать ... глядишь кто и подсказал бы ... пока всё в тумане ... делайте макет и пишите что не получается.

рони 13.01.2016 13:49

Цитата:

Сообщение от laimas
Такого не может быть

вывод партии -- зачем ещё то элементы кроме 1 - похоже клик по ссылке нужно ТС обработать в этом элементе.

рони 13.01.2016 13:53

вот скажем ход 1. с3 это пешкой сходили с с2 или конём с b1?

laimas 13.01.2016 13:54

Ну так он же пишет - история справа, значит это будет набор span, ну и одно id на всех .... )
Я полагаю, что нужно иметь возможность выполнить любой ход из истории. Значит надо еще и возвращаться к последнему ходу (возврат в игру).
Хотя все может быть. )

laimas 13.01.2016 13:55

Цитата:

Сообщение от рони
вот скажем ход 1. с3 это пешкой сходили с с2 или конём с b1?

Не только чем, но и какими, то есть первый ход чей, черных или белых. )

laimas 13.01.2016 13:59

Цитата:

Сообщение от рони
вывод партии -- зачем ещё то элементы кроме 1

Ну да, может быть - в одном span текст и ссылки. Не удобно для установки обработчика.

laimas 13.01.2016 14:12

рони,
кстати, фигуру можно вычислить, если начать с конца истории, но надо знать цвет фигур первого хода.
Что-то я сперва подумал (из описания истории 1.... 2....), что каждый шаг в ней, это запись ходов двух игроков. Только внимательно посмотрев на картинку... Значит с обработчиком просто, а вот фигуры надо записывать в data-*, если только ходы не сохраняются уже где-то.

diga 13.01.2016 14:13

Цитата:

Сообщение от laimas (Сообщение 403558)
PS. Видимо нужно еще и сбрасывать ход по истории, вернув состояние игры до этого, чтобы можно было ее продолжить?

нет сбрасывать не нужно, я как понял, там есть функция которая продолжает игру с того момента, где остановились.


Цитата:

Сообщение от рони (Сообщение 403559)
diga,
наверно где-то есть данные всех ходов -- и прежде чем показать ход из середины партии наверно надо вывести все предыдущие ходы до выбранного ....

да я тоже так же думаю, так же вариант использовать специальную нотацию, которая так же имеется в данном скрипте, т.к. скрипт не мой, и пока не силен в языке, трудновато разобраться, много времени уходит на решение вопросов которые решаются в 2-3 строчки.

Сам скрипт я взял из этого сайта. Все вроде как красиво и понять, захотел свое добавить и все, пошло не понимание. Может сделать сохранение нотации, и уже восстанавливать ходы используя нотацию?

laimas 13.01.2016 14:16

Цитата:

Сообщение от diga
нет сбрасывать не нужно, я как понял, там есть функция которая продолжает игру с того момента, где остановились.

Если есть таковое, значит она начнет играть с последнего хода, а вы хотите выполнить ход из истории, то есть добавить такую функцию самостоятельно. Предположим, что последний ход с которого можно возобновить игру записывается как раз с вызовом board.move(). Сделали вы ход из истории, любой, с какого хода тогда возобновится игра?

diga 13.01.2016 14:18

Цитата:

Сообщение от laimas (Сообщение 403568)
рони,
кстати, фигуру можно вычислить, если начать с конца истории, но надо знать цвет фигур первого хода.
Что-то я сперва подумал (из описания истории 1.... 2....), что каждый шаг в ней, это запись ходов двух игроков. Только внимательно посмотрев на картинку... Значит с обработчиком просто, а вот фигуры надо записывать в data-*, если только ходы не сохраняются уже где-то.

так разве не белые всегда ходят в стандартной игре?)
судя по источника скрипта, вся история храниться в нотации вида
ruyLopez = 'r1bqkbnr/pppp1ppp/2n5/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R';

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

diga 13.01.2016 14:23

Цитата:

Сообщение от laimas (Сообщение 403570)
Если есть таковое, значит она начнет играть с последнего хода, а вы хотите выполнить ход из истории, то есть добавить такую функцию самостоятельно. Предположим, что последний ход с которого можно возобновить игру записывается как раз с вызовом board.move(). Сделали вы ход из истории, любой, с какого хода тогда возобновится игра?

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

laimas 13.01.2016 14:25

Цитата:

Сообщение от diga
так разве не белые всегда ходят в стандартной игре?)


Я не знаю что такое стандартная по отношению к шахматам, но первый ход в шахматах разыгрывается.

Я писал код для шахмат, для серверного языка, но суть не в этом, помню, но смутно, да есть у нее свой язык нотации, специально искал его описание. Есть в сети оно.

Узнать ход по нотации не сложно. А вот что будет с нотацией после выполнения хода из истории, это вопрос. По идее нельзя допускать ее изменения, и сам ход из истории как-то "выделять", не давая при этом играть, пока этот ход не будет сброшен.

Мне кажется так, ибо история пишется автоматом.

laimas 13.01.2016 14:27

Цитата:

Сообщение от diga
игра возобновиться с того момента, когда был сделан последний ход, в не зависимости от того просмотрел я старые ходы или нет, т.е. если я во время просмотра старого хода я нажал на историю, и решил выйти пешкой, то все фигуры станут на места соответствующие последнему ходу


Вы уверены? Если да, то такое уже должно быть реализовано в игре, тогда к чему вопрос? :)

diga 13.01.2016 14:32

Цитата:

Сообщение от laimas (Сообщение 403575)
Вы уверены? Если да, то такое уже должно быть реализовано в игре, тогда к чему вопрос? :)

вопрос в том как реализовать просмотр ходов по истории) могу скинуть скрипт, если это лучше поможет меня понять ;)

diga 13.01.2016 14:40

Вложений: 1
Цитата:

Сообщение от laimas (Сообщение 403575)
Вы уверены? Если да, то такое уже должно быть реализовано в игре, тогда к чему вопрос? :)

скрипт во вложении, посмотри что можно сделать, буду очень благодарен

laimas 13.01.2016 14:41

Цитата:

Сообщение от diga
вопрос в том как реализовать просмотр ходов по истории

Щелчок по тегу А нужного хода, а дальше "сходить назад" начиная от последнего хода по текущий, это не сложно будет сделать.

Но история пишется автоматически, по крайней мере спец. кнопки для этого не видно, а значит и она по идее должна измениться при этом. Я так полагаю, а вы говорите, что сбрасывать/не разрешать играть при этом, не нужно. Если я прав, значит игру уже не возобновить с последнего хода.

diga 13.01.2016 14:50

Цитата:

Сообщение от laimas (Сообщение 403579)
Щелчок по тегу А нужного хода, а дальше "сходить назад" начиная от последнего хода по текущий, это не сложно будет сделать.

Но история пишется автоматически, по крайней мере спец. кнопки для этого не видно, а значит и она по идее должна измениться при этом. Я так полагаю, а вы говорите, что сбрасывать/не разрешать играть при этом, не нужно. Если я прав, значит игру уже не возобновить с последнего хода.

вот например, я делаю некоторые ходы, затем вызываю функцию, она у меня как кнопка "new game" (я залил скрипт выше) при это фигуры переходят в исходное положение, НО игра при это не начинается заново а продолжается, и если я сделаю новый ход, то фигуры переместятся как были до этого, я хочу добиться такого же эффекта и при клике на один из ходов в истории. Т.е. это не отмена текущих ходов, а просто просмотр расположения фигур на доске для данных ходов

diga 13.01.2016 15:08

Цитата:

Сообщение от laimas (Сообщение 403579)
Щелчок по тегу А нужного хода, а дальше "сходить назад" начиная от последнего хода по текущий, это не сложно будет сделать.

а как функция будет узнавать по какому именно тегу А мы щелкнули? они же различаются только содержимым, нет идентификатора. Если можно по содержимому, то как такое реализовать?

laimas 13.01.2016 15:27

Ну пощелкал игру... Странная логика. Играем, видим исполненные ходы. Нажимаем кнопку "Новая игра" - история не очищается, фигуры на исходную, но сделать ход можно только игроку, за которым остался очередной ход, причем только фигурой, которой он до этого не ходил, и в результате будет восстановлено на доске состояние предыдущей партии, плюс новый ход. Как-то это не вяжется с новой игрой, скорее это продолжение, зачем при этом фигуры на исходные позиции... не понять.

Кода много, все дополнения скорее вам сделают только платно, если конечно альтруист не возьмется помочь. )

laimas 13.01.2016 15:32

Цитата:

Сообщение от diga
а как функция будет узнавать по какому именно тегу А мы щелкнули?

Обработчик щелчка нужно добавлять, причем я оказался прав, просмотрев запись ходов - ход пишется парами, то есть обоих игроков, и если вернуть состояние игры для одного хода, то не проблема, по какой ссылке А щелкнули, та и отправная точка. Но если подразумевается ход обоих игроков, то пары тегов А (ход каждого игрока в истории) нужно обрамлять, например в тот же SPAN. Иначе без костылей дополнительных не обойтись.

рони 13.01.2016 15:37

новый дистрибьютив
https://github.com/jhlywa/chess.js
новая документация
http://chessboardjs.com/

diga 13.01.2016 15:57

Цитата:

Сообщение от рони (Сообщение 403593)
новый дистрибьютив
https://github.com/jhlywa/chess.js
новая документация
http://chessboardjs.com/

я из сайта документации и скачал..

diga 13.01.2016 16:29

Цитата:

Сообщение от рони (Сообщение 403593)
новый дистрибьютив
https://github.com/jhlywa/chess.js
новая документация
http://chessboardjs.com/

тем не менее мой вопрос остается открытым, как реализовать просмотр истории хода.

рони 13.01.2016 16:38

diga,
врятли кто-то кроме вас будет внимательно читать доку ...

diga 13.01.2016 17:11

Цитата:

Сообщение от рони (Сообщение 403606)
diga,
врятли кто-то кроме вас будет внимательно читать доку ...

сформулирую вопрос по другому, как можно сделать событие клик по одной из гиперссылок, и получить значение id?
сделал обромление тегом и добавил id, таким образом выглядит по лучше:
<span id="pgn">1. <a href="#" id="g3">g3</a> <a href="#" id="e6">e6</a> 2. <a href="#" id="f3">f3</a> <a href="#" id="c6">c6</a> 3. <a href="#" id="h3">h3</a> <a href="#" id="a6">a6</a></span>


т.е. вопрос, как навесить событие таким образом, чтоб было известно куда я кликаю, и мог считать id того куда я кликнул?

laimas 13.01.2016 17:20

Не так, если обрамлять тегом, должно быть так:

<span id="pgn"><span>1. <a>Ход 1 игрока</a> <a>Ход 2 игрока</a></span></span>

тогда

$('#pgn span').click(function() {
    var a = $(this).children();
    a.first().text() - ход первого игрока
    a.last().text() - ход второго игрока
})


Иначе, без обрамления, щелчок по любому тегу А, затем разбираться, например по текстовому узлу (1., 2.) или по четности индекса, чтобы определить тег хода оппонента.

diga 13.01.2016 18:11

Цитата:

Сообщение от laimas (Сообщение 403612)
Не так, если обрамлять тегом, должно быть так:

<span id="pgn"><span>1. <a>Ход 1 игрока</a> <a>Ход 2 игрока</a></span></span>

тогда

$('#pgn span').click(function() {
    var a = $(this).children();
    a.first().text() - ход первого игрока
    a.last().text() - ход второго игрока
})

хотел посмотреть как работает, сделал так:

$('#pgn span').on('click', function(){
	var a = $(this).children();
	a.first().text();
	a.last().text();
	console.log(a.first().text());
});


ничего консоль не показывает

обромление:
<span id="pgn"><span>1. <a href="#">e3</a> <a href="#">c6</a> </span><span>2. <a href="#">b4</a> <a href="#">a6</a></span></span>

laimas 13.01.2016 18:18

a.first().text();
a.last().text();

Это я написал как получить
а передавать:
board.move(a.first().text(), a.last().text());
если правильно помнится имя функции.

Без обрамления типа такого:

var plH = $('#pgn a').click(function() {
        var a = $(this), i = plH.index(a) & 1, f = i ? a.prev() : a, s = i ? a : a.next();
        board.move(f.text()+' '+s.text())
    })


Но как быть, если второй игрок не сделал хода, делать ход по истории или нет, в документации почитать или просто проверить поведение board.move() в этом случае.
Ну и к тому же нужно не только этот ход восстановить, но и те что сделаны за ним. Тоже в документации поискать, может это уже решаемо методами, иначе по индексу определять шаг истории и воспроизвести нотацию начиная с этого шага.

diga 13.01.2016 18:21

это понятно, но разве то что он получил, не должен был выводить в консоль?

laimas 13.01.2016 18:30

<html> 
<head> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script> 
$(function() {
$('#pgn span').on('click', function(){
    var a = $(this).children();
    alert(a.first().text() +' '+ a.last().text());
});
});
</script>     
</head> 
<body>
<span id="pgn"><span>1. <a href="#">e3</a> <a href="#">c6</a> </span><span>2. <a href="#">b4</a> <a href="#">a6</a></span></span>
</body> 
</html>


И не должно быть проблем, если ошибок не допущено.

diga 13.01.2016 19:12

Цитата:

Сообщение от laimas (Сообщение 403625)
[HTML run]<html>
И не должно быть проблем, если ошибок не допущено.

дело в том, что когда я запускаю ничего не происходит, возможно из-за динамического добавления этих ходов, если как вы показали, заранее "просто прописать" эти ходы, то все работает

рони 13.01.2016 19:31

diga,
мысли вслух

добавить заменить файл chess.js функция pgn
строки 1, 2, 3 добавить строку 4 изменить
var dt_move = [make_pretty(move).from + '-' + make_pretty(move).to];
          var temp = reversed_history.slice(-1);
          if(temp.length) dt_move.push(make_pretty(temp[0]).from + '-' + make_pretty(temp[0]).to);
		  move_string = '</a>'+pgn_move_number + '.'+'<a href="#" data-move="'+dt_move+'">';

файл common.js строки 7-11 добавить
//--- start ---
var board,
  game = new Chess(),
  statusEl = $('#status'),
  fenEl = $('#fen'),
  pgnEl = $('#pgn');
  pgnEl.on('click', 'a',function(event) {
  event.preventDefault();
  var data = $(this).data('move').split(',')
  board.move.apply(null,data);
})


сделать несколько ходов - нажать New game
нажимать последовательно ходы с 1 .

diga 13.01.2016 19:47

Цитата:

Сообщение от рони (Сообщение 403633)
diga,
добавить заменить файл chess.js


не мог бы ты залить chess.js? я заменил как ты сказал, но вышло не как у тебя :help:

рони 13.01.2016 19:50

diga,
изменения только тут
/* build the list of moves.  a move_string looks like: "3. e3 e6" */
      while (reversed_history.length > 0) {
        var move = reversed_history.pop();
        /* if the position started with black to move, start PGN with 1. ... */
        if (pgn_move_number === 1 && move.color === 'b') {
          move_string = '1. ...';
          pgn_move_number++;
        } else if (move.color === 'w') {
          /* store the previous generated move_string if we have one */
          if (move_string.length) {
            moves.push(move_string);
          }
          //move_string = pgn_move_number + '.';
		  //move_string = '</li><li>' + pgn_move_number + ')';
          var dt_move = [make_pretty(move).from + '-' + make_pretty(move).to];
          var temp = reversed_history.slice(-1);
          if(temp.length) dt_move.push(make_pretty(temp[0]).from + '-' + make_pretty(temp[0]).to);
		  move_string = '</a>'+pgn_move_number + '.'+'<a href="#" data-move="'+dt_move+'">';
          pgn_move_number++;
        }
        move_string = move_string + ' ' + move_to_san(move);
        make_move(move);
      }

      /* are there any other leftover moves? */

diga 13.01.2016 19:57


ты гений :dance: , почти то, что надо, за исключением того, что желательно отображения хода в любой момент нажатия, не именно с начальной позиции и с учетом всех предыдущих ходов сделанных до хода на которую нажали. Т.е. если нажму на ход который находится где то в середине всех ходов, отображались все хода сделанные до данного, но не отображались которые сделаны после ) :write:

diga 13.01.2016 20:00

Цитата:

Сообщение от рони (Сообщение 403642)
diga,
изменения только тут

ты однако интересно сделал, я бы не додумался, я уж думал можно нибудь типо такого:

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


Часовой пояс GMT +3, время: 14:33.