• 締切済み

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>

みんなの回答

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.2

課題は自分でやりましょう。 <!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>

okara139
質問者

お礼

ありがとうございます! この長期休暇の間に一から勉強し直そうと思います。 本当にありがとうございました!

回答No.1

ためになるのか?たしょうわかりにくく。 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)) {

okara139
質問者

お礼

ご解答ありがとうございます! 一人で出来るように、一から勉強し直そうと思います・・・。 本当にありがとうございました!

関連するQ&A