String 优化文字游戏分析程序

String 优化文字游戏分析程序,string,algorithm,String,Algorithm,我是speedrunning社区的一员,参与了一款名为《书虫历险记》的电脑游戏。我已经编写了一些实用程序来帮助人们学习/练习游戏。目前我正试图写一些可以 分析游戏状态以确定最佳游戏,类似于为拼字游戏玩家提供的实用程序 游戏的棋盘是一块4x4平方的瓷砖。播放一个单词会从板上删除这些字母块,并用随机生成的字母块替换它们,最多4个相同的字母块。“曲”作为一块瓷砖一起存在。(为了简化这一点,我将单词列表中的所有Qu替换为Q)我不知道每个字母的官方概率,但我已经通过实验对它们进行了近似 游戏的字典作为链接

我是speedrunning社区的一员,参与了一款名为《书虫历险记》的电脑游戏。我已经编写了一些实用程序来帮助人们学习/练习游戏。目前我正试图写一些可以 分析游戏状态以确定最佳游戏,类似于为拼字游戏玩家提供的实用程序

游戏的棋盘是一块4x4平方的瓷砖。播放一个单词会从板上删除这些字母块,并用随机生成的字母块替换它们,最多4个相同的字母块。“曲”作为一块瓷砖一起存在。(为了简化这一点,我将单词列表中的所有Qu替换为Q)我不知道每个字母的官方概率,但我已经通过实验对它们进行了近似

游戏的字典作为链接节点树加载到内存中。这样做,我可以很快收集一个有效的单词列表,足以杀死当前的敌人。但是,在这些有效的单词中,我想评估哪一个留下了最好的字母

我现在的方法是,它根据这些剩余字母生成许多随机棋盘状态,总结每个棋盘的最佳得分,并返回平均值

所以我现在的流程是这样的:

struct word{
 string name;  // The word itself
 string leave; // The letters left behind ('?' for blank spaces)
};

vector<word> words;
// Dump all valid plays into words
int size = words.size();

for (int i=0; i<size; i++)
{
 word curWord = words[i];
 cout << curWord.name << ": " << leaveValue(curWord.leave);
}
struct-word{
字符串名称;//单词本身
string leave;//留下的字母(“?”表示空格)
};
向量词;
//将所有有效剧本转储为文字
int size=words.size();

对于(int i=0;i首先扫描整个词典,以查找可由
leave
中的字母组成的最高值单词

let minVal = highest value word in dictionary that can be formed by 'leave'

现在我们又查字典,但只考虑值大于<代码> MIVAL < /代码>的单词。从中我们确定所有单词的加权概率。

let numBlanks = 16 - length(leave)
sum_pv = 0

for word in dictionary
    if value(word) > minVal
        let letters = remove from word all letters in leave
        assert(letters not empty) // else its value <= minVal
        let p = probability(letters, numBlanks)
        let v = value(word)
        sum_pv += p*v
这里真正的诀窍是计算
概率(字母,n)
,它根据游戏中角色的概率分布计算出
n
空格可以获得所有剩余字母的概率。这类似于处理长度
的特定“扑克手”(字母)
一组
n
卡中的卡(允许重复)


如果我的思路不对,我现在就到此为止。我应该注意,如果字典真的很大,那么你的蒙特卡罗算法可能更可取。

棋盘是由随机放置的字母组成的NxN网格,玩家可以从这些字母的某个子集中生成一个单词吗?如果是,这些字母是用来生成单词的吗n删除,然后随机替换为新字母?对棋盘和游戏性进行更简洁的定义会很有帮助,而且一个构造良好的示例也会有所帮助。如果在内部对棋盘进行排序,使字母以某种系统化的方式排列,您可能能够以更系统的方式对搜索进行排序。“然而,为了得到可靠的结果,我似乎每个字至少需要10万个模拟人生(可能甚至100万个)。"什么是可靠的结果?您可以迭代整个字典,根据剩余单词和可能剩余字母的分布计算每个单词出现的概率,而不是创建随机板。然后,概率将被用作每个单词值的权重。这一结果将是权重pBTW,你的问题是语言不可知的,使用C++标签可能不合适。问题是,当所有的可能单词都被平均化到平均值时,这是一个加权平均值,如果它是黑板上最好的单词,换句话说,对于一个给定单词NE来说,我需要的概率。EDS是我得到那个词的概率,而且我没有得到比它更好的词。“Dugunue加权平均值给了你期望的值(我只考虑大于保证值的单词)。因为我们不知道新的瓦片会随机生成,所以没有办法知道最大单词是什么——我想你的蒙特卡罗方法会在极限中产生相同的值。我会再考虑一下。“Dugunu如果你想从代码中找到最高的得分,离开< /代码>,那么简单地查字典并考虑。从剩余字母和所有可能的空白值中可以找到的每一个单词。跟踪遇到的最高值。当然,发生这种情况的概率将非常低(因此对于游戏来说似乎是无用的)。
let numBlanks = 16 - length(leave)
sum_pv = 0

for word in dictionary
    if value(word) > minVal
        let letters = remove from word all letters in leave
        assert(letters not empty) // else its value <= minVal
        let p = probability(letters, numBlanks)
        let v = value(word)
        sum_pv += p*v
leaveValue = max(minValue, sum_pv)