[英]While Loop And Condition C#
我在看似簡單的事情上遇到了麻煩。 我在條件循環和預測試循環上使用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);
}
}
我的邏輯可能略有偏離,我只是希望有人指出我正確的方向/查看我的錯誤。
謝謝
它永遠不會進入循環,因為在這里:
bool player1full = false;
bool player2full = false;
while (player1full && player2full == false)
這將測試player1full
的布爾值,如果為true
,則測試player2full == false
的布爾值。 由於player1full
為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;
}
}
問題在這里:
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)
似乎每個人都在想只要兩個都是假的就想循環。 但是根據邏輯,在我看來,您只希望其中之一不完整。
如果確實如此,則條件應為!player1full || !player2full
!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);
}
}
這將永遠是不正確的:
bool player1full = false;
bool player2full = false;
while (player1full && player2full == false)
也許你的意思是:
while (player1full == false && player2full == false)
您應該寫:
while(!player1full && !player2full)
祝好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.