我在一週前開始學習C,並決定編寫自己的tictactoe遊戲進行練習。多邏輯運算符|| (OR)for循環中的條件C
我有一個遊戲循環中主要
for(int i = 1; player1.isWinner!=1 || player2.isWinner!=1 || noWinner!=1; i++){...}
哪裏我 - 計數轉身比賽結束的條件是球員贏了,還是沒有人贏得了(畫)。
現在它退出執行只有所有條件1.
如何使它工作的權利?
我在一週前開始學習C,並決定編寫自己的tictactoe遊戲進行練習。多邏輯運算符|| (OR)for循環中的條件C
我有一個遊戲循環中主要
for(int i = 1; player1.isWinner!=1 || player2.isWinner!=1 || noWinner!=1; i++){...}
哪裏我 - 計數轉身比賽結束的條件是球員贏了,還是沒有人贏得了(畫)。
現在它退出執行只有所有條件1.
如何使它工作的權利?
某人贏得的值是1?
如果是這樣,那麼你就需要檢查所有的這些條件爲真,循環,如果它們不是:
!(player1.isWinner==1 || player2.isWinner==1 || noWinner==1)
或者使用AND,檢查和循環時,沒有設置:
(player1.isWinner!=1 && player2.isWinner!=1 && noWinner!=1)
@ГригорийШепелев請注意,使用布爾邏輯,您也可以編寫(假設您只使用0或1--假或true)'if(condition1 || condition2)'而不是'if(condition1 == 1 || condition2 == 1)'。我通常發現它更可讀。除此之外,我同意。 – MayeulC
考慮爲了提高可讀性和maintanability提取條件良好的命名函數:
int hasWinner(/*...*/)
{
return player1.isWinner == 1 || player2.isWinner == 1 || noWinner == 1;
}
然後,它變得很明顯的條件應該是什麼:
for(int i = 1; !hasWinner(/*...*/); i++){ /*...*/ }
你似乎是使用某種倒退布爾邏輯。如果1代表布爾值true
,則條件應該是
!(player1.isWinner || player2.isWinner || noWinner)
這假定您設置player1.isWinner
1時PLAYER1贏得。
它可能會更容易使用bool
從stdbool.h值true
或false
。
使用'&&'而不是'||'?另外,你可以使用'_Bool'並去除'!= 1',這使得條件更容易遵循。 –
我認爲這裏問題的核心是誤解布爾代數,即[De Morgan's laws](https://en.wikipedia.org/wiki/De_Morgan%27s_laws)。如果你跳過所有的數學家祕密握手bs,那麼這很容易理解。 「蘋果不是藍色的,它們不是紫色的」與蘋果不是藍色或紫色是一回事 – Lundin