Срабатывание функции с определенным значением
Доброго времени суток, имеется скрипт шахматы (найден в сети), хочу сделать возможность просмотра сделанных ходов.
Ходы формируются вида 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 можно посмотреть движение фигуры? Т.е. кликнул по первой ссылке, получил движение фигуры, кликнул по второй получил новое движение фигуры. Буду очень благодарен, если поможете! |
diga,
попробуйте ещё раз обьяснить, не упоминая PGN. может макет какой и описание какое-никакое -типа жмак сюда, а оно как бух? |
Цитата:
![]() есть информация по ходам, которая формируется справа от доски ![]() хочу, чтоб при нажатии на один из ходов (гиперссылка), фигуры на доске поменялись (которые соответствуют данному ходу) для этого есть функция, о которой я писал выше, но вот как их соединить я не знаю )))) |
Цитата:
PS. Видимо нужно еще и сбрасывать ход по истории, вернув состояние игры до этого, чтобы можно было ее продолжить? |
diga,
наверно где-то есть данные всех ходов -- и прежде чем показать ход из середины партии наверно надо вывести все предыдущие ходы до выбранного ... это так мысли вслух ... интересно что вы там хотите соединить ... это так мысли вслух ... проблемку бы локализовать ... глядишь кто и подсказал бы ... пока всё в тумане ... делайте макет и пишите что не получается. |
Цитата:
|
вот скажем ход 1. с3 это пешкой сходили с с2 или конём с b1?
|
Ну так он же пишет - история справа, значит это будет набор span, ну и одно id на всех .... )
Я полагаю, что нужно иметь возможность выполнить любой ход из истории. Значит надо еще и возвращаться к последнему ходу (возврат в игру). Хотя все может быть. ) |
Цитата:
|
Цитата:
|
рони,
кстати, фигуру можно вычислить, если начать с конца истории, но надо знать цвет фигур первого хода. Что-то я сперва подумал (из описания истории 1.... 2....), что каждый шаг в ней, это запись ходов двух игроков. Только внимательно посмотрев на картинку... Значит с обработчиком просто, а вот фигуры надо записывать в data-*, если только ходы не сохраняются уже где-то. |
Цитата:
Цитата:
Сам скрипт я взял из этого сайта. Все вроде как красиво и понять, захотел свое добавить и все, пошло не понимание. Может сделать сохранение нотации, и уже восстанавливать ходы используя нотацию? |
Цитата:
|
Цитата:
судя по источника скрипта, вся история храниться в нотации вида ruyLopez = 'r1bqkbnr/pppp1ppp/2n5/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R'; и при вызове функции фигуры перемещаются как надо. Но тогда нужно хранить историю нотации? чтоб знать в какой момент была произведено изменение? или по одной нотации и зная какие ходы были совершены восстановить текущую нотацию и отправить в обработчик? |
Цитата:
|
Цитата:
Я не знаю что такое стандартная по отношению к шахматам, но первый ход в шахматах разыгрывается. Я писал код для шахмат, для серверного языка, но суть не в этом, помню, но смутно, да есть у нее свой язык нотации, специально искал его описание. Есть в сети оно. Узнать ход по нотации не сложно. А вот что будет с нотацией после выполнения хода из истории, это вопрос. По идее нельзя допускать ее изменения, и сам ход из истории как-то "выделять", не давая при этом играть, пока этот ход не будет сброшен. Мне кажется так, ибо история пишется автоматом. |
Цитата:
Вы уверены? Если да, то такое уже должно быть реализовано в игре, тогда к чему вопрос? :) |
Цитата:
|
Вложений: 1
Цитата:
|
Цитата:
Но история пишется автоматически, по крайней мере спец. кнопки для этого не видно, а значит и она по идее должна измениться при этом. Я так полагаю, а вы говорите, что сбрасывать/не разрешать играть при этом, не нужно. Если я прав, значит игру уже не возобновить с последнего хода. |
Цитата:
|
Цитата:
|
Ну пощелкал игру... Странная логика. Играем, видим исполненные ходы. Нажимаем кнопку "Новая игра" - история не очищается, фигуры на исходную, но сделать ход можно только игроку, за которым остался очередной ход, причем только фигурой, которой он до этого не ходил, и в результате будет восстановлено на доске состояние предыдущей партии, плюс новый ход. Как-то это не вяжется с новой игрой, скорее это продолжение, зачем при этом фигуры на исходные позиции... не понять.
Кода много, все дополнения скорее вам сделают только платно, если конечно альтруист не возьмется помочь. ) |
Цитата:
|
|
Цитата:
|
Цитата:
|
diga,
врятли кто-то кроме вас будет внимательно читать доку ... |
Цитата:
сделал обромление тегом и добавил 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 того куда я кликнул? |
Не так, если обрамлять тегом, должно быть так:
<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.) или по четности индекса, чтобы определить тег хода оппонента. |
Цитата:
$('#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> |
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() в этом случае. Ну и к тому же нужно не только этот ход восстановить, но и те что сделаны за ним. Тоже в документации поискать, может это уже решаемо методами, иначе по индексу определять шаг истории и воспроизвести нотацию начиная с этого шага. |
это понятно, но разве то что он получил, не должен был выводить в консоль?
|
<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> И не должно быть проблем, если ошибок не допущено. |
Цитата:
|
Цитата:
не мог бы ты залить chess.js? я заменил как ты сказал, но вышло не как у тебя :help: |
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? */ |
ты гений :dance: , почти то, что надо, за исключением того, что желательно отображения хода в любой момент нажатия, не именно с начальной позиции и с учетом всех предыдущих ходов сделанных до хода на которую нажали. Т.е. если нажму на ход который находится где то в середине всех ходов, отображались все хода сделанные до данного, но не отображались которые сделаны после ) :write: |
Цитата:
завести массив где будут хранится все нотации для каждого хода. при нажатии из истории ходов находить какой ход по номеру сделан, т.е. индекс по данному индексу смотреть какая нотация соответствует и вызывать функцию с данной нотацией которая показывает расположение фигур |
Часовой пояс GMT +3, время: 14:33. |