Скрипт/код/база данни за кръстословица

Ticketa

Registered
Привет,
Търся някакъв примерен и работещ код за кръстословица.

Нещо подобно http://www.rabotnovreme.net/

Php, jquery, mysql предполагам се ползва.

Това е нещо подобно https://github.com/electricg/jQuery-Html5-Crossword , което търся , но не ми идват идеи как да го интегрирам с база данни ?


Може би, ако
$solution = "
RECIPROCA#IMAM#REALTA
ABATE#VASSOIO#COMFORT
YALE#DENSITA#NOT#AGIO
BNL#LESTI#A#POREC#OPM
RO#MENTORE#CARPALE#LO
A#IAGO#RICCARDOTERZO#
DANNATI#ACANZI#ATEA#C
BRENTANO#ELOISA#OMNIA
UTS#ATENE#ANATRA#ITCS
RI#PROROGA#ILARCA#ETA
Y#LEI#TROPICI#ARIE#UT
#LITANIE#REO#PSORIASI
";

Това са отговорите , а в textarea са въпросите и да се извличат , чрез random принцип от базата данни.

Тук вече въпроса е как може да се направи "автоматично" таблица с въпроси и отговори ? Т.е. да не се въвеждат думите ръчно от оператор/админ ами да се извличат от някъде ?
 
Това ми хареса като вариант

https://github.com/gstasiewicz/crossword

Някой предложения как да го направя с php/mysql? Така че всеки път да е различна кръстословица?
 
Ако имаш база данни с думи (и съответните въпроси) и искаш да генерираш кръстостловица (т.е. квадрат в който вертикално и хоризонтално са все правилни думи), то това може да се реши с constraint satisfaction problem (CSP) solver.
 
djman каза:
Ако имаш база данни с думи (и съответните въпроси) и искаш да генерираш кръстостловица (т.е. квадрат в който вертикално и хоризонтално са все правилни думи), то това може да се реши с constraint satisfaction problem (CSP) solver.

Обмислям чрез preg match и масив да сглобя кода, но не разбрах този CSP как мога да го вкарам в приложение ?
 
Написах "php generate crossword" в Гугъл и виждам десетки полезни резултати – пробвай. Моето със CSP вероятно е overkill или неоптимално решение.
Виж и тук, готово решение – https://github.com/MironowDW/Crossword
 
djman каза:
Написах "php generate crossword" в Гугъл и виждам десетки полезни резултати – пробвай. Моето със CSP вероятно е overkill или неоптимално решение.
Виж и тук, готово решение – https://github.com/MironowDW/Crossword

Да, видях го. Обаче не виждам как бих могъл да го "синхронизирам"/"адаптирам" с това: https://github.com/gstasiewicz/crossword
 
Създадох няколко таблици (прилагам кратко обяснение)
таблица word (в нея ще създам много въпроси и техните отговори , идеята е тази таблица да служи при ползване на cronjob, който ще генерира всеки месец различни кръстословици): word
с колони:
id, word(отговор), description(въпрос)


направих си таблиа cross_word (тази таблица ще служи за наличните кръстословици с вече готовите думи): cross_word

с колони:
crossword_word_id [ категория ]
crossword_id [ кръстословица № ]
word_order [ подреждане 0,1,2,3,4.... ]
word_direction [ A = хоризонтално, D = вертикално ]
word_start_cell [ откъде започва отговора 0..1...2..3...4..5.6.7..8.9 цикъл хоризонтал и вертикал с номера ]
word_text [ отговор на въпроса ]
word_clue_text [ въпроса ]
word_letter_cell [ отговора разбит на части: a:3:{i:0;s:2:"Б";i:1;s:2:"И";i:2;s:2:"Т";} ]
за тази разбивка използвам:
preg_split('//u', $word_text, -1, PREG_SPLIT_NO_EMPTY);



