2016-11-11 62 views
0

我在一週前開始學習C,並決定編寫自己的tictactoe遊戲進行練習。多邏輯運算符|| (OR)for循環中的條件C

我有一個遊戲循環中主要

for(int i = 1; player1.isWinner!=1 || player2.isWinner!=1 || noWinner!=1; i++){...} 

哪裏 - 計數轉身比賽結束的條件是球員贏了,還是沒有人贏得了(畫)。

現在它退出執行只有所有條件1.

如何使它工作的權利?

+0

使用'&&'而不是'||'?另外,你可以使用'_Bool'並去除'!= 1',這使得條件更容易遵循。 –

+1

我認爲這裏問題的核心是誤解布爾代數,即[De Morgan's laws](https://en.wikipedia.org/wiki/De_Morgan%27s_laws)。如果你跳過所有的數學家祕密握手bs,那麼這很容易理解。 「蘋果不是藍色的,它們不是紫色的」與蘋果不是藍色或紫色是一回事 – Lundin

回答

2

某人贏得的值是1?

如果是這樣,那麼你就需要檢查所有的這些條件爲真,循環,如果它們不是:

!(player1.isWinner==1 || player2.isWinner==1 || noWinner==1) 

或者使用AND,檢查和循環時,沒有設置:

(player1.isWinner!=1 && player2.isWinner!=1 && noWinner!=1) 
+0

@ГригорийШепелев請注意,使用布爾邏輯,您也可以編寫(假設您只使用0或1--假或true)'if(condition1 || condition2)'而不是'if(condition1 == 1 || condition2 == 1)'。我通常發現它更可讀。除此之外,我同意。 – MayeulC

0

考慮爲了提高可讀性和maintanability提取條件良好的命名函數:

int hasWinner(/*...*/) 
{ 
    return player1.isWinner == 1 || player2.isWinner == 1 || noWinner == 1; 
} 

然後,它變得很明顯的條件應該是什麼:

for(int i = 1; !hasWinner(/*...*/); i++){ /*...*/ } 
0

你似乎是使用某種倒退布爾邏輯。如果1代表布爾值true,則條件應該是

!(player1.isWinner || player2.isWinner || noWinner) 

這假定您設置player1.isWinner 1時PLAYER1贏得。

它可能會更容易使用bool從stdbool.h值truefalse