1

私はチック・タック・トー・ゲームをしようとしていましたが、何らかの理由で条件が機能していません。背景色の条件付きなら?

最初の行の最初の3つの要素を対象にしようとしました。同じ色で、ブラウザに "勝利"ポップアップを警告したかったのですが、それは起こりません。

なぜ誰も考えがありますか?

は、ここに私のコードです:

var one = document.getElementById("one"); 
 
var two = document.getElementById("two"); 
 
var three = document.getElementById("three"); 
 
var four = document.getElementById("four"); 
 
var five = document.getElementById("five"); 
 
var six = document.getElementById("six"); 
 
var seven = document.getElementById("seven"); 
 
var eight = document.getElementById("eight"); 
 
var nine = document.getElementById("nine"); 
 

 

 
var counter = 1; 
 

 
//code that changes the box color 
 
one.addEventListener("click", function() { 
 
    if (counter < 10 && counter % 2 === 0) { 
 
    one.style.backgroundColor = "yellow"; 
 
    } else if (counter < 10 && counter % 2 != 0) { 
 
    one.style.backgroundColor = "red"; 
 
    } 
 
    counter++; 
 
    console.log(counter); 
 
}); 
 
two.addEventListener("click", function() { 
 
    if (counter < 10 && counter % 2 === 0) { 
 
    two.style.backgroundColor = "yellow"; 
 
    } else if (counter < 10 && counter % 2 != 0) { 
 
    two.style.backgroundColor = "red"; 
 
    } 
 
    counter++; 
 
    console.log(counter); 
 
}); 
 
three.addEventListener("click", function() { 
 
    if (counter < 10 && counter % 2 === 0) { 
 
    three.style.backgroundColor = "yellow"; 
 
    } else if (counter < 10 && counter % 2 != 0) { 
 
    three.style.backgroundColor = "red"; 
 
    } 
 
    counter++; 
 
    console.log(counter); 
 
}); 
 
four.addEventListener("click", function() { 
 
    if (counter < 10 && counter % 2 === 0) { 
 
    four.style.backgroundColor = "yellow"; 
 
    } else if (counter < 10 && counter % 2 != 0) { 
 
    four.style.backgroundColor = "red"; 
 
    } 
 
    counter++; 
 
    console.log(counter); 
 
}); 
 
five.addEventListener("click", function() { 
 
    if (counter < 10 && counter % 2 === 0) { 
 
    five.style.backgroundColor = "yellow"; 
 
    } else if (counter < 10 && counter % 2 != 0) { 
 
    five.style.backgroundColor = "red"; 
 
    } 
 
    counter++; 
 
    console.log(counter); 
 
}); 
 
six.addEventListener("click", function() { 
 
    if (counter < 10 && counter % 2 === 0) { 
 
    six.style.backgroundColor = "yellow"; 
 
    } else if (counter < 10 && counter % 2 != 0) { 
 
    six.style.backgroundColor = "red"; 
 
    } 
 
    counter++; 
 
    console.log(counter); 
 
}); 
 
seven.addEventListener("click", function() { 
 
    if (counter < 10 && counter % 2 === 0) { 
 
    seven.style.backgroundColor = "yellow"; 
 
    } else if (counter < 10 && counter % 2 != 0) { 
 
    seven.style.backgroundColor = "red"; 
 
    } 
 
    counter++; 
 
    console.log(counter); 
 
}); 
 
eight.addEventListener("click", function() { 
 
    if (counter < 10 && counter % 2 === 0) { 
 
    eight.style.backgroundColor = "yellow"; 
 
    } else if (counter < 10 && counter % 2 != 0) { 
 
    eight.style.backgroundColor = "red"; 
 
    } 
 
    counter++; 
 
    console.log(counter); 
 
}); 
 
nine.addEventListener("click", function() { 
 
    if (counter < 10 && counter % 2 === 0) { 
 
    nine.style.backgroundColor = "yellow"; 
 
    } else if (counter < 10 && counter % 2 != 0) { 
 
    nine.style.backgroundColor = "red"; 
 
    } 
 
    counter++; 
 
    console.log(counter); 
 
}); 
 

 
//logic for winning 
 