crossword_word_id, crossword_id, word_order, word_direction, word_start_cell, word_text, word_clue_text, word_letter_cell
1 2 1 D 0 БЪЛГАРИЯ КОРУМПИРАНА ДЪРЖАВА В ИЗТОЧНА ЕВРОПА a:8:{i:0;s:2:"Б";i:11;s:2:"Ъ";i:22;s:2:"Л";i:33;s:2:"Г";i:44;s:2:"А";i:55;s:2:"Р";i:66;s:2:"И";i:77;s:2:"Я";}
2 2 2 D 1 ИНА Наша фолк певица a:3:{i:1;s:2:"И";i:12;s:2:"Н";i:23;s:2:"А";}
3 2 3 A 0 БИТ най-малката единица за информация a:3:{i:0;s:2:"Б";i:1;s:2:"И";i:2;s:2:"Т";}


Въпроса ми сега е, как като взимам думите и въпросите от таблица WORD да ГЕНЕРИРАМ кръстословица , така че думите да съвпадат където е нужно Хоризонтално / Вертикално. Където пък е нужно да има празно място. Слагам и една цяла кръстословица.


В момента всичко работи коректно, просто искам да е автоматизирам , защото да се въвежда ръчно отнема мнного време

Генерирам квадратите по следния начин:
Код:
<?php 
$cell_index = 0;
	for($i=0;$i<11;$i++)
	{
	?>
        <tr>
		<?php 
        for($j=0;$j<11;$j++)
        {
        ?>
                <td></td>
    <?php
		$cell_index++;
        }
        ?>
        </tr>
	<?php
    }
    ?>
    </table>
 

Прикачени файлове

  • xm.png
    xm.png
    16.6 KB · Преглеждания: 252
Все още не мога да открия решение.

Някой да удари рамо?

Може би като идея..

  • Избира се какви квадрати ще има тоест - 11х11
    Избира се колко думи да бъдат максимум - 20 например
    Функция която проверява първата и последната буква от дума , за да предвиди следващата каква дума може да "влезе"
    Хубаво е да се запомня какви думи(например първите букви) са били използвани , така че да не се получава често дублиране на кръстословицата.

    Създава се цикъл , който "върти" постоянно докато "не напасне" думите.

Едит: обаче какво правим със средните букви в думата? И там може да се "вкарва" дума започваща с някоя буква


Това чудо: https://github.com/laurynas/php-crossword

Има проблем при ползването на кирилица , когато раздробява думата на отделни букви се чупи енкогнита.

За момента откривам , че проблема идва от grid class и по конкретно $this->words[$i] променливата когато се "присвоява" $i
 
По-скоро виж предложението на djman.
Коментарите по кода там са на руски, така че сигурно работи коректно и с кирилица :)

Вземи примерната употреба, и дай var_dump на $crossword, да видиш как да извлечеш информацията за редовете и колоните и в кое поле кой hint да сложиш.
Надявам се, че освен да връща клетки с букви, библиотеката ти казва и коя дума къде започва, за да знаеш къде да сложиш въпросите.
Като видиш в какъв формат ти връща информацията, вече е въпрос на натъкмяване да го обърнеш във формата, който иска javascript-ската библиотека, за да го нарисуваш на клиента.

Може да пейстнеш изхода от var_dump-а и тук, ако не се справяш с преобразуването от тамошния формат в този за клиента.
 
Нещо обаче не успявам да го подкарам с базата данни.

Код:
<?php

require_once './autoloader.php';

// List of words for crossword generation

/*
$words = array(
    'leader' => [
        'number' => 1,
        'question' => 'Input "leader"',
    ],
    'apple' => [
        'number' => 2,
        'question' => 'Input "apple"',
    ],
);*/
$mysqli = new mysqli("localhost","usee","pass","db");

// Check connection
if ($mysqli -> connect_errno) {
  echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
  exit();
}
$mysqli -> set_charset("utf8");
// Perform query
$i = 0;
$words = array();
if ($result = $mysqli -> query("SELECT * FROM wordsRRRRRR Order by id desc LIMIT 0,15")) {
  //"Returned rows are: " . $result -> num_rows;
  // Free result set
  //$result -> free_result();
  while($row = $result->fetch_assoc()) {
  $i++;
  
    $words[$row['word']]['number']     = $i;
    $words[$row['word']]['question'] = $row['question'];

  //print_r($words);
  }
}


