3

我需要知道如何使用 C# 在纸牌游戏中实现贪心算法。游戏是回合制游戏。当AI应该发一些牌时,必须基于已经在桌上的其他牌的最新状态。有没有人对此有解决方案,或者可能是我开始的参考?提前致谢!

现在我只完成了洗牌的代码:

List<int> cards = new List<int>();

for (int j = 1; j <= 2; j++)
{
    for (int i = 1; i <= 54; i++)
    {
        cards.Add(i);
    }
}

List<int> ShuffledCards = new List<int>();
Random random = new Random();

int iterations = cards.Count;
int index = 0;
for (int j = 1; j <= 2; j++)
{
    for (int i = 0; i < iterations; i++)
    {
        index = random.Next(0, iterations - i);
        ShuffledCards.Add(cards[index]);
        cards.RemoveAt(index);
    }
    iterations = cards.Count;
    index = 0;
}

ShuffledCards.Reverse(0, ShuffledCards.Count);
ShuffledCards.RemoveRange(0, 8);
ShuffledCards.Reverse(0, ShuffledCards.Count);
4

2 回答 2

4

本书就像一本关于人工智能的圣经。您可以从阅读本书的前 3 部分开始。

于 2011-05-03T11:19:13.630 回答
0

我不明白你所说的贪婪算法是什么意思。您不是想让经销商最大化某个目标或为某事找到一个好的策略吗?

这看起来更像是模拟纸牌游戏。我们需要知道你之后真正想做什么。

伪代码:

//Your deck state:
deck   //list of cards in the deck (in top->bottom order) (initially shuffled)
i;     //index of the card at the top of the deck

void dreshuffle(){
    shuffle(cards);
    i = 0;
}

int get_card(){
    if(i >= cards.length){
        //no cards left in pile
        reshuffle()    
    }
    return cards[i++];
}

当然,这只是一个简单的例子,因为它假设庄家在重新洗牌时拿回了所有牌。也许您可能需要添加一个弃牌堆或类似的东西以适应您的游戏规则。


顺便说一句,你的洗牌方法很奇怪。为什么要洗牌两次?更正常的方法是

list;
n = list.count - 1 //last index in list
while(n >= 0){
    i = random integer in range [0,n] (inclusive)
    swap(list[i], list[n])
    n -= 1
}

(或者只是使用库函数)

于 2011-05-03T14:18:42.533 回答