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

Готови за използване кодове
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 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: 571
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: 571
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: 571
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: 571
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 въпроса + отговори) и не може да "намери" подходящите думи за кръстословицата защото се опитва да използва всичките...хммм......


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

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

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

Post by Ticketa » Tue Oct 20, 2020 5:18 pm

Някой ?

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 22, 2020 4:56 pm

Опитвам и така:

Code: Select all

<?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();
Обаче, пак не се получава

User avatar
dakata__92
Web-tourist
Web-tourist
Posts: 3335
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 127

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

Post by dakata__92 » Fri Oct 23, 2020 11:58 am

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

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

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 23, 2020 3:15 pm

dakata__92 wrote:
Fri Oct 23, 2020 11:58 am
Eто ти две библиотека за Laravel. Можеш да се ориентираш те какво правят.

https://packagist.org/packages/dmathews/crossword
https://packagist.org/packages/mironovdv/crossword
По горе (ако си прочел мненията ми) съм използвал точно втората(тя първата води към втората).

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

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

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 29, 2020 8:09 pm

Стигнах до следната идея, но не мога да е разлизирам. Ако някой може да помогне.

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

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

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

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

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

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

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


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

Post Reply