// Create new crossword
$crossword = new \Crossword\Crossword(12, 12, $words);
$crossword->generate(\Crossword\Generate\Generate::TYPE_BASE_LINE_COLUMN, true);

// Save for check
file_put_contents(__DIR__ . '/crossword.json', json_encode($crossword->toArray(), JSON_PRETTY_PRINT));

return $crossword;


var_dump след цикъла;
Код:
array(15) {
  ["коя"]=>
  array(2) {
    ["number"]=>
    int(1)
    ["question"]=>
    string(66) "Град в Западна Гвинея, регион Киндия"
  }
  ["чипан/борис/"]=>
  array(2) {
    ["number"]=>
    int(2)
    ["question"]=>
    string(184) "Виден македонски архитект и професор в Архитектурния факултет на Скопския университет (1918-2012), Борис"
  }
  ["пезул"]=>
  array(2) {
    ["number"]=>
    int(3)
    ["question"]=>
    string(85) "Вдлъбнатина в стена за неголеми предмети; ниша"
  }
  ["казарес"]=>
  array(2) {
    ["number"]=>
    int(4)
    ["question"]=>
    string(128) "Френска драматична и киноактриса от галисийски произход (1922-1996), Мария"
  }
  ["чуфа"]=>
  array(2) {
    ["number"]=>
    int(5)
    ["question"]=>
    string(82) "Многогодишно тревисто растение (земен бадем)"
  }
  ["скрупули"]=>
  array(2) {
    ["number"]=>
    int(6)
    ["question"]=>
    string(68) "Пречка за приемане на нещо; колебание"
  }
  ["радио"]=>
  array(2) {
    ["number"]=>
    int(7)
    ["question"]=>
    string(48) "Песен на рок-група "Сигнал""
  }
  ["ойкология"]=>
  array(2) {
    ["number"]=>
    int(8)
    ["question"]=>
    string(156) "Раздел от биологията, изучаващ взаимоотношенията между организмите и околната среда"
  }
  ["центурий"]=>
  array(2) {
    ["number"]=>
    int(9)
    ["question"]=>
    string(109) "Радиоактивен химически елемент, получен по изкуствен начин"
  }
  ["каменводеничаров"]=>
  array(2) {
    ["number"]=>
    int(10)
    ["question"]=>
    string(69) "Имената на наш актьор,  "Испанска муха""
  }
  ["томарос"]=>
  array(2) {
    ["number"]=>
    int(11)
    ["question"]=>
    string(112) "Планина в югозападната част на ном Янина, обл. Тесалия, Гърция"
  }
  ["бакели"]=>
  array(2) {
    ["number"]=>
    int(12)
    ["question"]=>
    string(119) "Италиански писател и драматург (1891-1985), "Погледът на Исус", Рикардо"
  }
  ["гласе"]=>
  array(2) {
    ["number"]=>
    int(13)
    ["question"]=>
    string(38) "Лъскав копринен плат"
  }
  ["съдия"]=>
  array(2) {
    ["number"]=>
    int(14)
    ["question"]=>
    string(86) "Длъжностно лице, въздаващо правосъдие, арбитър"
  }
  ["блинд"]=>
  array(2) {
    ["number"]=>
    int(15)
    ["question"]=>
    string(44) "Термин при игра на покер"
  }
}




Сега го сравних (дали масива като структура е идентичен ) с този от оригиналния и съвпадат структурите.

Оригинала иначе си бачка, но като вкарам думите от базата данни и не работи?

Код:
<!DOCTYPE HTML>
<html>
<head>
    <title>Кроссворд</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">

    <style>
        td {
            text-align: center;
        }
        td input {
            width: 20px;
            height: 20px;
            text-align: center;
        }
    </style>
