|
|
|
| Добрый день как можно реализовать скрипт просмотра PGN нотации (в шахматах)
Буду благодарен за любое советы. | |
|
|
|
|
|
|
|
для: Yaroslav
(05.04.2010 в 10:43)
| | Может кто знает подскажите пожалуйста | |
|
|
|
|
|
|
|
для: Yaroslav
(06.04.2010 в 00:04)
| | Что конкретно у вас не получается? | |
|
|
|
|
|
|
|
для: Саня
(06.04.2010 в 00:38)
| | Сделать саму перестановку фигур на доске вообще не представляю как это можно | |
|
|
|
|
|
|
|
для: Yaroslav
(06.04.2010 в 00:55)
| | На GD нарисовать. И давать ссылки на следующий/предыдущий ход. | |
|
|
|
|
|
|
|
для: Саня
(06.04.2010 в 00:59)
| | Может все таки примерчик или какими функциями возможно такое чуда просто нарисовать то 1 но надо что бы оно привелось в действие | |
|
|
|
|
|
|
|
для: Yaroslav
(06.04.2010 в 00:55)
| | Перестановку фигуры соответственно записи или игрок берет фигуру, перестанавливает, записывается ход? | |
|
|
|
|
|
|
|
для: sim5
(06.04.2010 в 04:42)
| | Перестановку фигуры соответственно записи | |
|
|
|
|
|
|
|
для: Yaroslav
(06.04.2010 в 11:51)
| | Ну сопоставьте тогда нотацию с координатами изображения (по размеру клетки) и рисуйте. | |
|
|
|
|
|
|
|
для: sim5
(06.04.2010 в 12:11)
| | Я повторюсь, мне бы примерчик или какими функциями это реализовать | |
|
|
|
|
|
|
|
для: Yaroslav
(06.04.2010 в 12:32)
| | Я не знаю этой нотации, потому примерчика ноу...
Ну она же (эта нотация) надо полагать описывает шахматные фигуры и клетку, на которой она находится. Разве трудно квадрату на доске шахматной сопоставить координаты (верхний левый угол изображения фигуры в квадрате):
верхняя левая (А8), это координата 0,0
следующая справа (В8), это 60,0 - если принять размер квадрата доски 60х60 рх.
Ну и так далее, сверух вниз. Вот и рисуйте соответсвующие квадратики с фигурами 60х60 (белыми, черными), имеющими прозрачность, в соответствующих координатах.
Можно просто умножать размер стороны квадрата на число от 1 до 8, (А - Н, это тоже номера), таким образом и будете получать координаты наложения изображения фигуры. | |
|
|
|
|
|
|
|
для: Yaroslav
(05.04.2010 в 10:43)
| | Может кто еще чего посоветует | |
|
|
|
|
 21 Кб |
