JavaScriptで神経衰弱作ってみた

以前の旧ブログでもテストで作成したのですが、リニューアルしてこちらで再アップします。(いや、リニューアルしたのは絵だけなんですけどね)
参考サイトはこちら:鴈野さんの Java Script/DHTML 事例/サンプル集
ほぼ参考サイトの通りで作成しました。
こちらで行なった変更はスマホで開いた時の枚数の変更と、以下のセカンドステージの追記です。
※というわけで、セカンドステージもクリアしてね
ファーストステージのタグ
基本は、鴈野さんの Java Script/DHTML 事例/サンプル集のままの引用です。
51〜56行目はわたしの方で追記しており、クリア後セカンドステージへ進むようにしています。(ソースみられたらすぐわかりますがw。)
<script type="text/javascript"> var card_i=new Array("1b","1b","1r","1r","2b","2b","2r","2r","3b","3b","3r","3r","4b","4b","4r","4r","5b","5b","5r","5r","6b","6b","6r","6r","7b","7b","7r","7r"); var card_c=new Array(); var nn=28; //残りのカード枚数 var oo=0; //開いたカードの枚数 var c1=0; //開いたカードの1枚めの番号 var i1=0; //開いたカードの1枚めの画像番号 timerID=10; function Shuffle(){ for (i=0;i<28;i++) {card_c[i]=card_i[i]+".jpg";} //全カードをコピー for (i=27;i>0;i--){ //かき混ぜる j=Math.floor(Math.random()*i); temp=card_c[i]; card_c[i]=card_c[j]; card_c[j]=temp; } nn=28; //残りのカード枚数 oo=0; //開けたカード枚数 for (i=0;i<28;i++) document.images[i].src="c.jpg"; //全カードを裏で配置 } function Card(m){ if (oo==0){ //開けたカードが1枚目の時 i1=m; //カード番号保存 c1=card_c[m].charAt(0); if (c1!="n") { //まだ取り終わっていないカードなら oo=1; //開けたカード枚数更新 document.images[m].src=card_c[m]; //カードを開ける } } else if (oo=1){ //開けたカードが2枚目の時 i2=m; //カード番号保存 c2=card_c[m].charAt(0); if (i1!=m && c2!="n"){ //一枚目と同じでなく取り終わっていないカードなら document.images[m].src=card_c[m]; //カードを開ける if (c1==c2) { timerID=setTimeout("Match(i1,i2)",300); card_c[i1]="n"; //一致したカードを取りきったことにする card_c[i2]="n"; nn=nn-2; } else timerID=setTimeout("UnMatch(i1,i2)",300); oo=0; //開けたカードの枚数を0に } } } function Match(m1,m2){ document.images[m1].src="n.jpg"; //カードを取り去る(ブランクパターンにする) document.images[m2].src="n.jpg"; //カードを取り去る(ブランクパターンにする) if (nn==0){ var nxt = confirm("次のステージへ挑むのか?"); if (nxt == true){ location.href = "shinkei-suijaku2"; } else { alert("そっか・・"); Shuffle(); } } } function UnMatch(m1,m2){ document.images[m1].src="c.jpg"; //カードを裏返す document.images[m2].src="c.jpg"; //カードを裏返す } </script>
51〜56行目を削除して、50行目の文言を「おつかれさま!」としておけば、ファーストステージのみの神経衰弱となりますね!
上記スクリプトを読み込んで、配置のマークアップの方は
<table border=0 cellspacing=10> <tr> <td><a href="javascript:Card(0)"><img src="c.jpg" border=0></a></td> <td><a href="javascript:Card(1)"><img src="c.jpg" border=0></a></td> <td><a href="javascript:Card(2)"><img src="c.jpg" border=0></a></td> <td><a href="javascript:Card(3)"><img src="c.jpg" border=0></a></td> <td><a href="javascript:Card(4)"><img src="c.jpg" border=0></a></td> <td><a href="javascript:Card(5)"><img src="c.jpg" border=0></a></td> <td><a href="javascript:Card(6)"><img src="c.jpg" border=0></a></td> </tr> <tr> <td><a href="javascript:Card(7)"><img src="c.jpg" border=0></a></td> <td><a href="javascript:Card(8)"><img src="c.jpg" border=0></a></td> <td><a href="javascript:Card(9)"><img src="c.jpg" border=0></a></td> .........続く
といった形で、枚数分(28枚)配置すれば良いです。
※Tableタグにこだわらなくて大丈夫です。
「0」からカウントされるので、28枚の場合は最終<a href="javascript:Card(27)">
で終わることになります!
画像作成
こちらはJavaScriptのタグの方の2行目
var card_i=new Array("1b","1b","1r","1r","2b","2b","2r","2r","3b","3b","3r","3r","4b","4b","4r","4r","5b","5b","5r","5r","6b","6b","6r","6r","7b","7b","7r","7r");
で指示した通りとなるのですが、
1b.jpg と 1r.jpg は同じ画像…で1ペアとなるので、計7枚の絵をコピーでファイル名のみ変更 ●b.jpg ●r.jpg として 結果14個の画像データを準備しました。
1b.jpg = ねこ
1r.jpg = ねこ(1b.jpgのコピーでファイル名のみ変更)
2b.jpg = いぬ
2r.jpg = いぬ(2b.jpgのコピーでファイル名のみ変更)
・
・
・
7b.jpg = とかげ
7r.jpg = とかげ(7b.jpgのコピーでファイル名のみ変更)
ちなみに画像をたくさん作るのが面倒だったので、配列の中身をみてみると 1b 1b 1r 1r といった風に私の場合は重複させて記載していますが、これらを重複させずに14b, 14rまで作成すれば、完全に1ペアずつの難しい目の神経衰弱の作成が可能です。
c.jpgという、カードの裏側の画像も1枚準備しましょう。
セカンドステージ
ファーストステージと異なる箇所を色付けしています。
<script> var card_i=new Array("1b","1b","1r","1r","2b","2b","2r","2r","3b","3b","3r","3r","4b","4b","4r","4r","5b","5b","5r","5r","6b","6b","6r","6r","7b","7b","7r","7r"); var card_c=new Array(); var nn=28; //残りのカード枚数 var oo=0; //開けたカード枚数 var c1=0; //開けた1枚目カード番号 var i1=0; //開けた1枚目img番号 var cnt; //チカ追加: タイマー処理用 var PassageID; timerID=10; function Shuffle(){ stopCount() document.frm.countShow.value = 0; for (i=0;i<28;i++) {card_c[i]=card_i[i]+".jpg";} //全カードをコピー for (i=27;i>0;i--){ //かき混ぜる j=Math.floor(Math.random()*i); temp=card_c[i]; card_c[i]=card_c[j]; card_c[j]=temp; } nn=28; //残りのカード枚数 oo=0; //開けたカード枚数 for (i=0;i<28;i++) document.images[i].src="c.jpg"; //全カードを裏で配置 startCount(); } function Card(m){ if (oo==0){ //開けたカードが1枚目の時 i1=m; //カード番号保存 c1=card_c[m].charAt(0); if (c1!="n") { //まだ取り終わっていないカードなら oo=1; //開けたカード枚数更新 document.images[m].src=card_c[m]; //カードを開ける } } else if (oo=1){ //開けたカードが2枚目の時 i2=m; //カード番号保存 c2=card_c[m].charAt(0); if (i1!=m && c2!="n"){ //一枚目と同じでなく取り終わっていないカードなら document.images[m].src=card_c[m]; //カードを開ける if (c1==c2) { timerID=setTimeout("Match(i1,i2)",300); card_c[i1]="n"; //一致したカードを取りきったことにする card_c[i2]="n"; nn=nn-2; } else timerID=setTimeout("UnMatch(i1,i2)",300); oo=0; //開けたカードの枚数を0に } } } function Match(m1,m2){ document.images[m1].src="n.jpg"; //カードを取り去る(ブランクパターンにする) document.images[m2].src="n.jpg"; //カードを取り去る(ブランクパターンにする) if (nn==0){ stopCount(); if (cnt <= 30){ alert(cnt + '秒!あなたは神です・・・\n色々頑張り過ぎて体壊さないでね。'); location.href = "trump3/trump3.html"; } else if(cnt <= 40){ alert(cnt + '秒!早い!!\nよ!大統領!'); location.href = "trump3/trump3.html"; } else if(cnt <= 50){ alert(cnt + '秒!\nもっかいやり直して!\n特典みれるまで頑張れ!'); Shuffle(); } else if(cnt <= 60){ alert(cnt + '秒!\nボンヤリしないで!!'); Shuffle(); } else { alert(cnt + '秒!\n何があったんだ・・・!!'); Shuffle(); } } } function UnMatch(m1,m2){ document.images[m1].src="c.jpg"; //カードを裏返す document.images[m2].src="c.jpg"; //カードを裏返す } function showCount(){ cnt++; // カウントアップしていく。 document.frm.countShow.value = cnt ; } function startCount(){ cnt = 0; // まずリセット。 PassageID = setInterval('showCount()',1000); } function stopCount(){ clearInterval(PassageID); // タイマーをクリア。 } </script>
55〜73行目で、クリアした時間ごとに表示されるアラートを分けています。さらに40秒以内だと、新ページへリンクされます。
79〜89行目は、ファーストステージにはなかったカウントアップするプログラムが入っています。
12行目と24行目に、カウントスタート・ストップを追加しています。
HTMLのマークアップの方は、ファーストステージとほぼ一緒なのですが、カウントアップの秒表記を追加してあげましょう。
<input name="countShow" type="button" class="buu2" value="" size="3">
ぶっきらぼうな説明で申し訳ございませんが、以上となります!