-1

これらのコード サンプルに問題はありますか? スポットに X があるときはいつでも、勝つことができる場合はそのスポットに O を上書きしています。どうやら if not ステートメントが機能していませんか? 88 と 79 は ASCII の 'X' と 'O' です。

while(i+j<6)
    {
        if (board[i][j]+board[i][j+1] == compXO*2)
        {
            if(board[i][j+2] != (88||79)) 
            {
            board[i][j+2] = compXO;
            won=1;
            break;
            }
        }
        else 
            i++;
    }


if (board[i+1][j+1]+board[i+2][j+2] == compXO*2)
    {   
        if(board[i][j] != (88||79)) 
        {
        board[i][j] = compXO;
        won=1;

        }
    }
4

4 に答える 4

2

You can't compare to two different values like that at once, as the expression 88||79 is logical or, and evaluates to 1, the appropriate way is:

if(!(board[i][j] == 88 || board[i][j] == 79)) 

or

if(board[i][j] != 88 && board[i][j] != 79)
于 2013-04-20T01:27:14.550 に答える
1

このifステートメントは、あなたが思っていることをしていません:

if(board[i][j+2] != (88||79)) 

そのはず:

if (board[i][j+2] != 88 && board[i][j+2] != 79) 

88||79は値の論理和を実行しており7988これは常に とtrue等しいため1、ボード要素を1毎回比較しています。

于 2013-04-20T01:21:06.730 に答える
1

88||79 is equivalent to 1. So, your if (board[i][j+2] != (88||79)) is really equivalent to if (board[i][j+2] != 1).

What you probably want is:

if (board[i][j+2] != 88 && board[i][j+2] != 79))
于 2013-04-20T01:27:39.540 に答える
1

The expression

if (board[i][j+2] != (88||79)) 

true、別名 1 と評価されるboard[i][j+2]ため、1と比較しています。(88 || 79)

多分あなたが求めているのは:

if (board[i][j+2] != 88 && board[i][j+2] != 79)

そうでなければ自明ではない数値に名前を付けた方がよいでしょう (または使用されます)。文字表記を使用することによる効率の向上 (または損失) はまったくありませんが、明確さが大幅に向上します'X''O'

if (board[i][j+2] != 'X' && board[i][j+2] != 'O')

「X も O も存在しない」を表すために使用される文字がある場合、' 'または他の値 (0?) である可能性がある場合、テストを次のように単純化できます。

#define EMPTY ' '

if (board[i][j+2] == EMPTY)

これはあなたがテストしているようです。ボードが正確であることに確信が持てない場合は、各正方形が有効な値 ('X'または'O'または) を持ち、やEMPTYが多すぎないことを確認する検証関数を作成する必要があります。変更された、または無効になったのではないかと心配している場合はいつでも呼び出してください。'X''O'

于 2013-04-20T01:27:53.220 に答える