「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の数が偶数の場合、コードは終了し、シャッフルが完了します。そうでない場合は、もう一度シャッフルを行う必要があります。i
j
[ this is " var i" -->[1,3,4,5,7], this is "var i" too-->[5,7,9,14,15]]
i
j
for
var a
j
i
j