首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

新手!C#入门经典3中一个示例中的代码不理解

2011-12-28 
新手求助!C#入门经典3中一个示例中的代码不理解publicvoidShuffle(){Card[]newDecknewCard[52]bool[]ass

新手求助!C#入门经典3中一个示例中的代码不理解
public   void   Shuffle()
                {
                        Card[]   newDeck   =   new   Card[52];
                        bool[]   assigned   =   new   bool[52];
                        Random   sourceGen   =   new   Random();
                        for   (int   i   =   0;   i   <   52;   i++)
                        {
                                int   destCard   =   0;
                                bool   foundCard   =   false;
                                while   (foundCard   ==   false)
                                {
                                        destCard   =   sourceGen.Next(52);
                                        if   (assigned[destCard]   ==   false)
                                                foundCard   =   true;
                                }
                                assigned[destCard]   =   true;
                                newDeck[destCard]   =   cards[i];
                        }
                        newDeck.CopyTo(cards,   0);
这是一副扑克牌.Shuffle()是创建1个扑克牌临时数组.并把扑克牌从现有的数组随即复制到这个数组中.每次循环,都用.NET   Framework中的System.Random类的实例生成一个0-51之间的随即数.进行了实例后,对象就使用方法Next(X)生成0-x之间的随即数.有了1个随即数后,就可以使用他作为临时数组中Card对象的下标.以便复制cards数组中的扑克牌.
还有1个bool变量的数组,在复制每张牌时,把改数组中的值指定为true.生成随即数时检查这个数组,看看是否已经把一张牌复制到临时数组中由随即数指定的位置上了.如果复制好了,就将生成另一个随即数.
上面是书中的解释.我不太理解其中的代码.
bool   foundCard=false;中的foundCard是什么.为什么这样写呢?
int   destCard   =   0;
                                bool   foundCard   =   false;
                                while   (foundCard   ==   false)
                                {
                                        destCard   =   sourceGen.Next(52);


                                        if   (assigned[destCard]   ==   false)
                                                foundCard   =   true;
                                }
                                assigned[destCard]   =   true;
                                newDeck[destCard]   =   cards[i];
这一段都比较迷糊.希望有人能详细解释下,谢谢了。

[解决办法]
这是一个洗牌函数
函数思想是通过利用random()函数产生的随机数相当于遍历了newDeck[],然后将无序的newDeck[]依次赋值cards的值,这样赋值后的newdeck[]中的牌也是无序的了,最后利用newDeck.CopyTo(cards,0)使之达到了cards[]中的牌也是无序的了。
函数执行情况是这样的:
public void Shuffle()
{
Card[] newDeck = new Card[52];//实例化Card[]
bool[] assigned = new bool[52];//newDeck的标记,判断newDeck是否被赋值。
Random sourceGen = new Random();
for (int i = 0; i < 52; i++)//每循环一次,通过随机函数给newcard[destCard]赋值,
{
int destCard = 0;
bool foundCard = false;//作为一个标记,判断newDeck[destCard]是否已经被赋值
while (foundCard == false)//.如果为false则继续调用random直到assigned[destCard]为假(为假则assigned[destCard]尚未被赋值)
{
destCard = sourceGen.Next(52);
if (assigned[destCard] == false)
foundCard = true;
}
assigned[destCard] = true;
newDeck[destCard] = cards[i];//将打乱的newDeck[]复制给cards[]达到洗牌效果。
}
newDeck.CopyTo(cards, 0);

热点排行