• 締切済み

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

  • ネスケで文字化けするjavascript

    下記はenterキーを押した時に次のテキストボックスなどにフォーカスを移動するjavascriptです。しかし、ネスケだとテキストボックスに入力した文字が文字化けしてしまいます。 <!-- ns4 = (document.layers)? true:false ie4 = (document.all)? true:false function cf() { for (i = 0; i < document.forms[0].elements.length; i++) { if ((ns4) && (document.forms[0].elements[i].type != "hidden") || (ie4) && (document.forms[0].elements[i].type != "hidden" )) { document.forms[0].elements[i].focus() break } } } function keyDown(e) { if (ns4) {PKey=e.which; el = e.target.type ; sk = e.modifiers} if (ie4) {PKey=event.keyCode; el = event.srcElement.tagName; sk = event.shiftKey} if (PKey == "13") { if (el.toLowerCase() != "textarea") { keyDowntest(e) return false; } else { if ((ns4) && (sk == '4') || (ie4) && (sk)) { keyDowntest(e) return false; } } } } function keyDowntest(e) { for (var i = 0; i < document.forms[0].elements.length; i++) { if ((ie4) && (document.forms[0].elements[i] == event.srcElement) || (ns4) && (document.forms[0].elements[i] == e.target)) { if ((i + 1) == document.forms[0].elements.length) document.forms[0].elements[0].focus() else for (; i < document.forms[0].elements.length; i++) { if ((ns4) && (document.forms[0].elements[i+1].type != "hidden") || (ie4) && (document.forms[0].elements[i+1].type != "hidden" )) { document.forms[0].elements[i+1].focus() break } } break } } } document.onkeydown = keyDown if (ns4) document.captureEvents(Event.KEYDOWN) //-->

  • 正規表現をまとめることってできますか?

    正規表現をまとめるにはどうしたらよいでしょうか? var str = document.forms[0].school_list.value; if (str == "") return; var result = ""; for (var i = 0; i < str.length; i++) result = str.replace(/,/g,'\n'); document.forms[0].result_school_list.value = result; document.forms[0].result_school_list.select(); var str = document.forms[0].result_school_list.value; if (str == "") return; var result = ""; for (var i = 0; i < str.length; i++) result = str.replace(/、/g,'\n'); document.forms[0].result_school_list.value = result; document.forms[0].result_school_list.select();

  • checkbox必須チェック

    function hissuCheck(form) { var paramArray = Array("…24個"); var alrtArray = Array("…24個"); var len = paramArray.length; for(i=0; i<len; i++) { var obj = form.elements[paramArray[i]]; if(obj.type == "text") { if(obj.value == "") { alert(alrtArray[i]+"は必須入力です"); form.elements[paramArray[i]].focus(); return false; } } else if(obj.type == "select-one" || obj.type == "select-multi") { for(varSelected=0, j=0; j<obj.options.length; j++) { if(obj.options[j].selected)varSelected+=obj.options[j].value; } if(varSelected == 0) { alert(alrtArray[i]+"は必須入力です"); form.elements[paramArray[i]].focus(); return false; } } else { for(varChecked=0, k=0; k<obj.length; k++) { if(obj[k].type == "checkbox") { if(obj[k].checked)varChecked++; } } if(varChecked == 0) { alert(alrtArray[i]+"は必須入力です"); return false; } } } return true; } 必須チェックですが、最後のチェックボックスだけがチェックしても「…は必須です」とアラートが表示されてしまいます。どうか宜しくお願いします

  • フォームの要素同士の足し算

    こんにちは。フォームの要素同士の足し算をJavascriptで行おうとしているのですが、要素を文字列と解釈するらしく、うまく演算ができません。。。。 function calcTOTAL(){ var a=10; var b=20; var c=a+b; // この場合は30で演算もOK var sub0; var sub1; if(isNaN(document.forms[0].elements['aaa'].value)){ sub0=0; }else{ sub0 = document.forms[0].elements['aaa'].value; } if(isNaN(document.forms[0].elements['bbb'].value)){ sub1=0; }else{ sub1 = document.forms[0].elements['bbb'].value; } var c=sub0+sub1; // これは文字列同士になってしまう。。。 } どちらも数字でなければ 0 が入って 0+0になるはずなのですが 結果は 00 になってしまいます。 どのように修正したら 数字同士の演算ができるようになるのでしょうか?

  • javascriptの九九の表の書き換えについて

    var a; for (a=1; a<10; a++) if (a<=1){ document.write("   "+a); }else{ document.write(" "+a);} document.write("<br>"); document.write("---------------------------------"); document.write("<br>"); var i, j; for (i=1; i<10; i++) { document.write(i+"|"+" "); for (j=1; j<10; j++) { var k = i*j; if ( k > 81 ) { break; } if (k>=10){ document.write(" "+k+" "); }else { document.write(" "+k);} } document.write("<br />"); } forを使った九九の表はできたのですが これをwhileを使ったコードに書き換えるにはどうしたらいいでしょうか?

  • 型変換を行った後で計算をする方法

    DBには、テキスト型で保存している数字があります。 それをJSP側でINT型に変換して、 計算を行いたいのですが、何か良い方法はありませんか? 下記のままだと常に0が表示されてしまいます。 どうか良いアドバイスをお願いします。 function changeYosan() {  var lstYosan = document.form.elements("_uriageYosan");  var lstJisseki = document.form.elements("_uriageJisseki");  var lstNobi = document.form.elements("_nobiritsu"); for(i = 0 ; lstYosan.length > i ; i ++ ){   lstNobi[i].value = lstYosan[i].value.replace(",","") /     lstJisseki[i].value * 100; if(isNaN(lstNobi[i].value)){   lstNobi[i].value = 0; } } }

  • チェックボックスの選択チェック

    ラジオボタンの選択チェック、セレクトボタンの選択チェックのあとにチェックボックスの選択チェックをしたいのですが、どのように入れればよいのでしょうか。教えてください。 ↓参考までに↓ function check() { var flag=0; if( document.form1.seibetu.length){ flag=1; var i; for(i=0; i<document.form1.seibetu.length; i++) if(document.form1.seibetu[i].checked)flag=false; } if(flag){ alert('性別が選択されていません'); return false; } if(document.form1.nenrei.value=="")flag=true; if(flag){ alert('年齢が選択されていません'); return false; } if( document.form1.Q1.length){ flag=1; var i; for(var i=0; i<document.form1.Q1.length; i++) if(document.form1.Q1[i].checked)flag=false; if(flag){ alert('Q1が選択されていません'); return false; } else {★★★ここに入れたい★★★   ;} } }

  • プルダウンメニューを選択していない時に送信ボタンを押した場合、(必須の)アラートを表示したい。

    過去にほぼ同じ質問がありましたが、それでも解決出来なかったので質問させていただきました。 フォームで未入力の項目に対してアラートとフォーカスされるようにしました。 そこにプルダウンメニューを加えたものを作ろうとしたのですが、アラートの内容が全部同じ(職業が選択されていません)になってしまった事と、アラートは表示されたのですが、プルダウンメニューを選択してもアラートが出続けてしまいます。 プルダウンメニューが未選択の場合にのみアラートを表示するにはどうしたらよいでしょうか。 <SCRIPT language="JavaScript"> <!-- function chkHissu(frm){ var hissu=Array('name','kana','age','mail','sex','syumi'); var hissu_nm = Array('名前','フリガナ','年齢','メールアドレス','性別','趣味'); var len=hissu.length; for(i=0; i<len; i++){ var obj=frm.elements[hissu[i]]; if(obj.type=='text' || obj.type=='textarea'){ if(obj.value==''){ alert(hissu_nm[i]+'は必須入力項目です'); frm.elements[hissu[i]].focus(); return false; } }else{ for(var j=0, chk=0; j<obj.length; j++){ if(obj[j].checked) chk++; } if(chk==0){ alert(hissu_nm[i]+'は必須入力項目です'); return false; } } } return true; } function check(value){ //数字かどうかのチェック if(isNaN(value)){ alert("数値を半角で入力してください。"); //警告コメント document.form1.age.focus(); return false; } //入力があるかどうかのチェック if(!value){ alert("年齢を入力してください。"); //警告コメント document.form1.age.focus(); return false; } } function checkAd(address){ if(!address){ alert("メールアドレスを入力してください。"); } else if(address.indexOf("@",0)<=0){ alert("メールアドレスが正しくありません。"); document.form1.mail.select(); return false; } } //-- </SCRIPT> ご存知の方がいらっしゃいましたらご教授願います。

  • JavaScriptでどちらの書き方が実行速度が速いですか?

    以下の2つの書き方は厳密には(内部処理のステップ的には)どちらが早いでしょうか? for (var i=0; i<10; i++) {  if (value == "dummy")  {   continue;  }  document.write(value); } for (var i=0; i<10; i++) {  if (value != "dummy")  {   document.write(value);  } }

  • 何を言っているのか教えて下さい

    Dreamweaverで出てきたものなのですが意味が分からないんで困ってます教えて下さい. function MM_swapImgRestore() { //v3.0 var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc; } function MM_preloadImages() { //v3.0 var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array(); var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++) if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}} } function MM_findObj(n, d) { //v4.0 var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) { d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);} if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n]; for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document); if(!x && document.getElementById) x=document.getElementById(n); return x; } function MM_swapImage() { //v3.0 var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3) if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];} }