<!DOCTYPE html>
<html>
<head>
<title>Word Find</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<?
//поиск слов
//Генерирует головоломку для поиска слов на основе списка слов
//введенных пользователем
//пользователь также может задать размер головоломки
$wordList = $_POST['wordList'];
$width = $_POST['width'];
$height = $_POST['height'];
$name = $_POST['name'];
//create
$word = array("ANDY","HEATHER","LIZ","MATT","JACOB"); $boardData = array('width'=>$width,'height'=>$height,'name'=>$name); //пытаемся получить список слов из полученных данных
if (parseList($word, $wordList, $boardData)==TRUE){
$legalBoard = FALSE;
//продолжаем пытаться построить поле до удачного результата
while ($legalBoard == FALSE){
clearBoard($boardData, $board);
$legalBoard = fillBoard();
}//end while
//создаем решение
$key = $board;
$keyPuzzle = makeboard($key);
//создаем окончательную головоломку
addFoils();
$puzzle=makeBoard($board);
//выводит страницу результатов
printPuzzle();
}//if для проанализированного списка
}//if для проверки существоввания списка
function parseList(){
global $word, $wordList, $boardData;
//получает список слов, создает из него массив или возвращает false если это невозможно
$itWorked = TRUE;
//переведем весь список слов
//разделим список слов на массив
foreach ($word as $currentWord){
//уберем хвостовые символы новой строки
$currentWord = rtrim($currentWord); //остановимся если какое то из слов слишком длинное для головоломки
if ((strlen($currentWord) > $boardData['width']) && (strlen($currentWord) > $boardData['height'])){ print "$currentWord is too long for puzzle";
$itWorked = FALSE;
}//if
}//foreach
return $itWorked;
}//parseList
function clearBoard(){
//создадим поле с точкой (.) в каждой ячейке
global $boardData,$board;
for ($row=0;$row<$boardData['height'];$row++){
for ($col=0;$col<$boardData['width'];$col++){
$board[$row][$col] = ".";
}
}
}
function fillBoard(){
//заполнить поле вызывая функцию аддворд для каждого слова списка или вернуть фолс в случе неудачи
global $word;
$direction = array("N","S","E","W"); $itWorked = TRUE;
$counter = 0;
$keepGoing = TRUE;
while($keepGoing){
$result = addWord($word[$counter],$direction[$dir]);
if ($result==FALSE){
//print "failed top place $word[$counter]";
$keepGoing=FALSE;
$itWorked=FALSE;
}//end if
$counter++;
if ($counter >= count($word)){ $keepGoing=FALSE;
}//end if
}
}//fillBoard
function addWord($theWord,$dir){
//попытаемся добавить слово на поле или вернем false если попытка неудалась
global $board, $boardData;
//удалим замыкающиеся символы
$itWorked=TRUE;
switch ($dir){
case "E":
//колонки от 0 до ширины поля-ширина слова
//строки от 0 до высоты поля
$newCol = rand(0
, $boardData['width']-1
-strlen($theWord)); $newRow = rand(0
,$boardData['height']-1
); for ($i=0;$i<strlen($theWord);$i++){
$boardLetter=$board[$newRow][$newCol+$i];
$wordLetter=substr($theWord,$i,1
); //проверяем свободно ли значение текущей ячейки поля
if (($boardLetter==$wordLetter)||($boardLetter==".")){
$board[$newRow][$newCol+$i]=$wordLetter;
} else {
$itWorked = FALSE;
}//if
}//for
break;
case "W":
//колонка от ширины слова до ширины поля
//строка от 0 до высоты поля
$newCol=rand(strlen($theWord),$boardData['width']-1
); $newRow=rand(0
,$boardData['height']-1
); //print "west \tRow $newRow\tCol: $newCol<br>\n";
for ($i=0;$i<strlen($theWord);$i++){
//проверим можно ли продвинуться //-i пием справа налево
$boardLetter = $board[$newRow][$newCol-$i];
$wordLetter=substr($theWord,$i,1
); if (($boardLetter == $wordLetter)|| ($boardLetter==".")){
$board[$newRow][$newCol-$i]=$wordLetter;
} else {
$itWorked=FALSE;
}//if
}//for
break;
case "S":
//колонка от 0 до ширины поля
//строка от 0 до высоты поля-длина слова
$newCol=rand(0
, $boardData['width']-1
); $newRow=rand(0
, $boardData['height']-1
-strlen($theWord)); //print "south \tRow.$newRow\tCol $newCol<br>\n;
for ($i=0;$i<strlen($theWord);$i++){
//проверим можно ли продвинуться
$boardLetter = $board[$newRow+$i][$newCol];
$wordLetter = substr($theWord,$i,1
); if (($boardLetter == $wordLetter)||($boardLetter=".")){
$board[$newRow+$i][$newCol]=$wordLetter;
} else {
$itWorked = FALSE;
}//завершение if
}//for
break;
case "N":
//колонка от 0 до ширины поля
//строка от длины слова до высоты поля
$newCol = rand(0
,$boardData['width']-1
); $newRow = rand(strlen($theWord), $boardData['height']-1
); for ($i=0;$i<strlen($theWord);$i++){
$boardLetter=$board[$newRow-$i][$newCol];
$wordLetter=substr($theWord,$i,1
); if (($boardLetter==$wordLetter)||($boardLetter == ".")) {
$board[$newRow-$i][$newCol]=$wordLetter;
} else {
$itWorked=FALSE;
}//if
}//for
break;
}//switch
return $itWorked;
}//addWord
function makeBoard($theBoard){
global $boardData;
$puzzle="";
$puzzle .= "<table border=0>\n";
for ($row=0;$row<$boardData['height'];$row++){
$puzzle .= "<tr>\n";
for ($row=0;$row<$boardData['height'];$row++){
$puzzle .= " <td width = 15>{$theBoard[$row][$col]}</td>\n";
}//end col for loop
$puzzle .= "</tr>\n";
}//for row
$puzzle .= "</table>\n";
return $puzzle;
}//end printBoard
function addFoils(){
//добавить случайные символы на доску
global $board, $boardData;
for ($row=0;$row<$boardData['height'];$row++){
for ($col=0;$col<$boardData['width'];$col++){
if ($board[$row][$col]== "."){
$newLetter = rand(65
,90
); $board[$row][$col] = chr($newLetter); }//if
}//col
}//row if
}//addFoils
function printPuzzle(){
//отобразить страницу содержащую головоломку пользоваетелю
global $puzzle, $word, $keyPuzzle, $boardData;
//отобразить головоломку
print <<<HERE
<center>
<h1>{$boardData['name']}</h1>
$puzzle
<h3>WordList</h3>
<table border=0>
HERE;
//отобразить список слов
foreach ($word as $theWord){
print "<tr><td>$theWord</td></tr>\n";
}//end foreach
print "</table>\n";
$puzzleName = $boardData["name"];
//отобразить форму ключа ответа
//послать ключ ответа по этой форме
print <<<HERE
<br><br><br><br><br><br><br><br>
<form action = "wordFindKey.php" method="post">
<input type="hidden" name="key" value="$keyPuzzle">
<input type="hidden" name="puzzleName" value="$puzzleName">
<input type"submit value="show answer key">
</form>
</center>
HERE;
}//printPuzzle
?>
</body>
</html>