我遇到一些看起来很简单的问题。我正在使用条件和预测试循环虽然它似乎甚至没有执行一个,因为满足条件,但它们不是。
我有,但是当我打破它时,似乎永远不会遇到循环。它只是跳过它
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);
}
}
我的逻辑可能略有偏差,我只是想让某人指出我正确的方向/看到我的错误。
谢谢
答案 0 :(得分:8)
它永远不会进入循环,因为这里:
bool player1full = false;
bool player2full = false;
while (player1full && player2full == false)
这将测试player1full
的布尔值,如果它是true
,则测试player2full == false
的布尔值。由于player1full
为false
,因此它会在那里停止并且永远不会进入循环。我想你想要的是:
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)
祝你好运!