Скрипт/код/база данни за кръстословица
Скрипт/код/база данни за кръстословица
Привет,
Търся някакъв примерен и работещ код за кръстословица.
Нещо подобно 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 принцип от базата данни.
Тук вече въпроса е как може да се направи "автоматично" таблица с въпроси и отговори ? Т.е. да не се въвеждат думите ръчно от оператор/админ ами да се извличат от някъде ?
Търся някакъв примерен и работещ код за кръстословица.
Нещо подобно 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 принцип от базата данни.
Тук вече въпроса е как може да се направи "автоматично" таблица с въпроси и отговори ? Т.е. да не се въвеждат думите ръчно от оператор/админ ами да се извличат от някъде ?
Re: Скрипт/код/база данни за кръстословица
Това ми хареса като вариант
https://github.com/gstasiewicz/crossword
Някой предложения как да го направя с php/mysql? Така че всеки път да е различна кръстословица?
https://github.com/gstasiewicz/crossword
Някой предложения как да го направя с php/mysql? Така че всеки път да е различна кръстословица?
Re: Скрипт/код/база данни за кръстословица
Ако имаш база данни с думи (и съответните въпроси) и искаш да генерираш кръстостловица (т.е. квадрат в който вертикално и хоризонтално са все правилни думи), то това може да се реши с constraint satisfaction problem (CSP) solver.
Re: Скрипт/код/база данни за кръстословица
Обмислям чрез preg match и масив да сглобя кода, но не разбрах този CSP как мога да го вкарам в приложение ?
Re: Скрипт/код/база данни за кръстословица
Написах "php generate crossword" в Гугъл и виждам десетки полезни резултати – пробвай. Моето със CSP вероятно е overkill или неоптимално решение.
Виж и тук, готово решение – https://github.com/MironowDW/Crossword
Виж и тук, готово решение – https://github.com/MironowDW/Crossword
Re: Скрипт/код/база данни за кръстословица
Да, видях го. Обаче не виждам как бих могъл да го "синхронизирам"/"адаптирам" с това: https://github.com/gstasiewicz/crossworddjman wrote: ↑Sat Oct 10, 2020 5:06 pmНаписах "php generate crossword" в Гугъл и виждам десетки полезни резултати – пробвай. Моето със CSP вероятно е overkill или неоптимално решение.
Виж и тук, готово решение – https://github.com/MironowDW/Crossword
Re: Скрипт/код/база данни за кръстословица
Създадох няколко таблици (прилагам кратко обяснение)
таблица 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 да ГЕНЕРИРАМ кръстословица , така че думите да съвпадат където е нужно Хоризонтално / Вертикално. Където пък е нужно да има празно място. Слагам и една цяла кръстословица.
В момента всичко работи коректно, просто искам да е автоматизирам , защото да се въвежда ръчно отнема мнного време
Генерирам квадратите по следния начин:
таблица 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 да ГЕНЕРИРАМ кръстословица , така че думите да съвпадат където е нужно Хоризонтално / Вертикално. Където пък е нужно да има празно място. Слагам и една цяла кръстословица.
В момента всичко работи коректно, просто искам да е автоматизирам , защото да се въвежда ръчно отнема мнного време
Генерирам квадратите по следния начин:
Code: Select all
<?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>
You do not have the required permissions to view the files attached to this post.
Re: Скрипт/код/база данни за кръстословица
Все още не мога да открия решение.
Някой да удари рамо?
Може би като идея..
Това чудо: https://github.com/laurynas/php-crossword
Има проблем при ползването на кирилица , когато раздробява думата на отделни букви се чупи енкогнита.
За момента откривам , че проблема идва от grid class и по конкретно $this->words[$i] променливата когато се "присвоява" $i
Някой да удари рамо?
Може би като идея..
- Избира се какви квадрати ще има тоест - 11х11
Избира се колко думи да бъдат максимум - 20 например
Функция която проверява първата и последната буква от дума , за да предвиди следващата каква дума може да "влезе"
Хубаво е да се запомня какви думи(например първите букви) са били използвани , така че да не се получава често дублиране на кръстословицата.
Създава се цикъл , който "върти" постоянно докато "не напасне" думите.
Това чудо: https://github.com/laurynas/php-crossword
Има проблем при ползването на кирилица , когато раздробява думата на отделни букви се чупи енкогнита.
За момента откривам , че проблема идва от grid class и по конкретно $this->words[$i] променливата когато се "присвоява" $i
- anonimen
- Web-tourist
- Posts: 1607
- Joined: Mon Jun 11, 2012 6:07 pm
- Location: Parse error: unexpected "}" in /home/index.php on line 26
Re: Скрипт/код/база данни за кръстословица
По-скоро виж предложението на djman.
Коментарите по кода там са на руски, така че сигурно работи коректно и с кирилица
Вземи примерната употреба, и дай var_dump на $crossword, да видиш как да извлечеш информацията за редовете и колоните и в кое поле кой hint да сложиш.
Надявам се, че освен да връща клетки с букви, библиотеката ти казва и коя дума къде започва, за да знаеш къде да сложиш въпросите.
Като видиш в какъв формат ти връща информацията, вече е въпрос на натъкмяване да го обърнеш във формата, който иска javascript-ската библиотека, за да го нарисуваш на клиента.
Може да пейстнеш изхода от var_dump-а и тук, ако не се справяш с преобразуването от тамошния формат в този за клиента.
Коментарите по кода там са на руски, така че сигурно работи коректно и с кирилица

Вземи примерната употреба, и дай var_dump на $crossword, да видиш как да извлечеш информацията за редовете и колоните и в кое поле кой hint да сложиш.
Надявам се, че освен да връща клетки с букви, библиотеката ти казва и коя дума къде започва, за да знаеш къде да сложиш въпросите.
Като видиш в какъв формат ти връща информацията, вече е въпрос на натъкмяване да го обърнеш във формата, който иска javascript-ската библиотека, за да го нарисуваш на клиента.
Може да пейстнеш изхода от var_dump-а и тук, ако не се справяш с преобразуването от тамошния формат в този за клиента.
Re: Скрипт/код/база данни за кръстословица
Нещо обаче не успявам да го подкарам с базата данни.
var_dump след цикъла;
Сега го сравних (дали масива като структура е идентичен ) с този от оригиналния и съвпадат структурите.
Оригинала иначе си бачка, но като вкарам думите от базата данни и не работи?
Code: Select all
<?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 след цикъла;
Code: Select all
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) "Термин при игра на покер"
}
}
Сега го сравних (дали масива като структура е идентичен ) с този от оригиналния и съвпадат структурите.
Оригинала иначе си бачка, но като вкарам думите от базата данни и не работи?
Code: Select all
<!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) "Термин при игра на покер"
}
}