0

何らかの奇妙な理由で、else if条件が満たされていないため、勝者を宣言できません。その条件の値をデバッグしてトレースしました。3 つの変数の値 2 を保持していますが、満たされた条件のNSLogをトリガーしません。私は血まみれの明らかなことを見逃していますか、それとも本当に疲れていますか(はい...私はとても疲れています)?これを理解するのに何時間も費やしました。X条件が満たされ、そのNSLogステートメントが実行されます...しかし、私の人生では... Oはそうではありません。

{ } を試しました { } を試しませんでした。私はほぼすべてを試しました...ちょっと待ってください。

O 値の条件だけを試してみましたが、うまくいきませんでした。うーん。それはいまいましい 2 が好きではありません !へへへ。

 -(void)chkWinner   
  {
    NSLog(@"At the top of Check Winner method, player %d %d %d ", tl_Int, tm_Int, tr_Int);

    if(tl_Int & tm_Int & tr_Int == 1)
    {
       NSLog(@" X is the WINNER %d %d %d", tl_Int, tm_Int, tr_Int);
    }
    else if(tl_Int & tm_Int & tr_Int == 2)
    {
       NSLog(@" O is the WINNER %d %d %d", tl_Int, tm_Int, tr_Int);
    }
    else
    {
        NSLog(@"In Check Winner method, player %d %d %d ", tl_Int, tm_Int, tr_Int);
    }
}

押されているボタンのコードは次のとおりです。値をメソッドに渡します...なぜそれが一方の値では機能し、もう一方の値では機能しないのかわかりません。

-(IBAction) topLeftBtn:(id) sender
{

    if(playerX.enabled == true)
    {
        tl_Int = 1;
        NSLog(@" X %d ", tl_Int);
        [tlBtn setImage:[UIImage imageNamed:@"X.png"] forState:UIControlStateNormal];
        playerX.enabled = false;
        tlBtn.enabled = false;
        blockingBtn.enabled = true;
        blockingBtn.hidden = false;
        topLSquare.image = [UIImage imageNamed:nil];
        SEL methodSelector1 = @selector(chkWinner);
        [NSTimer scheduledTimerWithTimeInterval:0 target:self selector:methodSelector1 userInfo:nil repeats:NO];

    }    

    if(playerO.enabled == true)
    {
        tl_Int = 2;
        NSLog(@"TL O %d ", tl_Int);
        [tlBtn setImage:[UIImage imageNamed:@"O.png"] forState:UIControlStateNormal];
        playerO.enabled = false;
        tlBtn.enabled = false;
        blockingBtn.enabled = true;
        blockingBtn.hidden = false;
        topLSquare.image = [UIImage imageNamed:nil];
        SEL methodSelector1 = @selector(chkWinner);
        [NSTimer scheduledTimerWithTimeInterval:0 target:self selector:methodSelector1 userInfo:nil repeats:NO];

     }

}

出力ウィンドウも次のとおりです。

2013-07-25 00:43:08.167 [16079:c07] TR O 2 
2013-07-25 00:43:08.170 [16079:c07] At the top of Check Winner method, player 0 0 2 
2013-07-25 00:43:08.172 [16079:c07] In Check Winner method, player 0 0 2 
2013-07-25 00:43:10.934 [16079:c07] TM O 2 
2013-07-25 00:43:10.938 [16079:c07] At the top of Check Winner method, player 0 2 2 
2013-07-25 00:43:10.939 [16079:c07] In Check Winner method, player 0 2 2 
2013-07-25 00:43:14.444 [16079:c07] TL O 2 
2013-07-25 00:43:14.447 [16079:c07] At the top of Check Winner method, player 2 2 2 
2013-07-25 00:43:14.449 [16079:c07] In Check Winner method, player 2 2 2 

値はありますが、条件が満たされていることを示す NSLog 出力はありません... ブレークポイントを発行してデバッグに入り、コードにステップインし、条件が満たされたときに NSLog の上を歩きます。ヘルプ...

4

3 に答える 3

3

試していただきたいことが 2 つあります。

1 つ目は、単一の「&」をすべて二重の「&&」に変更することです (これは、AND をチェックしていると仮定しています。

2 つ目は、すべての変数をひとまとめにするのではなく、各変数が 1 に等しいかどうかを確認することです。

適切な if ステートメントは次のようになります。

if(tl_Int == 1 && tm_Int == 1 && tr_Int == 1)
于 2013-07-25T05:12:01.070 に答える
0

すべての単一の「&」を二重の「&&」に変更するだけで、問題は解決します。

そして、あなたの条件によると、NSLog 呼び出しは値 off に依存します。1tr_Intの場合は最初の NSLog を呼び出し、2 の場合は 2 番目、それ以外の場合は 3 番目を呼び出します。

IT はtr_Int ==の状態をチェックしているだけです

于 2013-07-25T05:26:24.490 に答える
0

tl_Int & tm_Int & tr_Int を計算して一時変数に割り当て、if/elseif 条件で使用してみてください。-- テストはしていませんが、試してみてください。

于 2013-07-25T05:10:36.627 に答える