- 締切済み
15パズルの作り方が分かりません!
ご閲覧ありがとうございます。 実は大学で、「15パズル」のプログラムを作れという課題が出たのですが、上手く動きません。プログラミングに関してはほぼ初心者で、どこがどうまちがっているのか、どのように直したらきちんと動くのかが全く分かりません・・・。!il||li(っω-`。)il||li 助けて下さい!お願いします(´;ω;`) 以下が私がいじっていたプログラムです <html> <head> <title>15パズル</title> <script type="text/javascript"> // 初期盤面を生成するプロシージャ function gstart() { var checked=new Array(15); // 「使用済み」のチェック用 var i, j; // カウンタ var n; // パネル番号 var p; // パリティ計算用 var parity = false; // 奇順列の状態 var flag; // その数が使用済みかどうか while(parity==false){ // 奇順列の間は繰り返す for(i=0;i<16;i++) checked[i]=false; // すべて未使用状態化 for(i=0;i<16;i++){ // パネル番号を順に決める flag = false; // 最初はパネル番号未決定とする while(flag==false){ // 未使用状態の間は繰り返す n = Math.floor(Math.random()*16); // nに0~8の乱数を設定 if(checked[n]==false){ // nが未使用なら pnum[i] = n; // i番目のパネルのパネル番号をn checked[n] = true; // nを使用済みにする flag = true; // パネル番号決定 } } } p = 0; // 偶順列か奇順列かの計算 for(i=0;i<15;i++){ for(j=i+1;j<16;j++){ if(pnum[i]!=0 && pnum[j]!=0){ if(pnum[i]>pnum[j]) p++; // 互換の数を勘定 } } } if((p%2)==0) parity=true; // 互換の数が偶数なら偶順列 } for(i=0;i<16;i++){ if(pnum[i]==0) document.forms[0].elements[i].value= ""; else document.forms[0].elements[i].value= pnum[i]; } } function move(obj) { var i,j,k; for(j=0;j<16;j++) if(obj.value==pnum[j]) i=j; // objのパネル位置を調べる for(j=-4;j<2;j=j+3){ // 上下左右の隣接パネルの調査 k = i+j; if((k>=0&&k<16) && ((Math.floor(i/2)==Math.floor(k/2))||(i%2==k%2))){ if(pnum[k]==0){ // 隣が空なら入れ替え pnum[k] = pnum[i]; document.forms[0].elements[k].value= pnum[k]; pnum[i] = 0; document.forms[0].elements[i].value= ""; } } } } </script> </head> <body> <h1>15パズル</h1> [開始]ボタンクリックでスタート。 <form id="Form1"> <script type="text/javascript"> var i; var s; var pnum=new Array(16); // パネル番号記憶用 for(i=0;i<16;i++){ document.write("<input style='width:30px; height:30px;' type='button' value='"+(i+1)+"' onClick='move(this)'>"); if((i+1)%4==0) document.write("<br />"); } document.forms[0].elements[15].value= ""; </script> <br /> <input style="width:60px; height:30px;" type="button" value="開始" onClick="gstart()"><br /> </form> </body> </html>
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- yuu_x
- ベストアンサー率52% (106/202)
課題は自分でやりましょう。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta ... <title>15パズル</title> <script type="text/javascript"> var flags = 0; var w = 0; function clickHandler( evt ) { var target = evt.target || evt.srcElement; if( /^btn(\d+)$/.test( target.name ) ) { move( target.form.elements, RegExp.$1 ); } else if( target.name == 'start' ) { gstart( target.form.elements ); } } function gstart( es ) { var n = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, '' ]; var mask = 1; flags = 0; n.sort( function( a, b ) { return Math.random( ) - 0.5; } ); // Shuffle for( var i=1; i<=16; i++ ) { es[ 'btn' + i ].value = n[ i - 1 ]; if( n[ i - 1 ] == '' ) w = i; if( i == n[ i - 1 ] ) flags |= mask; mask <<= 1; } showFlags( es ); } function move( es, n ) { var mask = 1 << ( w - 1 ); var mask2 = 1 << ( n - 1 ); switch( n - w ) { case -1 : case -4 : case 1 : case 4 : if( es[ 'btn' + n ].value == w ) { flags |= mask; if( flags == 0x7FFF ) alert( 'Complete!!' ); } else if( es[ 'btn' + n ].value == n && flags & mask2 ) { flags ^= mask2; } es[ 'btn' + w ].value = es[ 'btn' + n ].value; es[ 'btn' + n ].value = ''; w = n; } showFlags( es ); } function showFlags( es ) { var b = ''; var mask = 1; for( var i=1; i<=16; i++ ) { b += ( flags & mask ? '1' : '0' ) + (i%4 == 0 ? ' ' : ''); mask <<= 1; } es[ 'flags' ].value = b; } </script> <style type="text/css"> .fifteenPuzzle .panel input { width : 2.3em; height : 2.3em; padding : 3px; background-color: white; } </style> </head> <body> <h1>15パズル</h1> [開始]ボタンクリックでスタート。 <form action="#" onclick="clickHandler( event );" class="fifteenPuzzle"> <p class="panel"> <script type="text/javascript"> for( var i=1; i<=16; i++ ) { document.write( '<input type="button" value="', i!=16 ? i : '' , '" name="btn', i , '">', i%4==0 ? '<br>' : '' ); } </script> </p> <p>flags : <input type="text" name="flags" value="" size="25"></p> <p><input type="button" value="開始" name="start"></p> </form> </body> </html>
- babu_baboo
- ベストアンサー率51% (268/525)
ためになるのか?たしょうわかりにくく。 for(j=-4;j<2;j=j+3){ k = i+j; if((k>=0&&k<16) && ((Math.floor(i/2)==Math.floor(k/2))||(i%2==k%2))){ ↓ for(j=0;j<4;j++){ k = i+[-4,-1,1,4][j]; if(!(k/16|0)) {
お礼
ご解答ありがとうございます! 一人で出来るように、一から勉強し直そうと思います・・・。 本当にありがとうございました!
お礼
ありがとうございます! この長期休暇の間に一から勉強し直そうと思います。 本当にありがとうございました!