几个月前我创建了这个应用程序:http://www.mondofacto.com/word-tools/scrabble-solver.html
该应用程序让用户输入给定的一组字母,然后回显他们可以使用的有效单词,以及他们使用这些字母将获得的分数。
基本上,我想做的是扩展应用程序,以便用户可以输入一个“空白图 block ”——它可以是字母表中 26 个字母中的任何一个,并回显有效的单词。
下面是数据库结构的截图。
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
如果您想查看结果,请在我发布在顶部的链接中输入一个词。
没错,
那么有人知道如何处理吗?我从以下代码开始,如果用户输入空格(空格是空白 block ),它将每个字母字符附加到用户输入的字符串的末尾。
if (preg_match('/[\s]/', $string)) {
$wild_string = $string;
foreach (range('a','z') as $i) {
$wild_string = $string;
$wild_string .= $i;
}
$wild_string 变量是每个字母附加到循环中的变量。通过在每个循环中将其重置为初始字符串,它会阻止代码将所有 26 个字母添加到输入的字符串中。
我希望有人能提供帮助,如果我胡说八道,抱歉:)
安迪。
最佳答案
我的建议如下:
假设用户输入是: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
}
}
}
关于php - 如何在拼字游戏应用程序中搜索 'blank tile'? (PHP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1577597/