</head>
<body>
    array(2) {
  ["leader"]=>
  array(2) {
    ["number"]=>
    int(1)
    ["question"]=>
    string(14) "Input "leader""
  }
  ["apple"]=>
  array(2) {
    ["number"]=>
    int(2)
    ["question"]=>
    string(13) "Input "apple""
  }
}
<hr/>array(15) {
  ["коя"]=>
  array(2) {
    ["number"]=>
    int(1)
    ["question"]=>
    string(66) "Град в Западна Гвинея, регион Киндия"
  }
  ["чипан/борис/"]=>
  array(2) {
    ["number"]=>
    int(2)
    ["question"]=>
    string(184) "Виден македонски архитект и професор в Архитектурния факултет на Скопския университет (1918-2012), Борис"
  }
  ["пезул"]=>
  array(2) {
    ["number"]=>
    int(3)
    ["question"]=>
    string(85) "Вдлъбнатина в стена за неголеми предмети; ниша"
  }
  ["казарес"]=>
  array(2) {
    ["number"]=>
    int(4)
    ["question"]=>
    string(128) "Френска драматична и киноактриса от галисийски произход (1922-1996), Мария"
  }
  ["чуфа"]=>
  array(2) {
    ["number"]=>
    int(5)
    ["question"]=>
    string(82) "Многогодишно тревисто растение (земен бадем)"
  }
  ["скрупули"]=>
  array(2) {
    ["number"]=>
    int(6)
    ["question"]=>
    string(68) "Пречка за приемане на нещо; колебание"
  }
  ["радио"]=>
  array(2) {
    ["number"]=>
    int(7)
    ["question"]=>
    string(48) "Песен на рок-група "Сигнал""
  }
  ["ойкология"]=>
  array(2) {
    ["number"]=>
    int(8)
    ["question"]=>
    string(156) "Раздел от биологията, изучаващ взаимоотношенията между организмите и околната среда"
  }
  ["центурий"]=>
  array(2) {
    ["number"]=>
    int(9)
    ["question"]=>
    string(109) "Радиоактивен химически елемент, получен по изкуствен начин"
  }
  ["каменводеничаров"]=>
  array(2) {
    ["number"]=>
    int(10)
    ["question"]=>
    string(69) "Имената на наш актьор,  "Испанска муха""
  }
  ["томарос"]=>
  array(2) {
    ["number"]=>
    int(11)
    ["question"]=>
    string(112) "Планина в югозападната част на ном Янина, обл. Тесалия, Гърция"
  }
  ["бакели"]=>
  array(2) {
    ["number"]=>
    int(12)
    ["question"]=>
    string(119) "Италиански писател и драматург (1891-1985), "Погледът на Исус", Рикардо"
  }
  ["гласе"]=>
  array(2) {
    ["number"]=>
    int(13)
    ["question"]=>
    string(38) "Лъскав копринен плат"
  }
  ["съдия"]=>
  array(2) {
    ["number"]=>
    int(14)
    ["question"]=>
    string(86) "Длъжностно лице, въздаващо правосъдие, арбитър"
  }
  ["блинд"]=>
  array(2) {
    ["number"]=>
    int(15)
    ["question"]=>
    string(44) "Термин при игра на покер"
  }
}
 
Промених заявката да взема случаен ред , чрез RAND

