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

Готови за използване кодове
User avatar
Ticketa
Турист
Турист
Posts: 571
Joined: Mon Feb 27, 2012 1:54 pm
Answers: 24
Location: in /root
Contact:

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

Post by Ticketa » Wed Oct 07, 2020 1:22 pm

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

Нещо подобно 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 принцип от базата данни.

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

User avatar
Ticketa
Турист
Турист
Posts: 571
Joined: Mon Feb 27, 2012 1:54 pm
Answers: 24
Location: in /root
Contact:

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

Post by Ticketa » Thu Oct 08, 2020 10:16 am

Това ми хареса като вариант

https://github.com/gstasiewicz/crossword

Някой предложения как да го направя с php/mysql? Така че всеки път да е различна кръстословица?

User avatar
djman
Гуру
Гуру
Posts: 2812
Joined: Sat Sep 12, 2009 8:07 am
Answers: 108

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

Post by djman » Thu Oct 08, 2020 2:00 pm

Ако имаш база данни с думи (и съответните въпроси) и искаш да генерираш кръстостловица (т.е. квадрат в който вертикално и хоризонтално са все правилни думи), то това може да се реши с constraint satisfaction problem (CSP) solver.

User avatar
Ticketa
Турист
Турист
Posts: 571
Joined: Mon Feb 27, 2012 1:54 pm
Answers: 24
Location: in /root
Contact:

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

Post by Ticketa » Fri Oct 09, 2020 3:01 pm

djman wrote:
Thu Oct 08, 2020 2:00 pm
Ако имаш база данни с думи (и съответните въпроси) и искаш да генерираш кръстостловица (т.е. квадрат в който вертикално и хоризонтално са все правилни думи), то това може да се реши с constraint satisfaction problem (CSP) solver.
Обмислям чрез preg match и масив да сглобя кода, но не разбрах този CSP как мога да го вкарам в приложение ?

User avatar
djman
Гуру
Гуру
Posts: 2812
Joined: Sat Sep 12, 2009 8:07 am
Answers: 108

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

Post by djman » Sat Oct 10, 2020 5:06 pm

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

User avatar
Ticketa
Турист
Турист
Posts: 571
Joined: Mon Feb 27, 2012 1:54 pm
Answers: 24
Location: in /root
Contact:

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

Post by Ticketa » Sat Oct 10, 2020 6:23 pm

djman wrote:
Sat Oct 10, 2020 5:06 pm
Написах "php generate crossword" в Гугъл и виждам десетки полезни резултати – пробвай. Моето със CSP вероятно е overkill или неоптимално решение.
Виж и тук, готово решение – https://github.com/MironowDW/Crossword
Да, видях го. Обаче не виждам как бих могъл да го "синхронизирам"/"адаптирам" с това: https://github.com/gstasiewicz/crossword

User avatar
Ticketa
Турист
Турист
Posts: 571
Joined: Mon Feb 27, 2012 1:54 pm
Answers: 24
Location: in /root
Contact:

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

Post by Ticketa » Sun Oct 11, 2020 2:52 pm

Създадох няколко таблици (прилагам кратко обяснение)
таблица 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.

User avatar
Ticketa
Турист
Турист
Posts: 571
Joined: Mon Feb 27, 2012 1:54 pm
Answers: 24
Location: in /root
Contact:

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

Post by Ticketa » Fri Oct 16, 2020 7:12 am

Все още не мога да открия решение.

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

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

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


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

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

За момента откривам , че проблема идва от grid class и по конкретно $this->words[$i] променливата когато се "присвоява" $i

User avatar
anonimen
Web-tourist
Web-tourist
Posts: 1600
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 165
Location: Parse error: unexpected "}" in /home/index.php on line 26

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

Post by anonimen » Fri Oct 16, 2020 6:49 pm

По-скоро виж предложението на djman.
Коментарите по кода там са на руски, така че сигурно работи коректно и с кирилица :)

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

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

User avatar
Ticketa
Турист
Турист
Posts: 571
Joined: Mon Feb 27, 2012 1:54 pm
Answers: 24
Location: in /root
Contact:

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

Post by Ticketa » Sat Oct 17, 2020 10:49 am

Нещо обаче не успявам да го подкарам с базата данни.

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) "Термин при игра на покер"
  }
}

Post Reply