Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [PHP]Программа, производящая пазлы поиска слов. 
V
    Опции темы
bogdach
Дата 10.10.2007, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 26.3.2007

Репутация: нет
Всего: нет



Здесь 3 файла. 
Задача, добавить возможность использовать диагонали, чтобы слова прятались не только вдоль и поперёк, а и по диагоналям.
wordFind.html
Код

<html>
<head>
       <title>Word Puzzle Maker</title>
</head>
<body>
<center>
<h1>Word Puzzle Maker</h1>
<form action = "wordFind.php"
      method = "post">
<h3>Puzzle Name</h3>
<input type = "text"
       name = "name"
       value = "My Word Find">
height: <input type = "text"
             name = "height"
             value = "10"
             size = "5">
width: <input type = "text"
             name = "width"
             value = "10"
             size = "5">
<br><br>
<h3>Word List</h3>
<textarea rows=10 cols=60 name = "wordList"></textarea>
<br><br>
Please enter one word per row, no spaces
<br>
<input type="submit" value="make puzzle">
</form>
</center>
</body>
</html>

wordFind.php
Код

<html>
<head>
<title>
Word Find
</title>
</head>
<body>
<?
$name = $_POST['name'];
$height = $_POST['height'];
$width = $_POST['width'];
$wordList = $_POST['wordList'];
//check for a word list
if (!isset($wordList)){
  //сделайте пазл по умолчанию
  $word = array(
    "ANDY",
    "HEATHER",
    "LIZ",
    "MATT",
    "JACOB"
    );
  $boardData = array(
    width => 10,
    height => 10,
    name => "Generic Puzzle"
  );
} else {
  //получаем данные пазла из HTML формы
  $boardData = array(
    width => $width,
    height => $height,
    name => $name
  );
  //пробуем получить список слов из пользовательского ввода
  if (parseList() == TRUE){
    $legalBoard = FALSE;
    //продолжаем пробовать строить таблицу, пока не получим подходящий результат
    while ($legalBoard == FALSE){
      clearBoard();
      $legalBoard = fillBoard();
    } // конец цикла
    //делаем ключ ответа
    $key = $board;
    $keyPuzzle = makeBoard($key);
    //делаем пазл
    addFoils();
    $puzzle = makeBoard($board);
    //выводим результат на страницу
    printPuzzle();
  } // конец if
} // конец if
function parseList(){
  //получаем список слов, и создаем из этого множество слов
  //или возвращаем, FALSE если невозможно
  global $word, $wordList, $boardData;
  $itWorked = TRUE;
  //полностью преобразовываем список слов в прописной регистр
  $wordList = strtoupper($wordList);
  //делим список слов на массивы
  $word = split("\n", $wordList);
  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 $board, $boardData;
  for ($row = 0; $row < $boardData["height"]; $row++){
    for ($col = 0; $col < $boardData["width"]; $col++){
      $board[$row][$col] = ".";
    } // конец цикла
  } // конец цикла
} // конец функции clearBoard
function addWord($theWord, $dir){
  //попытка добавлять слово в таблицу или возвращаем, FALSE если не удалось
  global $board, $boardData;
  //устраненяем перемещение символов в случае необходимости
  $theWord = rtrim($theWord);
  $itWorked = TRUE;
  switch ($dir){
    case "E":
      //расширяем колонки до ширины слов
      //и ряды до высоты слов
      $newCol = rand(0, $boardData["width"] - 1 - strlen($theWord));
      $newRow = rand(0, $boardData["height"]-1);
      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
      } // конец цикла
      break;
    case "W":
      //колонки от длинны слов до ширины таблицы
      //ряды от 0 до высоты таблицы
      $newCol = rand(strlen($theWord), $boardData["width"] -1); 
      $newRow = rand(0, $boardData["height"]-1);
      //выводим "west:\tRow: $newRow\tCol: $newCol<br>\n";
      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
      } // конец цикла
      break;
    case "S":
      //колонки от 0 до ширины таблицы
      //ряды от 0 до высоты таблицы - длины слов
      $newCol = rand(0, $boardData["width"] -1);
      $newRow = rand(0, $boardData["height"]-1 - strlen($theWord));
      //выводим "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
      } // конец цикла
      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
      } // конец цикла
      break;
  } // конец switch
  return $itWorked;
} // конец функции addWord
function fillBoard(){
  //заполняем таблицу списком посредством функции addWord() для каждого слова
  //или возвращаем, FALSE если не удалось
  global $word;
  $direction = array("N", "S", "E", "W");
  $itWorked = TRUE;
  $counter = 0;
  $keepGoing = TRUE;
  while($keepGoing){
    $dir = rand(0, 3);
    $result = addWord($word[$counter], $direction[$dir]);
    if ($result == FALSE){
      //выводим "failed to place $word[$counter]";
      $keepGoing = FALSE;
      $itWorked = FALSE;
    } // конец if
    $counter++;
    if ($counter >= count($word)){
      $keepGoing = FALSE;
    } // конец if
  } // конец цикла
  return $itWorked;
} // конец функции fillBoard
function makeBoard($theBoard){
  //выводим HTML таблицу основанную на массиве
  global $boardData;
  $puzzle = "";
  $puzzle .= "<table border = 0>\n";
  //проверка логичности
  for ($row = 0; $row < $boardData["height"]; $row++){
    $puzzle .= "<tr>\n";
    for ($col = 0; $col < $boardData["width"]; $col++){
      $puzzle .= "  <td width = 15>{$theBoard[$row][$col]}</td>\n";
    } // конец цыкла колонок
    $puzzle .= "</tr>\n";
  } // конец цыкла рядов
  $puzzle .= "</table>\n";
  return $puzzle;
} // конец функции 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
    } // конец цыкла колонок
  } // конец цыкла рядов
} // конец функции addFoils
function printPuzzle(){
  //выводим пазл на страницу пользователя
  global $puzzle, $word, $keyPuzzle, $boardData;
  //выводим пазл непосредственно
  print <<<HERE
  <center>
  <h1>{$boardData["name"]}</h1>
  $puzzle
  <h3>Word List</h3>
  <table border = 0>
HERE;
  //выводим список слов
  foreach ($word as $theWord){
    print "<tr><td>$theWord</td></tr>\n";
  } // конец 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>

wordFindKey.php
Код

<html>
<head>
<title>Word Find Answer Key</title>
</head>
<body>
<?
//ключ ответа вызванный из wordFind.php
$puzzleName = $_POST['puzzleName'];
$key = $_POST['key'];
print <<<HERE
<center>
<h1>$puzzleName Answer key</h1>
$key
</center>
HERE;
?>
</body>
</html>

PM MAIL   Вверх
bogdach
Дата 12.10.2007, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 26.3.2007

Репутация: нет
Всего: нет



Единственный файл, в который нужно вносить изменения, это wordFind.php, итак работаем с этим файлом. 

В функции fillBoard() в массив нужно добавить 4 новых значения $direction = array("N", "S", "E", "W","NS","SE","EW","WN"); Тогда переменная $dir может иметь 8 значений, меняем $dir = rand(0, 3); на $dir = rand(0, 7);

А теперь переходим к switch ($dir). Соответственно здесь нужно добавить 4 новых case
     case "EW":

      break;

    case "WN":

      break;

    case "SE":

      break;

    case "NS":

      break;

Похоже, что в 4 старых кейсах менялись только две строки, перед циклом for.

Итак, вся задача сводится к этим двум строкам.
Помогите хотя бы с одним кейсом, а дальше я как ни будь сообразю smile 
PM MAIL   Вверх
bogdach
Дата 13.10.2007, 04:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 26.3.2007

Репутация: нет
Всего: нет



Извиняюсь, я немножко напутал, 4 новых значения $direction должны быть не "NS","SE","EW","WN" а "NE","ES","SW","WN"
Как я понял в каждом из четырёх новых кейсов нужно объединять 2 старых кейса. 
Например, если в кейсах N и E это выглядит так  
Код

case "N":
      $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;
       }
      }
      break;
    case "E":
      $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;
        }
      }
      break;

то в кейсе "NE" это будет выглядит так
Код

     case "NE":
      $newCol = rand(0, $boardData["width"] - 1 - strlen($theWord));
      $newRow = rand(strlen($theWord), $boardData["height"]-1);

      for ($i = 0; $i < strlen($theWord); $i++){
        $boardLetter = $board[$newRow - $i][$newCol + $i];
        $wordLetter = substr($theWord, $i, 1);

        if (($boardLetter == $wordLetter) ||
            ($boardLetter == ".")){
          $board[$newRow - $i][$newCol + $i] = $wordLetter;
       } else {
         $itWorked = FALSE;
       }
      }
      break;


Добавлено через 7 минут и 44 секунды
Всё, теперь работает. Все кто помагал молодцы. smile 

Это сообщение отредактировал(а) bogdach - 13.10.2007, 04:19
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0449 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.