if ($result = $mysqli -> query("SELECT * FROM wordsRRRRRR ORDER BY RAND() LIMIT 6")) {

По този начин давам рефреш .. докато открие "подходящи" думи. Кофтито е че с моя критерии 11х11 мога да изкарвам толкова малко думички...едва 6

Дали няма как да се измисли примерно в кръстословица да вади минимум 15 думи ?

Примерно веднага след цикла да се вкара проверка на първата дума дали е повече от 8 букви чрез mb_substr_count и така да се "предполага" че ще има повече съвпадения за следващите букви?

По дълга дума = повече букви = повече съвпадения ?

Нещо подобно:

Код:
if ($result = $mysqli -> query("SELECT * FROM wordsRRRRRR ORDER BY RAND() LIMIT 6")) {
  //"Returned rows are: " . $result -> num_rows;
  // Free result set
  //$result -> free_result();
  while($row = $result->fetch_assoc()) {

//  echo $row['question'];
  $i++;
if($i == 1) {
if(mb_substr_count($row['word']) > 9) {
    $words[$row['word']]['number']     = $i;
    $words[$row['word']]['question'] = $row['question'];

}
}  
    
  //print_r($words);
  }
}
 
Пробвах и чрез функцията LENGTH в SQL , обаче нещо не ми се получава...


Код:
<?php

require_once './autoloader.php';

// List of words for crossword generation

/*
$word = array(
    'лидер' => [
        'number' => 1,
        'question' => 'Input "лидер"',
    ],
    'галош' => [
        'number' => 2,
        'question' => 'Input "ина"',
    ],
);*/

//var_dump($word); 
//echo '<hr/>';
$mysqli = new mysqli("localhost","потр","парола","базаданни");

// Check connection
if ($mysqli -> connect_errno) {
  echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
  exit();
}
$mysqli -> set_charset("utf8");
// Perform query
$i = 0;
$words = array();
if ($result = $mysqli -> query("SELECT *, LENGTH(word) as orderby FROM wordsRRRRRR ORDER BY rand(), orderby DESC LIMIT 8")) {
  //"Returned rows are: " . $result -> num_rows;
  // Free result set
  //$result -> free_result();
  while($row = $result->fetch_assoc()) {

  // $row['word'].'('.$row['orderby'].')<br>';
  $i++;
  /*
if($i == 1) {
if(mb_substr_count($row['word']) > 9) {*/
    $words[$row['word']]['number']     = $i;
    $words[$row['word']]['question'] = $row['question'];
/*
}
}  */
    
  //print_r($words);
  }
}

//var_dump($words);
//

// Create new crossword
$crossword = new \Crossword\Crossword(12, 12, $words);
//print_r($crossword);die;
$crossword->generate(\Crossword\Generate\Generate::TYPE_BASE_LINE_COLUMN, true);

// Save for check
file_put_contents(__DIR__ . '/crossword.json', json_encode($crossword->toArray(), JSON_PRETTY_PRINT));

return $crossword
;
 
Временно решение: (ако все пак някой може да предложи нещо, което е по... оптимизирано съм отворен.

Код:
<?php
require_once './autoloader.php';

$mysqli = new mysqli("localhost","ПОТРЕБИТЕЛ","ПАРОЛА","БАЗА");

// Check connection
if ($mysqli -> connect_errno) {
  echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
  exit();
}
$mysqli -> set_charset("utf8");
// Perform query
$i = 0;
$words = array();
$len_max = 11;
$len_min = 2;
if ($result = $mysqli -> query("SELECT * FROM wordsRRRRRR WHERE LENGTH(word)<={$len_max} AND LENGTH(word)>={$len_min} ORDER BY rand() LIMIT 0, 15")) {
  while($row = $result->fetch_assoc()) {
    $i++;
    $words[$row['word']]['number']     = $i;
    $words[$row['word']]['question'] = $row['question'];
    //print_r($words);
  }

    //var_dump($words);
    // Create new crossword
    $crossword = new \Crossword\Crossword(11, 11, $words);
    //print_r($crossword);die;
    $crossword->generate(\Crossword\Generate\Generate::TYPE_RANDOM, true);
    // Save for check
    file_put_contents(__DIR__ . '/crossword.json', json_encode($crossword->toArray(), JSON_PRETTY_PRINT));
    
    return $crossword;
}

Проблема в момента е, че не всеки път генерира кръстословица (понеже не открива подходящи думи и поради тази причина е адски ограничено......)
 
На снимката съм прикачил потенциални полета (в червено) - въпроса , е че скрипта следва вече следващите думи и не се възползва от "празните" пространства.

Моля, някой да удари рамо.

Код:
<?php
require_once './autoloader.php';

$mysqli = new mysqli("localhost","ПОТРЕБИТЕЛ","ПАРОЛА","БАЗА");

// Check connection
if ($mysqli -> connect_errno) {
  echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
  exit();
}
$mysqli -> set_charset("utf8");
// Perform query
$i = 0;
$words = array();
$len_max = 11;
$len_min = 2;
if ($result = $mysqli -> query("SELECT * FROM wordsRRRRRR WHERE LENGTH(word)<={$len_max} AND LENGTH(word)>={$len_min} ORDER BY rand() LIMIT 0,10")) {
    while($row = $result->fetch_assoc()) {
        $i++;
        $words[$row['word']]['number']   = $i;
        $words[$row['word']]['question'] = $row['question'];
    }
    //var_dump($words);
    // Create new crossword
    $crossword = new \Crossword\Crossword(32, 32, $words);
    
    //var_dump($words);
    $crossword->generate(\Crossword\Generate\Generate::TYPE_RANDOM, true);
    // Save for check
    file_put_contents(__DIR__ . '/crossword.json', json_encode($crossword->toArray(), JSON_PRETTY_PRINT));

    return $crossword;
}


ЕДИТ:

След като промених в тази функция:
Код:
    protected function positionWord(Word $word)
    {
        if($this->currentLineType == Line::TYPE_ROW) {
            $line = $this->prevWord->getRows()->getRandom();
            $this->currentLineType = Line::TYPE_COLUMN;
        } else {
            $line = $this->prevWord->getColumns()->getRandom();
            $this->currentLineType = Line::TYPE_ROW;
        }

        if(!empty($line)) {
            $isPosition = $line->position($word, true); //това по подразбиране е FALSE ???
            if($isPosition) {
                $this->prevWord = $word;
            }
        }
    }

Ред:
$isPosition = $line->position($word, true); //това по подразбиране е FALSE ???

от FALSE на TRUE , започнаха да се "попълват" повече отговори/думи. Обаче, все още не е задоволително както изглежда тази:
http://www.rabotnovreme.net/ (грубо казано тук има поне 50 въпроса (което прави кръстословицата интересна), а аз едвам изваждам 10 въпроса)


Тук почти всички квадратчета са запълнени , докато при мен има доста... потенциални празни квадрати.
 

Прикачени файлове

  • potencial.png
    potencial.png
    25.3 KB · Преглеждания: 201
В клас Line.php

Когато премахна следните редове:

Код:
                // Если поле заблокировано или буква не подходит, слово нельзя расположить
                if($_field->isBlock() || (!empty($char) && $char != $newChar)) {
                    $check = false;
                    break;
                }

Скрипта започва да генерира яко думи и пълни страницата почти както ми харесва, но все още не успява да е пълни качествено с думи.

Например, при въпрос ["рас"]=> array(2) { ["number"]=> int(8) ["question"]=> string(25) "Етиопски княз"

отговора е РАС , но с премахнатия ред горе пише РРА и съответно думите не се застъпват/покриват

Лошото ,е че ако "наля я" цялата таблица (имам около 1 000 въпроса + отговори) и не може да "намери" подходящите думи за кръстословицата защото се опитва да използва всичките...хммм......


ЕДИТ: активирайте във форума ФУНЦКИЯТА ЗА ПРОМЯНА НА мнение за да не спамя само собствените си теми........
 
Опитвам и така:
Код:
<?php 
    class Board {
        private $arrBoard;
        private $arrWords;
	private $iCols;
	private $iRows;
       
        public function Board($nRows, $nCols) {
            $this->iCols = $nCols;
	    $this->iRows = $nRows;

            for ($col = 0; $col < $this->iCols; $col++) {
                for ($row = 0; $row < $this->iRows; $row++) {
                    $this->arrBoard[$row][$col] = '*';
                }

            }
        }
       
        public function visualize() {
  	    //print_r($this->arrBoard);
           
            echo "<table border='1'>";
            for ($col = 0; $col < $this->iCols; $col++) {
                echo "<tr c='$col'>";
                for ($row = 0; $row < $this->iRows; $row++) {
                    echo "<td r='$row'>" . $this->arrBoard[$row][$col]  . '</td>';
                }
                echo "</tr>";
            }
            echo "</table>";
        }
       
        private function fillRubish() {
           
        }
       
        public function assignWordList($arrList) {
            $this->arrWords = $arrList;
        }
       
        private function writeVerticalWord($sWord) {
	        #$arrWord = str_split($sWord);
            $arrWord = preg_split('//u', $sWord, 0, PREG_SPLIT_NO_EMPTY);
            echo "Vertical word: $sWord  </br>";
            $arrPos = $this->getRandPosV($sWord);
            $col = $arrPos['col']; 
            $row = $arrPos['row'];
            
            foreach ($arrWord as $sLetter) {
                $this->arrBoard[$col][$row] = $sLetter;
                $row++;

            }

        }
       
        private function writeHorizontalWord($sWord) {
            #$arrWord = str_split($sWord);
            $arrWord = preg_split('//u', $sWord, 0, PREG_SPLIT_NO_EMPTY);
            echo "Horizontal word: $sWord  </br>";
 	    $arrPos = $this->getRandPosH($sWord);		
	    $col = $arrPos['col']; $row = $arrPos['row'];


            foreach ($arrWord as $sLetter) {
		$this->arrBoard[$col][$row] = $sLetter;
	        $col++;

	    }

        }

	private function getRandPosH($sWord) {
	    $iWordLength = strlen($sWord);
	    $row = rand(0, $this->iRows-1);
            $col = rand(0, ($this->iCols-$iWordLength)-1);
	    return array('col' => $col,'row' => $row);
	}

        private function getRandPosV($sWord) {
            $iWordLength = strlen($sWord);
            $row = rand(0, ($this->iRows-$iWordLength)-1);
            $col = rand(0, $this->iCols-1);
            return array('col' => $col,'row' => $row);
        }



        public function writeWords() {

            foreach($this->arrWords as $sWord => $sArrange) {
                $i++;
                if ($sArrange == 'v') {
                    $this->writeVerticalWord($sWord);
                } else if ($sArrange == 'h') {
                    $this->writeHorizontalWord($sWord);
                }
            }
        }
    }
   

   
    $oBoard = new Board(8,8);
    $oBoard->visualize();
   
    $arrWords = array('умео' => 'h',
'ямб' => 'h',
'братан' => 'h',
'те' => 'h',
'фарар' => 'h',
'ска' => 'h',
'рус' => 'h',
'зло' => 'h',
'сиф' => 'h',
'кафка' => 'h',
'мо' => 'h',
'орисия' => 'h',
'ухо' => 'h',
'рули' => 'h',
'уотс' => 'v',
'еб' => 'v',
'орф' => 'v',
'аар' => 'v',
'ятрус' => 'v',
'маасим' => 'v',
'бнр' => 'v',
'екзарх' => 'v',
'алфио' => 'v',
'окс' => 'v',
'аир' => 'v',
'яу' => 'v',
'фони' => 'v',
'коу' => 'v',
    );
   
    $oBoard->assignWordList($arrWords);
    $oBoard->writeWords();
   
    echo '</br>================================================== </br>';
    $oBoard->visualize();

Обаче, пак не се получава
 
Eто ти две библиотека за Laravel. Можеш да се ориентираш те какво правят.

https://packagist.org/packages/dmathews/crossword
https://packagist.org/packages/mironovdv/crossword
 
dakata__92 каза:
Eто ти две библиотека за Laravel. Можеш да се ориентираш те какво правят.

https://packagist.org/packages/dmathews/crossword
https://packagist.org/packages/mironovdv/crossword

По горе (ако си прочел мненията ми) съм използвал точно втората(тя първата води към втората).

Не вършат работа защото не може да се запълни хубаво цялата кръстословица

Например при 8х8 - 64 квадрати могат да влязат 40 отговора , а с тези кодове едва до 8 отговора влизат.
 
Стигнах до следната идея, но не мога да е разлизирам. Ако някой може да помогне.

1.
Създават се шаблони (без значение дали са в база данни или просто създадени в някакъв масив)

например един шаблон изглежда така:

# % # % # % # %
% % % % % % % %
# % % % % # % %
% % % % # % % %
# % % # % % % %
% % # % % % % #
# % % % % % % #
% % % % # % # #

% - буква
# - черно/бяло/сиво все тая квадратче - празно място.

Като % буквата се заменя с дума от базата данни чрез str_replace

2. Избрания шаблон от горе, се вкарва в ? цикъл ? този цикъл избира първите 4 думи (които са на първия ред в червено съм ги маркирал)
след това по някакъв начин се избира думата (която съм е подчертал) като за да се избере думата се проверява , чрез заявка към базата данни дали всяка буква от вертикалната дума ще съвпадне с хоризонталната дума (подчертаната)

Не откривам решение и търся възможно най-добрия начин за хубава кръстословица


На пръв поглед всичко изглежда много просто и елементарно, но явно практически е доста сложно.
 

Горе