
トランプ画像を使って神経衰弱を作ってみよう。
2023作成の最新版があります
[準備編]
1.まずは以下をダウンロードし、デスクトップに展開する。
2.以下のようなフォルダ構成になっている。imagesフォルダにはトランプの画像が入っている。

3.index.htmlはcssファイルとjsファイルの読み込み設定とメインとなるテーブルタグがある。
05 | < link rel = "stylesheet" href = "css/main.css" > |
06 | < script src = "js/main.js" ></ script > |
11 | < table id = "table" border = "1" ></ table > |
4.main.jsはドキュメントの読み込みが完了したら処理を開始する記述をしてある。main.cssは現状空白の状態だ。
2 | window.onload= function (){ |
[作成]
1.main.jsを以下のように更新する。
02 | window.onload= function (){ |
04 | function Card(suit,num){ |
10 | const suits=[ 's' , 'd' , 'h' , 'c' ]; |
11 | for (let i=0;i<suits.length;i++){ |
12 | for (let j=1;j<=13;j++){ |
13 | let card= new Card(suits[i],j); |
18 | const table=document.getElementById( 'table' ); |
19 | for (let i=0;i<suits.length;i++){ |
20 | let tr=document.createElement( 'tr' ); |
21 | for (let j=0;j<13;j++){ |
22 | let td=document.createElement( 'td' ); |
23 | let tempCard=cards[i*13+j]; |
24 | td.textContent=`${tempCard.suit}:${tempCard.num}`; |
27 | table.appendChild(tr); |
2.ブラウザから実行してみよう。以下のように表示されれば成功だ。

[スタイルをあてる]
それでは画像とスタイルを用いてカードの見た目を表現していこう。
1.まずはindex.htmlのtableタグについているborder属性を外す
05 | < link rel = "stylesheet" href = "css/main.css" > |
06 | < script src = "js/main.js" ></ script > |
12 | < table id = "table" ></ table > |
2.main.jsを以下のように編集
02 | window.onload= function (){ |
03 | function Card(suit,num){ |
08 | this .setFront= function (){ |
09 | this .front=`${ this .suit}${ this .num<10? '0' : '' }${ this .num}.gif`; |
14 | const suits=[ 's' , 'd' , 'h' , 'c' ]; |
15 | for (let i=0;i<suits.length;i++){ |
16 | for (let j=1;j<=13;j++){ |
17 | let card= new Card(suits[i],j); |
23 | const table=document.getElementById( 'table' ); |
24 | for (let i=0;i<suits.length;i++){ |
25 | let tr=document.createElement( 'tr' ); |
26 | for (let j=0;j<13;j++){ |
27 | let td=document.createElement( 'td' ); |
28 | let tempCard=cards[i*13+j]; |
30 | td.classList.add( 'card' ); |
31 | td.style.backgroundImage=`url(images/${tempCard.front})`; |
36 | table.appendChild(tr); |
3.main.cssを以下のように編集
02 | background-color :lightgreen; |
11 | background- size :cover; |
4.実行してみよう以下のように表示されれば成功だ。

[シャッフル]
トランプをランダムに並べてみよう。
1.main.jsに以下を追記
02 | window.onload= function (){ |
03 | function Card(suit,num){ |
07 | this .setFront= function (){ |
08 | this .front=`${ this .suit}${ this .num<10? '0' : '' }${ this .num}.gif`; |
13 | const suits=[ 's' , 'd' , 'h' , 'c' ]; |
14 | for (let i=0;i<suits.length;i++){ |
15 | for (let j=1;j<=13;j++){ |
16 | let card= new Card(suits[i],j); |
25 | let index=Math.floor(Math.random()*i--); |
26 | var temp=cards[index]; |
27 | cards[index]=cards[i]; |
32 | const table=document.getElementById( 'table' ); |
33 | for (let i=0;i<suits.length;i++){ |
34 | let tr=document.createElement( 'tr' ); |
35 | for (let j=0;j<13;j++){ |
36 | let td=document.createElement( 'td' ); |
37 | let tempCard=cards[i*13+j]; |
38 | td.classList.add( 'card' ); |
39 | td.style.backgroundImage=`url(images/${tempCard.front})`; |
42 | table.appendChild(tr); |
2.実行してみよう。シャッフルのアルゴリズムによりカードがランダムに並ぶようになった。
[最初は裏面表示にする]
1.まずはmain.cssを以下のように変更
02 | background-color :lightgreen; |
11 | background- size :cover; |
15 | background-image : url (../images/z 01 .gif) !important ; |
2.次にmain.jsを変更する。といってもclassListにaddしている部分にbackを追加するだけだ。
02 | window.onload= function (){ |
03 | function Card(suit,num){ |
07 | this .setFront= function (){ |
08 | this .front=`${ this .suit}${ this .num<10? '0' : '' }${ this .num}.gif`; |
13 | const suits=[ 's' , 'd' , 'h' , 'c' ]; |
14 | for (let i=0;i<suits.length;i++){ |
15 | for (let j=1;j<=13;j++){ |
16 | let card= new Card(suits[i],j); |
24 | let index=Math.floor(Math.random()*i--); |
25 | var temp=cards[index]; |
26 | cards[index]=cards[i]; |
31 | const table=document.getElementById( 'table' ); |
32 | for (let i=0;i<suits.length;i++){ |
33 | let tr=document.createElement( 'tr' ); |
34 | for (let j=0;j<13;j++){ |
35 | let td=document.createElement( 'td' ); |
36 | let tempCard=cards[i*13+j]; |
38 | td.classList.add( 'card' , 'back' ); |
39 | td.style.backgroundImage=`url(images/${tempCard.front})`; |
42 | table.appendChild(tr); |
3.実行してみよう。すべて裏面が表示されるはずだ。jsによって設定したstyleはインラインに記述されるため、それを覆すにはimportant設定が必要となる。
[クリックしたら表になる挙動の作成]
1.現状classListにbackが入っているときは裏、そうでないときは表が表示される。
まずはclickイベントを作成し、backをtoggleしてみよう。
main.jsを以下のように変更
02 | window.onload= function (){ |
03 | function Card(suit,num){ |
07 | this .setFront= function (){ |
08 | this .front=`${ this .suit}${ this .num<10? '0' : '' }${ this .num}.gif`; |
12 | const suits=[ 's' , 'd' , 'h' , 'c' ]; |
13 | for (let i=0;i<suits.length;i++){ |
14 | for (let j=1;j<=13;j++){ |
15 | let card= new Card(suits[i],j); |
23 | let index=Math.floor(Math.random()*i--); |
24 | var temp=cards[index]; |
25 | cards[index]=cards[i]; |
30 | const table=document.getElementById( 'table' ); |
31 | for (let i=0;i<suits.length;i++){ |
32 | let tr=document.createElement( 'tr' ); |
33 | for (let j=0;j<13;j++){ |
34 | let td=document.createElement( 'td' ); |
35 | let tempCard=cards[i*13+j]; |
36 | td.classList.add( 'card' , 'back' ); |
39 | td.style.backgroundImage=`url(images/${tempCard.front})`; |
42 | table.appendChild(tr); |
47 | td.classList.toggle( 'back' ); |
2.カードをクリックしてみよう。backクラスがついたり外れたりして表示が切り替わるはずだ。
[1枚目のカードと2枚目のカードが同じ数字だったら表のままにする]
いよいよ神経衰弱をつくっていこう。
クリックされたカードが1枚目なのか2枚目なのかをどう判定するか・・・
今回はfirstCardという変数を用意し、それがnullかどうかで判定することとする。
1.main.jsを以下のように変更。
02 | window.onload= function (){ |
03 | function Card(suit,num){ |
07 | this .setFront= function (){ |
08 | this .front=`${ this .suit}${( '0' + this .num).slice(-2)}.gif`; |
12 | const suits=[ 's' , 'd' , 'h' , 'c' ]; |
13 | for (let i=0;i<suits.length;i++){ |
14 | for (let j=1;j<=13;j++){ |
15 | let card= new Card(suits[i],j); |
23 | let index=Math.floor(Math.random()*i--); |
24 | var temp=cards[index]; |
25 | cards[index]=cards[i]; |
30 | const table=document.getElementById( 'table' ); |
31 | for (let i=0;i<suits.length;i++){ |
32 | let tr=document.createElement( 'tr' ); |
33 | for (let j=0;j<13;j++){ |
34 | let td=document.createElement( 'td' ); |
35 | let tempCard=cards[i*13+j]; |
36 | td.classList.add( 'card' , 'back' ); |
40 | td.style.backgroundImage=`url(images/${tempCard.front})`; |
43 | table.appendChild(tr); |
53 | if (!td.classList.contains( 'back' ) || flipTimerId){ |
56 | td.classList.remove( 'back' ); |
61 | if (firstCard.num===td.num){ |
65 | flipTimerId=setTimeout( function (){ |
66 | firstCard.classList.add( 'back' ); |
67 | td.classList.add( 'back' ); |
コメント