БлогNot. Шахматный рандомайзер :)

Шахматный рандомайзер :)

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

Подход к написанию кода PHP - самый простой, полностью вот отсюда, так что исходник не нужен. В коде от chessgames.com немало ошибок, сначала правятся они, потом делаются замены для превращения относительных ссылок в абсолютные и т.п.

Проще всего заставить работать такой скрипт в теге <iframe>, потому что через JQuery муторно - скрипт тоже подгружает сложные скрипты и законфликтует с JQuery. Из-за перегруженности целевого сервера или проблем со связью скрипт может иногда "ошибаться", на этот случай вверху есть ссылка "Give me another game, please" "Ещё партию, пожалуйста". Ну а если изменится выдача целевого сервера, тогда придётся изменить и код по тому же принципу, что в статье по первой ссылке.

Вот код для подключения скрипта на своём сайте и скрипт в работе:

<div align="center">
 <iframe src="http://scripts.kislenko.net/randomchessgame.php" 
  width="800" height="600" align="middle" scrolling="auto" frameborder="no">
  <div align="center">Для работы приложения нужен браузер с поддержкой плавающих фреймов</div>
 </iframe>
</div>

P.S. При первой загрузке скрипта кнопки под доской могут выглядеть не так, как в скрипте, открытом без фрейма, из-за стиля блога.

P.P.S. Администрация сайта-донора переписала скрипт и заменила JS-"движок" для просмотра партий, устранив также большинство ошибок разметки. Плюс запретили кросс-доменный доступ, так что фигурки пока не грузятся :(

P.P.P.S. :) Когда мне всё это надоело, стал просто брать со страницы сервера только PGN и подгружать его в chesstempo. Конечно, это означает, что работоспособность скрипта будет зависеть от доступности сайта chesstempo.com. Вот здесь написано, как установить chesstempo у себя на сервере и приложен соответствующий архив.

Вот более-менее стабильно работающий код для PHP 7.4 и кодировки Юникода utf-8:

<!DOCTYPE html>
<html lang="ru">
<head>
 <meta charset="utf-8">
 <title>Random game from chessgames.com</title>
</head>
<body>

<?php
 function process($s,$start,$end,$include) { 
  $s1 = mb_strpos ($s,$start);
  $s2 = mb_strpos ($s,$end);
  if (!is_integer($s1)) { return "ОШИБКА: Не найден начальный сегмент: ".htmlspecialchars($start); }
  if (!is_integer($s2)) { return "ОШИБКА: Не найден конечный сегмент: ".htmlspecialchars($end); }
  if ($s1 > $s2) { return "ОШИБКА: Конечный сегмент предшествует начальному"; }
  if ($include) { //Включать начало и конец
   return mb_substr ($s,$s1,$s2-$s1+mb_strlen($end,'UTF-8'),'UTF-8');
  }
  else { //Исключить начало и конец
   $s1 += mb_strlen($start,'UTF-8');
   return mb_substr ($s,$s1,$s2-$s1,'UTF-8');
  }
 }
 function trimall($string) { return trim(preg_replace("/\s+/"," ",$string)); }

 $url = 'http://www.chessgames.com/perl/chessrandom?'; //URL для извлечения данных
 $startpgn = 'pgn=\''; //файл PGN
 $endpgn = '\' ratio='; 
 $startdesc = '<font face="verdana,arial,helvetica" size="+1">'; //Данные о партии
 $enddesc = '<font size="-2" face="verdana,arial,helvetica">';
 $replacements = array ( //Что на что заменять перед показом
  'href="/' => 'href="http://www.chessgames.com/'
 );
 
 $file = @file_get_contents($url);
 $string = str_replace ("\n","",process($file,$startpgn,$endpgn,false));
 $data = str_replace (array_keys($replacements),array_values($replacements), process($file,$startdesc,$enddesc,false));
 echo '
  <div align="center"><a href="randomchessgame.php">Ещё партию, пожалуйста</a></div>
  <div align="center">'.
  $data.
  '<script src="http://chesstempo.com/js/pgnyui.js"></script>   
  <script src="http://chesstempo.com/js/pgnviewer.js"></script>  
  <link type="text/css" rel="stylesheet" href="http://chesstempo.com/css/board-min.css">
  <style type="text/css">
   .ct-black-square { background-color: #b58863; }  
   .ct-white-square { background-color: #f0d9b5; } 
   .ct-board-border { border:1px solid black; }  
  </style>
  <script>
   new PgnViewer( { 
    boardName: \'board16\',
    pgnString: \''.trimall(addslashes($string)).'\',
    pieceSet: \'merida\',
    pieceSize: 46  
   }  
  );  
  </script>
  <noscript><div align="center">Извините, Javascript отключён в вашем браузере!</div></noscript>
  <div id="board16-container" style="width:400px; margin: 0 auto;"></div>
  <div id="board16-moves" style="width:400px;text-align: justify; margin: 0 auto;"></div>
  </div>'."\n";
?>

</body></html>

P.S. В итоге, они всё же сделали ответ "403 forbidden" для всех запросов без определённых GET-параметров и не по https://, так что скрипт в данном виде, должно быть, отжил своё, оставшись лишь учебным примером.

24.11.2016, 02:35 [5037 просмотров]


теги: шахматы random php

К этой статье пока нет комментариев, Ваш будет первым