jQueryで神経衰弱を作ってみましたが、うまく機能しません。
動作の流れとしては以下の通りです。
① 16枚のカードの中から「?」と書かれたものをひとつクリック
② そのカードに書かれている「?」が「1」などの数字に変わる
③ もうひとつ「?」と書かれたものをクリックする
④ その要素に書かれている「?」が「1」などの数字に変わる
⑤ ②と④で表示された数字が一致している場合は、開いた数字はそのままで①に戻る。一致していない場合は1秒後に数字が「?」に戻り①にもどる。
⑥: 全ての要素が開かれたときにアラートで「Game Over」
発生している問題・エラーメッセージ
このゲームを作成するに当たって、添削担当者から、「変数スコープを意識してください」と指示を受けています。 実際にクロージャーを使ってみたんですが、alllock()やcomparison()の部分がうまく動いてくれません。
該当のソースコード
ソースコード
html
1<!doctype html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> 6<meta name="format-detection" content="telephone=no"> 7<title></title> 8<link rel="stylesheet" href="css/reset.css"> 9<link rel="stylesheet" href="css/base.css"> 10<link rel="stylesheet" href="css/style.css"> 11</head> 12<body> 13<ul class="lists clearfix"></ul> 14<script type="text/javascript" src="js/jquery.js"></script> 15<script type="text/javascript"> 16// jQuery 17</script> 18</body> 19</html>
css
1.lists { 2 border: 10px #CCC solid; 3} 4.lists > li { 5 float: left; 6 width: 25%; 7 background-color: #EEE; 8 border-top: 2px #CCC solid; 9 border-right: 2px #CCC solid; 10 font-size: 20px; 11 font-weight: bold; 12 line-height: 75px; 13 text-align: center; 14 cursor: pointer; 15 -webkit-box-sizing: border-box; 16 box-sizing: border-box; 17} 18.lists > li:nth-child(-n + 4) { 19 border-top: none; 20} 21.lists > li:nth-child(4n) { 22 border-right: none; 23} 24.lock { 25 pointer-events: none; 26}
JavaScript
1$(function() { 2 function shuffle() { 3 const totalCard = 16; 4 5 let arr = []; 6 7 for (let i = 0; i < totalCard/2; i++) { 8 arr.push(i+1, i+1); 9 } 10 11 return arr; 12 } 13 14 const makeCardList = (function() { 15 const cards = shuffle(); 16 17 cards 18 .sort(function() { 19 return Math.random() - Math.random(); 20 }) 21 .map(function(num) { 22 return ($('<li>').attr('data-number', num).text('?')); 23 }) 24 .forEach(function(element) { 25 return $('.lists').append(element); 26 }) 27 }()); 28 29 //クリックできないようにカードをロック 30 function cardlock(i) { 31 $('.lists').find('li').eq(i).css('pointer-events', 'none'); 32 } 33 34 //全てのカードをロック 35 function alllock(){ 36 $('.lists').find('li').css('pointer-events', 'none'); 37 } 38 39 //全てのカードをアンロック 40 function unlock(){ 41 $('.lists').find('li').css('pointer-events', ''); 42 } 43 44 // 選択された2枚のカードを開く 45 const openCard = function(clickedCard) { 46 let number = clickedCard.data('number'), 47 index = clickedCard.index(), 48 clickFirst = true, 49 clickSecond = true, 50 card1, 51 card2, 52 card1Data, 53 card2Data, 54 index1, 55 index2, 56 pairs = 0; 57 58 cardlock(index); //選択したカードのクリックを無効にする関数 59 60 if (clickFirst == true) { 61 card1 = clickedCard.text(number); 62 index1 = index; 63 card1Data = number; 64 clickFirst = false; 65 } else { 66 alllock(); 67 68 card2 = clickedCard.text(number); 69 index2 = index; 70 card2Data = number; 71 72 //選んだ2枚のカードの正否 73 return function comparison() { 74 if(card1Data == card2Data) { 75 $('.lists').find('li').eq(index2).addClass('lock'); 76 $('.lists').find('li').eq(index1).addClass('lock'); 77 78 pairs++; 79 80 if(pairs == 8) { 81 setTimeout(function() { 82 alert("Game Over"); 83 }, 1000); 84 } 85 } else { //2枚が違うカードであれば 86 return setTimeout(function() { 87 //2枚目のカードを?に戻す 88 $('.lists').find('li').eq(index2).css('pointer-events', '').text('?'); 89 //1枚目のカードを?に戻す 90 $('.lists').find('li').eq(index1).css('pointer-events', '').text('?'); 91 }, 1000); 92 } 93 94 clickFirst = true; //1枚目かどうかの判定を有効に 95 96 setTimeout(function() { 97 unlock(); 98 }, 1000); 99 } 100 } 101 102 }; 103 104 $('.lists').find('li').on('click', function() { 105 openCard($(this)); 106 }); 107});
補足情報(FW/ツールのバージョンなど)
まだまだ初心者ですので、慣れない部分がたくさんありますが、何かヒントを頂ければと思っています。
よろしくお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/25 08:13