收集游戏数据时优化和减少冗余信息

时间:2018-04-09 16:39:56

标签: c++ optimization vector artificial-intelligence

我正在为纸牌游戏Spit开发一个聪明的AI对手,其中一个必要的组成部分是它可以识别它可以连续播放的所有可用卡片组合。 人工智能有5个堆可以玩牌,如果牌的价值比前一个大一个或一个,则可以连续玩牌。

可以连续播放的卡片存储在Relationship类中,然后将其存储在矢量中。这通常不会太麻烦,但是在Spit中,玩家可以将相同值的牌叠加在一起,这意味着这些牌也可以使用,也必须考虑。

这样做的后果是,如果堆叠两张连续牌(比如3个Jack和3个皇后),那么AI将为这些牌的每种可能组合创建关系,此外还有其他3个牌剩余的牌

这可能导致非常多的可能关系,并且由于使用它们进行了大量比较,因此通常会导致软件冻结,直到进行计算。

我知道代码没有特别好地实现,但我想不出一种使用函数来清理代码的方法。可能的关系数量的限制已被实施为损害控制,尽管它只在一定程度上起作用。

relations.clear();

// AI -- Card Analysis ~~ Identifies up to 8 cards in a relationship
for (int unsigned i = 0; i < usableCards.size(); i++) {

    for (int unsigned j = 0; j < usableCards.size(); j++) { // checks for a 2 card relationship
        if (usableCards[i].isRelated(usableCards[j].getIndex())
            and relations.size() < 80) {

            Relationship genRelation = Relationship();
            genRelation.addCard(usableCards[i]);
            genRelation.addCard(usableCards[j]);

            for (int unsigned k = 0; k < usableCards.size(); k++) { // checks for a 3 card relationship
                if (usableCards[j].isRelated(usableCards[k].getIndex())
                    and (k != i and k != j)
                    and relations.size() < 70) {

                    genRelation.resetCards();
                    genRelation.addCard(usableCards[i]);
                    genRelation.addCard(usableCards[j]);
                    genRelation.addCard(usableCards[k]);

                    for (int unsigned l = 0; l < usableCards.size(); l++) { // checks for a 4 card relationship
                        if (usableCards[k].isRelated(usableCards[l].getIndex())
                            and (l != i and l != j and l != k)
                            and relations.size() < 55
                            and aISkill != "Rookie"){

                            genRelation.resetCards();
                            genRelation.addCard(usableCards[i]);
                            genRelation.addCard(usableCards[j]);
                            genRelation.addCard(usableCards[k]);
                            genRelation.addCard(usableCards[l]);


                        }// end if k related to l
                        if (l + 1 == usableCards.size()
                            and (genRelation.getWeight() == 3)
                                || genRelation.getWeight() == 4) {
                            this->relations.push_back(genRelation);
                        }
                    }// end for l

                }// end if j related to k
                if (k + 1 == usableCards.size()
                    and genRelation.getWeight() == 2) {
                    this->relations.push_back(genRelation);
                }
            }// end for k

        }// end if i related to j
    }// end for j

}// end for i

所以我要问的是,有没有更好的方法呢?或者是否有一种检查特定关系是否已存在的有效方法? (通过直接比较检查关系本身是否相同在这种情况下不起作用,因为卡的套装会有所不同)

欢迎任何回复,即使只是为了侮辱我的代码:)

[编辑]代码已缩短为4张卡片关系,以演示如何存储关系。

0 个答案:

没有答案