簡體   English   中英

While循環和條件C#

[英]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的布爾值。 由於player1fullfalse ,它就在那里停止並且永遠不會進入循環。 我認為您想要的是:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM