如何在拼字游戏应用程序中搜索“空白区块”? (PHP)

时间:2009-10-16 11:47:09

标签: php mysql

几个月前我创建了这个应用程序:http://www.mondofacto.com/word-tools/scrabble-solver.html

该应用程序允许用户输入他们给出的字母集,然后回复他们可以使用的有效单词,以及他们使用这些字母获得的分数。

基本上,我想要做的是扩展应用程序,以便用户可以输入一个“空白区块” - 即可以作为字母表中26个字母中的任何一个的资格,并回显有效的单词。 / p>

以下是数据库结构的屏幕截图。

http://i37.tinypic.com/28v6a8h.png

您可能需要将该^复制到浏览器中。

当用户输入例如“aardvark”时,对此数据运行的查询如下:

SELECT * FROM scrabble WHERE a <= 3 AND b <= 0 AND c <= 0 AND d <= 1 AND e <= 0 AND f <= 0 AND g <= 0 AND h <= 0 AND i <= 0 AND j <= 0 AND k <= 1 AND l <= 0 AND m <= 0 AND n <= 0 AND o <= 0 AND p <= 0 AND q <= 0 AND r <= 2 AND s <= 0 AND t <= 0 AND u <= 0 AND v <= 1 AND w <= 0 AND x <= 0 AND y <= 0 AND z <= 0 AND length <= 8 ORDER BY scrabble DESC

如果您想查看结果,请在我在顶部发布的链接中输入一个单词。

右,

那么有人知道如何做到这一点吗?我已经开始使用以下代码,如果将空格放入(空格是空白区块),则会将每个字母字符附加到用户输入的字符串的末尾。

 if (preg_match('/[\s]/', $string)) { 

     $wild_string = $string;

     foreach (range('a','z') as $i) { 

        $wild_string = $string;
        $wild_string .= $i; 

        }

$ wild_string变量是每个字母附加到循环上的变量。通过在每个循环上将其重置为初始字符串,它会阻止代码将所有26个字母添加到输入的字符串中。

我希望有人可以提供帮助,如果我有胡扯,我很抱歉:)

安迪。

4 个答案:

答案 0 :(得分:1)

我的建议如下:

假设用户输入为:ab*其中*是通配符。计算所有已知字母和通配符并创建一个数组,其中元素0是通配符的数量,每个其他元素键是一个已知字母,其值为用户输入中给出的次数:

function GetArrayLetters($userInput) {
  ...
  // produces something like $letters = ( 0 => 1, 'a' => 1, 'b' => 1);
  return $letters;
}

使用该数组通过在每个字母和单词长度中添加通配符的数量来修改您的查询:

# with only one wildcard, the query will become:
SELECT * FROM scrabble WHERE a <= 2 AND b <= 2 AND c <= 1 ....
    ... AND length <= 3

现在将结果放在某处(数组)并依次检查每个单词。浏览每个字母,并从$ letters数组中的每个已知字母中减去一个字母;如果已知字母的值为零,则从元素0中减去(通配符)。如果您获得通配符的负值,则丢弃单词:

foreach ($result_set AS $word) {
  $letters = GetArrayLetters($userInput);
  for ($i = 0; $i < str_len($word); $i++) {
    $letter = substr($word, $i, 1);
    if ( array_key_exists( $letter, $letters )) {
      if ($letters[$letter]) > 0 {
        $letters[$letter] -= 1;
      } else {
        $letters[0] -= 1; // else subtract from the wildcard
      }
    } else {
      $letters[0] -= 1;
    }

    if ($letters[0] < 0) {
      // if wildcard falls bellow zero, discard the word
    }
  }
}

答案 1 :(得分:1)

感谢鼓励我制作自己的Word Finder! http://www.wireless-trend.com/wordfinder_index_eng.php

要搜索空白图块,我所做的是: 计算在数据库中生成单词所需的空格数。 通过用户键入的空格数限制查询。

您可以使用无限数量的空白。

“length”是我数据库中每个单词的长度 “a”是我数据库中单词中的a的编号 $word_a是用户输入的单词中的数字 $number_of_blanks是用户输入的单词中的?的数量。

SELECT * FROM $table WHERE length <= $length_of_word_searched_by_user
AND
(
  (greatest(a,$word_a)-$word_a)+
  (greatest(b,$word_b)-$word_b)+
  (greatest(c,$word_c)-$word_c)+
  ..<br>
  ..<br>
  (greatest(y,$word_y)-$word_y)+
  (greatest(z,$word_z)-$word_z)
) <= $number_of_blanks

答案 2 :(得分:0)

我能想到的唯一方法是将您的查询运行26次以上,每次将1加到不同的字母表中,加1再加上长度限制,然后删除重复项。

答案 3 :(得分:0)

如果输入为DOR *,我会使用星号标记空白磁贴并执行以下操作:

SELECT * FROM scrabble WHERE d + o + r + $number_of_wildcards >= length

如果我理解你的数据库结构正确,这应该返回门,宿舍,笨蛋,气味等。

编辑:此版本还应匹配do,rod等较短的单词。