if (one.style.backgroundColor == "red" && two.style.backgroundColor == "red" && three.style.backgroundColor == "red") { 
 
    console.log("red wins"); 
 
}
.knobs { 
 
    background-color: blue; 
 
    border: none; 
 
    padding: 50px; 
 
    margin: 10px; 
 
} 
 

 
.knobs:focus { 
 
    outline: none; 
 
} 
 

 
#total { 
 
    text-align: center; 
 
}
<!DOCTYPE html> 
 

 
<div id="total"> 
 
    <button id="one" class="knobs"></button> 
 
    <button id="two" class="knobs"></button> 
 
    <button id="three" class="knobs"></button> 
 
    <br> 
 
    <button id="four" class="knobs"></button> 
 
    <button id="five" class="knobs"></button> 
 
    <button id="six" class="knobs"></button> 
 
    <br> 
 
    <button id="seven" class="knobs"></button> 
 
    <button id="eight" class="knobs"></button> 
 
    <button id="nine" class="knobs"></button> 
 
</div>

あなたのヘルプははるかに高く評価されます!

+2

もう一つは:[イベント委任](http://stackoverflow.com/q/1687296/4642212)について学びます。 9つの異なるイベントリスナーは必要ありません。引数(例えば 'e')を持つ単一のものを'#total'にバインドするだけで、ノブがクリックされた 'e.target'でチェックする必要があります。 – Xufox

+0

私はあなたのバージョンと少しの最適化の代替ソリューションを追加します – Teocci

答えて

3

問題はif文が最初に1回だけ実行されることです。関数に変換し、各イベントの後に呼び出す必要があります。イベントリスナーの終わりに

function check() { 
    if (one.style.backgroundColor == "red" && two.style.backgroundColor == "red" && three.style.backgroundColor == "red"){ 
    console.log("red wins"); 
    } 
} 

ような何かあなたがそうのようにそれを呼び出します。

check(); 

Xufoxは、上記の言ったように、これはより管理され、あなたように(、あなたが本当に委任になっているはずですすべてを繰り返す必要はありません)

0

をあなたのコードでは:。

var one = document.getElementById("one"); 
var two = document.getElementById("two"); 
var three = document.getElementById("three"); 
var four = document.getElementById("four"); 
var five = document.getElementById("five"); 
var six = document.getElementById("six"); 
var seven = document.getElementById("seven"); 
var eight = document.getElementById("eight"); 
var nine = document.getElementById("nine"); 
  1. このように各ボタンを宣言する必要はありません。 forまたはforEachのような配列とループを使用して最適化することができます。このように:

    var knobs = [ 
        'one', 
        'two', 
        'three', 
        'four', 
        'five', 
        'six', 
        'seven', 
        'eight', 
        'nine' 
    ]; 
    
    knobs.forEach(function(id) { 
        var element = document.getElementById(id); 
        element.addEventListener('click', function() { 
         ... 
        } 
    } 
    
  2. あなたはaddEventListenerで各ボタンにリスナーを追加しています。これは、私のポイント番号1で言及しているように最適化することができます。var element = document.getElementById(id);のボタン要素を取得し、あなたの杖は同じのforEachのリスナーを追加します。

  3. また、を使用して、アレイを各要素の-1で初期化しました。これは空であることを意味します。
  4. これで、クリックするたびに勝者がいるかどうかを確認する方法を追加する必要があります。このコードサンプルでは、​​私はverifyWinner(index);を使用し、ボタンのインデックスを渡しました。
  5. また、one.style.backgroundColor == 'red'だけでは不十分ですので、===stringsと比較することをお勧めします。
  6. CSSに基づいてこのメソッドを使用する際の問題は、同じノブで2回以上クリックするとどうなりますか?カウンタが増加し、ノブが色をredからyellowに変更します。そのため、board配列を使用して「ゲームの状態」をマップすることをお勧めします。
  7. 最後に、redとの場合はとし、と2の場合は配列としてboardを作成しました。これにより、検証プロセスを簡素化するのに役立ちます。

ここにコードサンプルがあります。ハッピーコーディング。 注::スニペットランナーのビジュアライゼーションを改善するため、ノブのサイズを小さくしました。

var knobs = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']; 
 
var board = []; 
 

 
var isRed = true; 
 
var isEndGame = false; 
 
var counter = 0; 
 
knobs.forEach(function(id) { 
 
    var element = document.getElementById(id); 
 
    board.push(-1); 
 
    element.addEventListener('click', function() { 
 
    var index = knobs.indexOf(id); 
 
    if (!isEndGame && board[index] == -1) { 
 
     if (isRed) { 
 
     element.style.backgroundColor = 'red'; 
 
     board[index] = 1; 
 
     } else { 
 
     element.style.backgroundColor = 'yellow'; 
 
     board[index] = 2; 
 
     } 
 
     verifyWinner(index); 
 
     isRed = !isRed; 
 
     counter++; 
 
     //console.log(counter) 
 
    } 
 
    if (counter == 9) { 
 
     isEndGame = true; 
 
     console.log('End of game.'); 
 
    } 
 
    }); 
 
}); 
 

 
function verifyWinner(index) { 
 
    //logic for winning 
 
    var player = isRed ? 1 : 2; 
 

 
    switch (index) { 
 
    case 0: 
 
    case 2: 
 
    case 6: 
 
    case 8: 
 
    case 4: 
 
     verifyVertial(index); 
 
     verifyHorizontal(index); 
 
     verifyDiagonal(index); 
 
     break; 
 
    case 1: 
 
    case 3: 
 
    case 5: 
 
    case 7: 
 
     verifyVertial(index); 
 
     verifyHorizontal(index); 
 
     break; 
 
    } 
 
    if (isEndGame) { 
 
    console.log((isRed ? 'Red' : 'Yellow') + ' has won.'); 
 
    console.log('End of game.'); 
 
    } 
 
} 
 

 
function verifyVertial(index) { 
 
    //logic for winning 
 
    if (!isEndGame) { 
 
    var player = isRed ? 1 : 2; 
 
    switch (index) { 
 
     case 0: 
 
     case 3: 
 
     case 6: 
 
     if (board[0] == player && board[3] == player && board[6] == player) { 
 
      isEndGame = true; 
 
     } 
 
     break; 
 
     case 1: 
 
     case 4: 
 
     case 7: 
 
     if (board[1] == player && board[4] == player && board[7] == player) { 
 
      isEndGame = true; 
 
     } 
 
     break; 
 
     case 2: 
 
     case 5: 
 
     case 8: // edges 
 
     if (board[2] == player && board[5] == player && board[8] == player) { 
 
      isEndGame = true; 
 
     } 
 
     break; 
 
    } 
 
    } 
 
} 
 

 
function verifyHorizontal(index) { 
 
    //logic for winning 
 
    if (!isEndGame) { 
 
    var player = isRed ? 1 : 2; 
 
    switch (index) { 
 
     case 0: 
 
     case 1: 
 
     case 2: // edges 
 
     if (board[0] == player && board[1] == player && board[2] == player) { 
 
      isEndGame = true; 
 
     } 
 
     break; 
 
     case 3: 
 
     case 4: 
 
     case 5: 
 
     if (board[3] == player && board[4] == player && board[5] == player) { 
 
      isEndGame = true; 
 
     } 
 
     break; 
 
     case 6: 
 
     case 7: 
 
     case 8: // edges 
 
     if (board[6] == player && board[7] == player && board[8] == player) { 
 
      isEndGame = true; 
 
     } 
 
     break; 
 
    } 
 
    } 
 
} 
 

 
function verifyDiagonal(index) { 
 
    //logic for winning 
 
    if (!isEndGame) { 
 
    var player = isRed ? 1 : 2; 
 
    switch (index) { 
 
     case 0: 
 
     case 4: 
 
     case 8: // edges 
 
     if (board[0] == player && board[4] == player && board[8] == player) { 
 
      isEndGame = true; 
 
     } 
 
     break; 
 
     case 2: 
 
     case 4: 
 
     case 6: // edges 
 
     if (board[2] == player && board[4] == player && board[6] == player) { 
 
      isEndGame = true; 
 
     } 
 
     break; 
 
    } 
 
    } 
 
}
.knobs { 
 
    background-color: blue; 
 
    border: none; 
 
    padding: 25px; 
 
    margin: 3px; 
 
} 
 

 
.knobs:focus .clear:focus { 
 
    outline: none; 
 
} 
 

 
#total { 
 
    text-align: center; 
 
} 
 

 
.clear { 
 
    clear: both; 
 
}
<!DOCTYPE html> 
 

 
<div id="total"> 
 
    <button id="one" class="knobs"></button> 
 
    <button id="two" class="knobs"></button> 
 
    <button id="three" class="knobs"></button> 
 
    <div class="clearfix"></div> 
 
    <button id="four" class="knobs"></button> 
 
    <button id="five" class="knobs"></button> 
 
    <button id="six" class="knobs"></button> 
 
    <div class="clearfix"></div> 
 
    <button id="seven" class="knobs"></button> 
 
    <button id="eight" class="knobs"></button> 
 
    <button id="nine" class="knobs"></button> 
 
</div>

関連する問題