循环和条件C#

时间:2013-05-01 14:37:49

标签: c# while-loop

我遇到一些看起来很简单的问题。我正在使用条件和预测试循环虽然它似乎甚至没有执行一个,因为满足条件,但它们不是。

我有,但是当我打破它时,似乎永远不会遇到循环。它只是跳过它

int sorter = random.Next(0, 10);
bool player1full = false;
bool player2full = false;

while (player1full && player2full == false)
{
    if (chuckcards[sorter] != null)
    {
         while (player1full != true)
         {
              if (player1.Count != 5)
              {
                   player1.Enqueue(chuckcards[sorter]);
                   chuckcards[sorter] = null;
              }
              else
              {
                   player1full = true;
              }

              sorter = random.Next(0, 10);
         }

         while (player2full != true)
         {
              if (chuckcards[sorter] != null)
              {
                   if (player2.Count != 5)
                   {
                        player2.Enqueue(chuckcards[sorter]);
                        chuckcards[sorter] = null;
                   }
                   else
                   {
                        player2full = true;
                   }

                   sorter = random.Next(0, 10);
               }
          }
     }
     else
     {
          sorter = random.Next(0, 10);
     }
}

我的逻辑可能略有偏差,我只是想让某人指出我正确的方向/看到我的错误。

谢谢

5 个答案:

答案 0 :(得分:8)

它永远不会进入循环,因为这里:

bool player1full = false;
bool player2full = false;
while (player1full && player2full == false)

这将测试player1full的布尔值,如果它是true,则测试player2full == false的布尔值。由于player1fullfalse,因此它会在那里停止并且永远不会进入循环。我想你想要的是:

while (player1full == false && player2full == false)

或等效

while (!player1full && !player2full)

甚至(De Morgan's Law):

while (!(player1full || player2full))

然而,似乎整个外环都是不必要的。我不能完全确定你没有知道你的程序的完整上下文(这个问题超出了这个范围),但它可以改写为:

int sorter;
while (player1.Count != 5)
{
    sorter = random.Next(0, 10);
    if (chuckcards[sorter] != null)
    {
        player1.Enqueue(chuckcards[sorter]);
        chuckcards[sorter] = null;
    }
}

while (player2.Count != 5)
{
    sorter = random.Next(0, 10);
    if (chuckcards[sorter] != null)
    {
        player2.Enqueue(chuckcards[sorter]);
        chuckcards[sorter] = null;
    }
}

答案 1 :(得分:3)

问题在于:

bool player1full = false;
bool player2full = false;
while (player1full && player2full == false)

不等于

while(player1full == false && player2full == false)

==运算符会产生一个新的布尔值,因此以下内容有效:

bool myBool = num1 == num2

你的病情基本上分解为

(false && (false == false))

减少到

(false && true)

减少到

(false)

答案 2 :(得分:2)

似乎每个人都认为只要两者都是假的就要循环。 但根据逻辑,在我看来,你只希望其中一个不满。

如果情况确实如此,则条件应为!player1full || !player2full

我认为你可能只希望一个人不满的原因是一个人可能已满,但另一个人仍需要处理。不过不确定。取决于你如何将牌随机分发给玩家,或者其他什么......而你似乎已经编辑了那部分。

顺便说一句,你的洗牌方法太可怕了。这是一个简洁明了的例子:

List<string> cards = new List<string> { "1", "2", "3", ... , "10", "J", "Q", "K" };
List<string> shuffled = cards.Select(x => new { X = x, Y = random.Next() })
                             .OrderBy(x => x.Y)
                             .Select(x => x.X).ToList();

这个没有经过测试,因为我现在没有VS,但想法是将每张卡与一个随机数匹配,根据随机数排序,然后丢失额外信息(那个随机数)所以你有一张洗牌的名单。

所以底线,你可以拥有一张牌手的名单,然后将其洗牌。 或者你可以拥有一个完整的套牌,随机播放,并为每个玩家带来前5名。 无论你选择哪种,你都想要很好地改变它们。

全面改组后发牌的例子:

for (var i = 0; i < CARDS_PER_PLAYER; i++)
{
    foreach (var player in players)
    {
        // Shouldn't happen, if code is carefully planned
        if (cards.Count == 0) throw new ApplicationException("Out of cards!");

        // Deal the top card
        player.Enqueue(cards[0]);
        // Remove from deck, doh! Card can't be in deck AND in player's hand anyways
        cards.RemoveAt(0);
    }
}

答案 3 :(得分:1)

这永远不会成真:

bool player1full = false;
bool player2full = false;
while (player1full && player2full == false)

也许你的意思是:

while (player1full == false && player2full == false)

答案 4 :(得分:0)

你应该写:

while(!player1full && !player2full)
祝你好运!