|
|
для: Yaroslav
(06.04.2010 в 14:50)
| | Еще можно посоветовать Фотошоп.
А что еще можно, кроме как узнавать по клетке ее координаты на доске и рисовать? По щучьему велению только в сказке.
Я просто заглянул в Вики, посмотрел краткую инфу об этом. Мне этого не надо (по крайней мере сейчас), поэтому я не вникал что к чему, кто там за белых, а кто за красных, почему вторая запись (Nc3 Nbd7) имеет четыре символа, и т.п... Вам это надо, вы изучайте и разбирайтесь, а может уже и разобрались, значит вам и карты (пешки) в руки. Я же, для примера, сделал просто:
<?
$H1 = 15; //Х-координата первой клетки
$Y1 = 311; //Y-координата первой клетки
$side = 37; //сторона клетки
$wch = 326; //сторона шахматной доски
//фигуры: индекс 0 - белые, индекс 1 - черные
$figure = array(
array('w_pawn.gif','R'=>'w_castl.gif','N'=>'w_hors.gif',
'B'=>'w_elef.gif','Q'=>'w_queen.gif','K'=>'w_king.gif'),
array('b_pawn.gif','R'=>'b_castl.gif','N'=>'b_hors.gif',
'B'=>'b_elef.gif','Q'=>'b_queen.gif','K'=>'b_king.gif')
);
//цвета шахматных клеток
$clear = array('ffffff','7f7f7f');
//отобразим четыре состояния партии
$ims = imagecreatetruecolor($wch, $wch*4);
//исходное состояние
$im = imagecreatefromgif('chess.gif');
imagecopy($ims, $im, 0, 0, 0, 0, $wch, $wch);
//партия
$part = array('c3 c5','Nb3 a5','Bb2 d4');
//выводим партию
$play = 0; //условно играют белые
for($i=0; $i<count($part); $i++) {
$cour = explode(' ',$part[$i]); //ход
//получаем фигуру
$fig = strlen($cour[0]) == 3 ? $cour[0][0] : 0;
//получаем исходную клетку
$cour[0] = strlen($cour[0]) == 3 ? substr($cour[0], 1) : $cour[0];
//номер клетки по Х, по маске младших разрядов
$Nx = ord($cour[0][0])&15;
//номер клетки по Y
$Ny = $cour[0][1];
//закрасим исходную клетку ее цветом,
//для чего получим индекс цвета по номеру клетки,
//получая таким образом четные и нечетные клетки доски
$cidx = ($Nx+$Ny-1)&1;
//получаем цвет клетки доски
$color = imagecolorsforindex($ims, hexdec($clear[$cidx]));
$color = imagecolorallocate ($im, $color['red'], $color['green'], $color['blue']);
//получаем координаты клетки на доске
$X = $H1 + $side * ($Nx-1);
$Y = $Y1 - $side * $Ny;
//закрашиваем исходную клетку на доске
imagefilledrectangle($im, $X, $Y, $X+$side-1, $Y+$side-1, $color);
//получаем номера клетки хода и ее координаты
$Nx = ord($cour[1][0])&15;
$Ny = $cour[1][1];
$X = $H1 + $side * ($Nx-1);
$Y = $Y1 - $side * $Ny;
//рисуем фигуру на доске
$imf = imagecreatefromgif($figure[$play][$fig]);
imagecopy($im, $imf, $X, $Y, 0, 0, $side, $side);
imagecopy($ims, $im, 0, ($i+1)*$wch, 0, 0, $wch, $wch);
}
imagetruecolortopalette($ims, false, 16);
header ("Content-type: image/gif");
imagegif($ims);
imagedestroy($ims);
imagedestroy($imf);
imagedestroy($im);
|
В примере используется доска размером 326х326рх с шириной бордюра 15рх. Размер клетки на доске 37х37рх. Изображения фигур, это gif-изображения под размер клетки (37х37) с прозрачностью. Имена изображений описывает массив фигур, в котором условно принято, что нулевой его индекс содержит белые фигуры. Ходы партий находятся в массиве, который обрабатываем и рисуем.
Что чему принадлежит в нотации, я не знаю, но если нужна реакция на один ход, значит и массива не надо, если же описать полностью состояние на доске, значит получить массив из нотации и... В общем суть в примере, а более точно, это уже конкретно по правилам нотации.
Результат примера в приложении (верхняя доска, это исходное положение). | |
|
|
|
|
|
|
|
для: sim5
(07.04.2010 в 09:19)
| | >Я просто заглянул в Вики, посмотрел краткую инфу об этом. Мне этого не надо (по крайней мере сейчас), поэтому я не вникал что к чему, кто там за белых, а кто за красных, почему вторая запись (Nc3 Nbd7) имеет четыре символа, и т.п...
Там же записи не статического размещения приводятся, а записи ходов.
Хотя и с учетом этого всё решается. Нужно только прогнать всю партию до требуемого хода. | |
|
|
|
|
|
|
|
для: Trianon
(07.04.2010 в 11:05)
| | Суть проста - из записи извлечь фигуру и описание клетки, по описанию клетки получить ее номер, координаты. А уже конкретно что там к чему, это уже следуя правилам нотации, но это уже другой вопрос и меня он не касается.
Я понимаю, что это записи ходов, но что к чему и почему иногда так... в общем кому надо, пусть разбирается. ;-) | |
|
|
|
|
|
|
|
для: sim5
(07.04.2010 в 11:11)
| | Nbd7 имеет четыре символа т.к. на клетку d7 могут прыгнуть оба черных коня, например с b8 и f6, а Nb просто говорит откуда конь :-) | |
|
|
|
|
|
|
|
для: root
(07.04.2010 в 18:29)
| | Что-то как-то неубедительно.
По-моему, на клетку d7 могут прыгнуть до восьми черных лошадей, две из которых могут стартовать с линии b (b8 и b6). И где тут раскрытие неоднозначности? | |
|
|
|
|
|
|
|
для: Trianon
(07.04.2010 в 21:17)
| | >Что-то как-то неубедительно.
>По-моему, на клетку d7 могут прыгнуть до восьми черных лошадей, две из которых могут стартовать с линии b (b8 и b6). И где тут раскрытие неоднозначности?
На клетку d7 могут прыгнуть максимум 6 коней, хотя обычно коней одного цвета на доске не больше двух.
В случае если кони стояли бы на b8 и b6, запись имела бы вид Nb8d7, во всяком случае, я бы так записал ход.
Дополнительные координаты добавляются по мере необходимости.
А вообще такой такой нотацией пользуются чаще на турнирах, в книгах обычно нотация полная т.е - Nb8-d7 | |
|
|
|
|
|
|
|
для: root
(07.04.2010 в 23:37)
| | ну да. с 9 горизонталью это я увлекся. :) | |
|
|
|
|
|
|
|
для: root
(07.04.2010 в 18:29)
| | Странная какая-то нотация тогда получается, если описывает не ход, а возможности доски шахматной. Конь имеет обозначение N, клетка нумерацию по литере и цифре, шахматист делает ход одной фигурой (конем), получается или Nb7 -> куда-то или.... | |
|
|
|
|
|
|
|
для: sim5
(07.04.2010 в 09:19)
| | Большое спасибо за труд и т.д и всем кто отписался в этой теме | |
|
|
|
|
|
|
|
для: Yaroslav
(05.04.2010 в 10:43)
| | на css? | |
|
|
|