0

「15パズル」というゲームをやっています。私は初心者なので、このプロジェクトを実装することにしました。私の問題はシャッフルアルゴリズムです:

function shuffle() {

    $('td').empty();
    var p = 0;
    var f = 0;

    do {
        var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
        var rand = arr[Math.floor(Math.random() * arr.length)];
        if ($('#' + rand).is(':empty')) {
            p = p + 1;
            document.getElementById(rand).textContent = p
            var f = $('td').not(":empty").length;
        } else {}
    } while (f < 15)

これはうまく機能しますが、私のようなランダム シャッフルのほぼ 50% は解けないと聞いています。そこで、wikipedia.org でこのゲームの数式を見つけて、それを回避する方法を説明しました。

これも機能しない修正されたアルゴリズムです。私が知っている方法ではalert、31 回ではなく 2 回しか起動しません。

array = [];

function algorithm (){
   // alert('works')
    for (var c=16; c<17; c++){
        document.getElementById(c).textContent = '100';
    }     

    for (var i=1; i<16; i++){ 
        var curId = document.getElementById(i).id;
        var curIdNum = Math.floor(curId);
        alert('works')
        var curIn = document.getElementById(i).textContent;
        var curInNum = Math.floor(curIn);
        array.push(i);
array[i] = new Array();
        for (var j=1; j<15; j++){
            var nextId = curIdNum + j; //curIdNum NOT cerIdNum
            var nextIn = document.getElementById(nextId).textContent;
        //alert('works')
        if (nextId < 16){
            var nextInNum = Math.floor(nextIn);
            if (curInNum > nextInNum){
                array[i].push(j) 
            }
        }
    }            

    var sum = 0; 
    for (var a=0; a<15; a++){
        var add = array[a].length;
        sum = sum + add;
    }            
    var end = sum + 4;
    if (end % 2 == 0){
        document.getElementById('16').textContent = "";
    }            
    else {       
        shuffle();
    }            
}                
}

質問は同じです:

どうしたの?2 次元配列は機能しません。質問がある場合は、お問い合わせください。

明確にするために、 andを使用した 2 つのforループは、このような 2 次元配列を作成する必要があります。それぞれの中に があります。withのループは、 each 内のの数をカウントする必要があります。sの数が偶数の場合、コードは終了し、シャッフルが完了します。そうでない場合は、もう一度シャッフルを行う必要があります。ij[ this is " var i" -->[1,3,4,5,7], this is "var i" too-->[5,7,9,14,15]]ijforvar ajij

4

3 に答える 3

0

コードを完全に書き直すことで解決策を見つけました。みんな助けてくれてありがとう!

何が機能するかは次のとおりです。

function shuffle (){
press = 1;
$('td').empty().removeClass();
p=0;
var f;

do {
    var arr=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
    var rand=arr[Math.floor(Math.random()*arr.length)];
        if ($('#'+ rand).is(':empty')){
            p = p + 1;
            document.getElementById(rand).textContent = p
            var f = $('td').not(":empty").length;
        }
        else{}   
}while(f < 15){
    winChance();
}

}
function winChance (){
array = [];
for (i=1;i<16;i++){
    array[i]= new Array();
    var currentId = $('#' + i).attr('id');
    var currentIn = $('#' + i).html()

    var currentIdNum = parseInt(currentId, 10);
    var currentInNum = parseInt(currentIn, 10);
    for (j=1;j<16;j++){
        var nextId = currentIdNum + j;
        if (nextId < 16){
            var nextIn = $('#' + nextId).html();
            var nextInNum = parseInt(nextIn, 10);
            if (currentInNum > nextInNum){
                array[i].push(j);
            }
        }
    }
}
checkSum();
}

function checkSum(){
var sum = 0; 
for (var a=1; a<16; a++){
    var add = array[a].length;
    sum = sum + add;
}            
var end = sum + 4;
if (end % 2 == 0){}            
else {       
    shuffle();
}            
}
于 2013-08-12T15:38:59.753 に答える
0

以下の定義を使用してalgorithm、これが機能するかどうかをお知らせください。基本的に、未定義の変数が使用されていたため、アラート メッセージは 2 回しか送信されませんでした。説明のために、問題点が発生した場所にコメントを付けました。これらの問題により、スクリプトの実行が突然停止し、説明した動作が発生します。

ところで、提供された Wiki リンクを確認する時間がなかったので、ロジックが正しいことを確認する必要があります。ただし、ご指摘の動作の原因となったエラーは確実に解決しました。

余談ですが、jQuery の使用を検討してください。コードはずっときれいになります...

function algorithm (){
       // alert('works')
        for (var c=16; c<17; c++){
            document.getElementById(c).textContent = '100';
        }     

        for (var i=1; i<16; i++){
            var curId = document.getElementById(i).id;
            var curIdNum = Math.floor(curId);
            alert('works')
            var curIn = document.getElementById(i).textContent;
            var curInNum = Math.floor(curIn);
            array.push(i);
            for (var j=1; j<15; j++){
                var nextId = curIdNum + j; //curIdNum NOT cerIdNum
                var nextIn = document.getElementById(nextId).textContent;
            //alert('works')
            if (nextId < 16){
                var nextInNum = Math.floor(nextIn);
                if (curInNum > nextInNum){
                    array.push(j) //array[i].push does not make sense
                }
            }
        }            

        var sum = 0; 
        for (var a=0; a<15; a++){
            var add = array.length; //array[1].length does not make sense
            sum = sum + add;
        }            
        var end = sum + 4;
        if (end % 2 == 0){
            document.getElementById('16').textContent = "";
        }            
        else {       
            shuffle();
        }            
    }                
}
于 2013-08-12T05:17:15.970 に答える
0
  var nextId = cerIdNum + j;

cerIdNumそのフィドルでは、これが宣言され、ローカル変数としてもグローバル変数としても定義されていないことがわかりません。curIdNum

于 2013-08-12T04:59:58.873 に答える