我正在做“十五拼图”游戏。我只是一个初学者,所以我选择了这个项目来实现。我的问题是随机算法:
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%的随机随机播放都是无法解决的。所以我为这个游戏找到了math formula at wikipedia.org,解释了如何避免这种情况。
这里的修改算法也不起作用。我知道的方式是alert
东西:它只启动2次而不是31次。
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();
}
}
}
怎么了?二维数组不起作用。如果你有任何问题 - 请问。
只是为了说清楚:for
和i
的2个j
循环应该像这样[ this is " var i" -->[1,3,4,5,7], this is "var i" too-->[5,7,9,14,15]]
制作一个二维数组。每个i
内都有j
。带for
的{{1}}循环应计算每个var a
内j
的数量。如果i
的数量是偶数,则代码完成并且已完成随机播放,否则应再次进行随机播放。
答案 0 :(得分:0)
var nextId = cerIdNum + j;
在那个小提琴中,我没有看到cerIdNum
宣布&amp;既不是本地变量也不是全局变量,我想这是curIdNum
答案 1 :(得分:0)
请使用以下algorithm
的定义,如果有效,请告诉我们。基本上,警报消息只会出现两次,因为存在未定义变量的用法。出于说明的目的,我已在问题点发生的位置发表评论。由于这些问题,您的脚本会突然停止执行,从而导致您描述的行为。
哦顺便说一下 - 我没有时间浏览提供的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();
}
}
}
答案 2 :(得分: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();
}
}