匹配字母到单词(Unity3D)
Matching letters to word(Unity3D)
我在unity里写了一个方法,但是我觉得不对。我想做的是,如果一些排序的字母与任何单词匹配,那么它会说 true。
我的意思是 10 列和 20 行的字符数组。该方法将从上到下或从左到右检查字母(如拼字游戏)。
例如字符数组 "H"、"U"、"N"、"D" 中有一个单词。这些字母将匹配,匹配的字母将在游戏中销毁,并且在 char 数组中将为空。我在下面写了这段代码但不起作用。我哪里错了?
[System.Serializable]
public class ColumnLetters
{
public string[] lettersRows = new string[20];
}
public ColumnLetters[] lettersColumns = new ColumnLetters[10];
public void CheckWord()
{
foreach (string item in answers)
{
for (int i = 0; i < lettersColumns.Length; i++)
{
for (int j = 0; j < lettersColumns[i].lettersRows.Length; j++)
{
if (item == lettersColumns[i].lettersRows[j])
{
Debug.Log("True");
}
else
{
Debug.Log("false");
}
}
}
}
}
你的算法不完整。假设您的游戏矩阵如下所示:
A B C D E
F H U N D
G H I J K
并且:
item = "HUND";
当你这样做时:
if (item == lettersColumns[i].lettersRows[j])
您只是在检查游戏矩阵中的单个字母是否等于 "HUND"。
因此,在这种情况下:
lettersColumns[0].lettersRows[0] == "A"
lettersColumns[2].lettersRows[1] == "U"
那么,您在这里进行的检查是这样的:
if ("HUND" == "A") Debug.Log("True");
if ("HUND" == "B") Debug.Log("True");
...
if ("HUND" == "H") Debug.Log("True");
if ("HUND" == "U") Debug.Log("True");
if ("HUND" == "N") Debug.Log("True");
if ("HUND" == "D") Debug.Log("True");
...
其中 none 是永远正确的。你可以做的是首先找到字母 "H" 在矩阵中的位置。再看"H"左边的位置,看有没有字母"U"。如果那里没有字母 "U",请尝试在 "H" 的右侧找到 "U"。如果您确实在 "H" 左侧找到 "U",请检查 "U" 左侧的位置是否有字母 "N" 等。对所有四个方向执行此操作。然后对矩阵中的下一个字母 "H" 执行所有这些操作。
我强烈建议阅读更多关于遍历数组和矩阵的内容,以帮助您解决这个问题。使用此方法编写解决方案后,搜索 "crossword/scrabble algorithms" 以使用搜索树获得更快的解决方案。
你可以做的很简单。
你可以有一个板子可以有的所有单词的列表。
然后,在每个字母 selection 中检查 list.Contains(currentSelection)
例子
我select H,所以我做currentSelection += H
然后我检查list.Contains(currentSelection)
?如果是,销毁
其他
I select 下一个字母 U,依此类推。
我在unity里写了一个方法,但是我觉得不对。我想做的是,如果一些排序的字母与任何单词匹配,那么它会说 true。
我的意思是 10 列和 20 行的字符数组。该方法将从上到下或从左到右检查字母(如拼字游戏)。
例如字符数组 "H"、"U"、"N"、"D" 中有一个单词。这些字母将匹配,匹配的字母将在游戏中销毁,并且在 char 数组中将为空。我在下面写了这段代码但不起作用。我哪里错了?
[System.Serializable]
public class ColumnLetters
{
public string[] lettersRows = new string[20];
}
public ColumnLetters[] lettersColumns = new ColumnLetters[10];
public void CheckWord()
{
foreach (string item in answers)
{
for (int i = 0; i < lettersColumns.Length; i++)
{
for (int j = 0; j < lettersColumns[i].lettersRows.Length; j++)
{
if (item == lettersColumns[i].lettersRows[j])
{
Debug.Log("True");
}
else
{
Debug.Log("false");
}
}
}
}
}
你的算法不完整。假设您的游戏矩阵如下所示:
A B C D E
F H U N D
G H I J K
并且:
item = "HUND";
当你这样做时:
if (item == lettersColumns[i].lettersRows[j])
您只是在检查游戏矩阵中的单个字母是否等于 "HUND"。
因此,在这种情况下:
lettersColumns[0].lettersRows[0] == "A"
lettersColumns[2].lettersRows[1] == "U"
那么,您在这里进行的检查是这样的:
if ("HUND" == "A") Debug.Log("True");
if ("HUND" == "B") Debug.Log("True");
...
if ("HUND" == "H") Debug.Log("True");
if ("HUND" == "U") Debug.Log("True");
if ("HUND" == "N") Debug.Log("True");
if ("HUND" == "D") Debug.Log("True");
...
其中 none 是永远正确的。你可以做的是首先找到字母 "H" 在矩阵中的位置。再看"H"左边的位置,看有没有字母"U"。如果那里没有字母 "U",请尝试在 "H" 的右侧找到 "U"。如果您确实在 "H" 左侧找到 "U",请检查 "U" 左侧的位置是否有字母 "N" 等。对所有四个方向执行此操作。然后对矩阵中的下一个字母 "H" 执行所有这些操作。
我强烈建议阅读更多关于遍历数组和矩阵的内容,以帮助您解决这个问题。使用此方法编写解决方案后,搜索 "crossword/scrabble algorithms" 以使用搜索树获得更快的解决方案。
你可以做的很简单。
你可以有一个板子可以有的所有单词的列表。
然后,在每个字母 selection 中检查
list.Contains(currentSelection)
例子
我select H,所以我做currentSelection += H
然后我检查list.Contains(currentSelection)
?如果是,销毁
其他
I select 下一个字母 U,依此类推。