プロが教えるわが家の防犯対策術!

ご閲覧ありがとうございます。
実は大学で、「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>

A 回答 (2件)

ためになるのか?たしょうわかりにくく。



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)) {
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/08/16 11:32

課題は自分でやりましょう。



<!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>
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/08/16 11:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!