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

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

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

Post by Ticketa » Sat Oct 17, 2020 11:30 am

Промених заявката да взема случаен ред , чрез RAND

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

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

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

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

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

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

Code: Select all

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);
  }
}

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

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

Post by Ticketa » Sat Oct 17, 2020 1:14 pm

Пробвах и чрез функцията LENGTH в SQL , обаче нещо не ми се получава...

Code: Select all

<?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
;

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

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

Post by Ticketa » Sat Oct 17, 2020 3:29 pm

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

Code: Select all

<?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;
}
Проблема в момента е, че не всеки път генерира кръстословица (понеже не открива подходящи думи и поради тази причина е адски ограничено......)

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

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

Post by Ticketa » Sat Oct 17, 2020 4:50 pm

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

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

Code: Select all

<?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;
}

ЕДИТ:

След като промених в тази функция:

Code: Select all

    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 въпроса)


Тук почти всички квадратчета са запълнени , докато при мен има доста... потенциални празни квадрати.
You do not have the required permissions to view the files attached to this post.

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

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

Post by Ticketa » Sat Oct 17, 2020 6:12 pm

В клас Line.php

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

Code: Select all

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

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

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

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


ЕДИТ: активирайте във форума ФУНЦКИЯТА ЗА ПРОМЯНА НА мнение за да не спамя само собствените си теми........

Post Reply