0

我在一些看起来很简单的事情上遇到了麻烦。我正在使用条件和预测试循环 While 并且它似乎甚至没有执行一个,因为条件满足但它们没有。

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

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);
     }
}

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

谢谢

4

5 回答 5

8

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

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

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

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

或等效地

while (!player1full && !player2full)

甚至(根据德摩根定律):

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;
    }
}
于 2013-05-01T14:40:06.333 回答
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)
于 2013-05-01T14:39:41.743 回答
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);
    }
}
于 2013-05-01T14:43:03.090 回答
1

这永远不会是真的:

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

也许你的意思是:

while (player1full == false && player2full == false)
于 2013-05-01T14:39:53.433 回答
0

你应该写:

while(!player1full && !player2full)

祝你好运!

于 2013-05-01T14:40:32.730 回答