パズルゲームを作ろう2
最後の山場ッピ!
クリックしたあとパズルを入れ替えるプログラムを書くッピ!
出し惜しみはなしッピ!
一気に公開するッピよ~
<!-- 見えない部分 -->
<html>
<head>
<script src="http://code.jquery.com/jquery.min.js"></script>
<style>
/* CSSのデザインです */
ol {margin: auto;
width: 50%;
text-align: center;}
li {
padding: 5px;
margin: 2px;
background-color: #F0F0F0;
border: 2px solid #666;}
</style>
<!-- ↓この下にピースのデータを入力してね!↓ -->
<script>
//ピース情報
let puzzle = ['家康','秀忠','家光','家綱','綱吉','家宣','家継','吉宗','家重','家治','家斉','家慶','家定','家茂','慶喜',];
let barabara = [];
let N = Math.floor( Math.random() * puzzle.length );
//HTMLの書き出し
document.write('<ol>');
//ピースのシャッフル
let i = 0;
let n = 0;
for (i=0 ;i < puzzle.length;){
n = 0;//変数をリセットします
N = Math.floor( Math.random() * puzzle.length );
while(n < puzzle.length){
if (puzzle[N] != barabara[n]){n++;}
else {break;}
}
if (n >= puzzle.length){
document.write('<li draggable="true" ondragstart="before(event)" ondragover="drag(event)" ondrop="after(event)" id="' +i+ '">' + puzzle[N] + '</li>');
barabara.push(puzzle[N]);//入れ替えた番号をリストに記憶
i++;//iにプラス1を追加する
}
}
//olリストを終わります
document.write('</ol><br>');
</script>
</head>
<!-- ↓ここから見える部分↓ -->
<body>
<!-- ↓この下にピースを判別するプログラムを入力してね!↓ -->
<script>
//パズルに文字の代入するための変数です
let copy_txt;
//ドラッグ中の動作・変更前・変更後を決めるプログラムです
function before(event) {
copy_txt = event.target;
event.dataTransfer.setData("text/plain", event.target.innerHTML);
event.dataTransfer.effectAllowed = "move";
}
function drag(event) {
event.preventDefault();
event.dataTransfer.dropEffect = "move";
}
function after(event) {
event.preventDefault();
event.stopPropagation();
copy_txt.innerHTML = event.target.innerHTML;
event.target.innerHTML = event.dataTransfer.getData("text/plain");
//パズルの場所が合っているか判定するためのプログラムです
n = 0;
for (i = 0 ;i < puzzle.length; i++){
if ($('#'+i).text()==puzzle[i]){
$('#'+i).css('background','#ffc0cb');
n++;}
}
//パズルが完成したかを判定するためのプログラムです
if (n >= puzzle.length){alert('クリア!');}
}
</script>
<!-- ここまで! -->
</body>
</html>
コードの解説
ここからは上のコードを解説するッピよ~!
パズルを入れ替えるためのベースプログラム( jquery )を組み込む
まずは入れ替えるためにベースのプログラムセットを入れるッピ!
このJqueryを使えば、id( # ) や class( . )の要素の変更が楽になるッピよ~
<script src="http://code.jquery.com/jquery.min.js"></script>
というコードを<head></head>に入力するッピ!
パズルを入れ替えるためのカラのっぽの箱を用意する
今度はパズルを入れる箱を用意するッピ
<body><body>に<script></script>を入れてプログラムを組むッピよ~
let copy_txt;
これで copy_txt という変数にカラの箱を用意することができたッピ!
クリック操作前後のプログラム
次はクリック操作前後のプログラムコードっぴ!
function before(event) {
copy_txt = event.target;
event.dataTransfer.setData("text/plain", event.target.innerHTML);
event.dataTransfer.effectAllowed = "move";
}
function drag(event) {
event.preventDefault();
event.dataTransfer.dropEffect = "move";
}
function after(event) {
event.preventDefault();
event.stopPropagation();
copy_txt.innerHTML = event.target.innerHTML;
event.target.innerHTML = event.dataTransfer.getData("text/plain");
という部分ッピね~
このプログラムを詳しく解説するッピ!
ドラッグ前(パズルピース選択時)のプログラム
最初はパズルのピースを選択するプログラムッピ!
function before(event) {
copy_txt = event.target;
event.dataTransfer.setData(“text/plain”, event.target.innerHTML);
event.dataTransfer.effectAllowed = “move”;
}
という意味ッピ!
ドラッグ中(パズルピースを動かす)プログラム
次はパズルのピースを動かす(ドラッグする)プログラムッピ!
function drag(event) {
event.preventDefault();
evente.dataTransfer.dropEffect= “move”;
}
という意味ッピね!
この
event.preventDefault();って?
もともと本来こうなる~
っていうプログラムを停止して、新しい情報を上書きするのに重要になる
ッピ!
このあとの書き換えプログラムに必要ッピよ~
ドラッグ後(パズルピース変更)プログラム
最後にパズルピースを動かしたあと変更するプログラムッピ!
function after(event) {
event.preventDefault();
event.stopPropagation();
copy_txt.innerHTML = event.target.innerHTML;
event.target.innerHTML = event.dataTransfer.getData(“text/plain”);
そして忘れてはいけないのが、リストの変更ッピ!
if (n >= puzzle.length){
document.write('<li draggable="true" ondragstart="before(event)" ondragover="drag(event)" ondrop="after(event)" id="' +i+ '">' + puzzle[N] + '</li>');
barabara.push(puzzle[N]);//入れ替えた番号をリストに記憶
i++;//iにプラス1を追加する
}
最初にリストを作る部分の<li></li>タグを↑に書き換えて
ドラッグできるように変更したッピ!
これは
document.write(
‘<li draggable=”true” ondragstart=”before(event)” ondragover=”drag(event)“ondrop=”after(event)” id=”‘ +i+ ‘”>’ + puzzle[N] + ‘</li>’
);
という意味ッピよ~!
なるほどな~
難しいけどなんとなくわかったかも?
パズルが合っているか判定するプログラム
プログラムが合っているか判定するには if文 を使うッピ!
//パズルの場所が合っているか判定するためのプログラムです
n = 0;
for (i = 0 ;i < puzzle.length; i++){
if ($('#'+i).text()==puzzle[i]){
$('#'+i).css('background','#ffc0cb');
n++;}
}
//パズルが完成したかを判定するためのプログラムです
if (n >= puzzle.length){alert('クリア!');}
というコードっピね~!
これは
n= 0;
for (i = 0 ;i < puzzle.length; i++){
if ($(‘#’+i).text()==puzzle[i]){
$(‘#’+i).css(‘background’,‘#ffc0cb’);
n++;}
}
if (n >= puzzle.length){alert(‘クリア!’);}
とい意味ッピ!
見た目をわかりやすいように変更する
最後は見た目をもう少しわかりやすく変更するッピね~
最初の<head></head>にあるコードに注目するッピ!
<style>
/* CSSのデザインです */
ol {margin: auto;
width: 50%;
text-align: center;}
li {list-style-type: none;
padding: 5px;
margin: 2px;
background-color: #F0F0F0;
border: 2px solid #666;}
</style>
というコードッピよ~
これはCSSといって、WEBページの見た目を変えるプログラムッピ!
<style>
ol {
margin: auto;
width: 50%;
text-align: center;}
li {
padding: 5px;
margin: 2px;
background-color: #F0F0F0;
border: 2px solid #666;}
</style>
という意味ッピよ~
見た目ってこうやって変えるんだな~
CSSは必ず<head></head>の中に書くッピよ!
間違ったらそのままホームページに文字として書かれてしまうッピネ
それじゃあユウキくん、さっそくプログラムを組むッピ!
オッケー!
できたぁ~!
ユウキくんすごいッピ!
プログラマーの素質があるッピよ~
全体のコードの確認
<!-- 見えない部分 -->
<html>
<head>
<script src="http://code.jquery.com/jquery.min.js"></script>
<style>
/* CSSのデザインです */
ol {
margin: auto;
width: 50%;
text-align: center;}
li {
padding: 5px;
margin: 2px;
background-color: #F0F0F0;
border: 2px solid #666;}
</style>
<!-- ↓この下にピースのデータを入力してね!↓ -->
<script>
//ピース情報
let puzzle = ['家康','秀忠','家光','家綱','綱吉','家宣','家継','吉宗','家重','家治','家斉','家慶','家定','家茂','慶喜',];//パズルピースを作ります
let barabara = [];//バラバラにしたピースの順番をここに記録します
let N = Math.floor( Math.random() * puzzle.length );//乱数を作ります
//HTMLの書き出し
document.write('<ol>');
//ピースのシャッフル
let i = 0;//パズルピースを乱数でシャッフルするための変数です
let n = 0;//パズルピースがすでに記録されてものか判定するための変数です
for (i=0 ;i < puzzle.length;){//パズルのピース番号全部までこのプログラムを続けます
n = 0;//変数をリセットします
N = Math.floor( Math.random() * puzzle.length );//乱数を作ります
while(n < puzzle.length){//パズルピースの数よりnが小さければ以下のプログラムを繰り返します
if (puzzle[N] != barabara[n]){n++;}//乱数で決めたピースナンバー(puzzle[N])が、もしまだ登録されていないピース番号(!= barabara[n])ならnにプラス1をします
else {break;}//登録しているのならキャンセル
}
if (n >= puzzle.length){//変数nのナンバーがパズルのピース番号以上になったら
document.write('<li draggable="true" ondragstart="before(event)" ondragover="drag(event)" ondrop="after(event)" id="' +i+ '">' + puzzle[N] + '</li>');//ulを書き出します
barabara.push(puzzle[N]);//入れ替えた番号をリストに記憶
i++;//iにプラス1を追加する
}
}
//olリストを終わります
document.write('</ol><br>');
</script>
</head>
<!-- ↓ここから見える部分↓ -->
<body>
<!-- ↓この下にピースを判別するプログラムを入力してね!↓ -->
<script>
//パズルに文字の代入するための変数です
let copy_txt;
//ドラッグ中の動作・変更前・変更後を決めるプログラムです
function before(event) {
copy_txt = event.target;//要素のコピー
event.dataTransfer.setData("text/plain", event.target.innerHTML);//要素を取得し、文字列データを上書きします
event.dataTransfer.effectAllowed = "move";//ドラッグした側が、移動したときのみ動作します
}
function drag(event) {
event.preventDefault();//キャンセル可能であるプログラムをストップします
event.dataTransfer.dropEffect = "move";//ドラッグされた側が、移動したときのみ動作します
}
function after(event) {
event.preventDefault();//キャンセル可能であるプログラムをストップします
event.stopPropagation();//キャンセル可能であるプログラムの親要素もストップします
copy_txt.innerHTML = event.target.innerHTML;//要素のコピー
event.target.innerHTML = event.dataTransfer.getData("text/plain");//文字列データを取得します
//パズルの場所が合っているか判定するためのプログラムです
n = 0;
for (i = 0 ;i < puzzle.length; i++){//パズルピース全部の数まで繰り返します
if ($('#'+i).text()==puzzle[i]){//もし#(ID)+i(今計算している数)の数値のある文字列とパズルピース番号の文字列と等しいとき
$('#'+i).css('background','#ffc0cb');//背景を赤くします
n++;//nに+1を加えます
}
}
//パズルが完成したかを判定するためのプログラムです
if (n >= puzzle.length){alert('クリア!');}//nがパズルピース番号より大きいとき、クリアと表示します
}
</script>
<!-- ここまで! -->
</body>
</html>
- パズルピースはリスト配列で作る
- パズルのシャッフルはMath.floor( Math.random() * パズルピース変数 )とで乱数を作って行う
- パズルをバラバラに登録するリストを新たに作り、変数.push(乱数で選んだピース)で登録する
- パズル移動のプログラムは DataTransfer.setData/dataTransfer.effectAllowed/dataTransfer.dropEffect/event.dataTransfer.getDataなどの関数を使って行う
- パズルのピース位置の正解判定は if文 で判定できる
上手くできたッピか?
これからも色んなゲーム作りやプログラムの解説をしていくッピ!
次回も楽しみにしているッピよ~~!