用Javascript编写24点计算器

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
当然,这个游戏对成人来说太简单了一些,我们研究的是,当我们面对4个数的时候,需要确定它们是不是能算出24,所有算法一共有几种?如果这样的任务让人脑来研究,所要花的时间就非常多,幸好我们可以使用计算机来帮助我们解决这个问题。
一般我们使用穷举法来列出算出24点的所有可能(这是计算机最擅长的工作了),问题的关键是如何穷举,才能把所有的可能列出,还有如何解决计算中的小括号,因为我们可以在计算过程中使用小括号改变运算顺序。下面我就这两个问题展来说:
var v6=execute(v5,o2,v3);
if(v6<0 || Math.round(v6)!=v6) continue;//跳过负数和小数
for(var n=0;n<4;n++){
var o3=opration[n];
var v7=execute(v6,o3,v4);
if(v7==24){
}
for(var x=0;x<4;x++){
if(temp[x]==j) {temp[j]=-1;break;}
}
for(var x=0;x<4;x++){
if(temp[x]==m) {temp[m]=-1;break;}
}
for(var x=0;x<4;x++){
if(temp[x]!=-1) {v4=number[temp[x]];break;}
1.取得输入数字
var dian24=document.getElementById('dian24');//从一个输入框中取数字
var v=dian24.value.replace(/^\s+|\s+$/g, "");//去除头尾空格
var number=v.split(' ');//以空格为分隔转换为数组
for(var j=0;j<4;j++){
var o1=opration[j];
var v5=execute(v1,o1,v2);
if(v5<0 || Math.round(v5)!=v5) continue;//跳过负数和小数
for(var m=0;m<4;m++){
var o2=opration[m];
if(i==j) continue;
var v2=number[j];
for(var m=0;m<4;m++){
if(m==i || m==j) continue;
var v3=number[m];
var temp=[0,1,2,3];
var v4;
for(var x=0;x<4;x++){
if(temp[x]==i) {temp[x]=-1;break;}
用Javascript编写24点计算器
浙江省城西小学唐明QQ:147885198
这是一篇算法教学文章,读起来可能比较辛苦,需要读者掌握Javascript编程以及初步的算法知识。
24点这个游戏,很多人都是玩到过的,一般来说可以2个人玩,每人出2张扑克牌,这样一共有4张牌,玩家对这4张牌使用加、减、乘、除四则混合运算得出24,谁先算出谁就赢。其中J、Q、K、大小王都算10,A既可当1,也可以当11。规则非常简单,对于三、四年级的小孩来说,这个游戏还是非常有益的,它能锻炼孩子的计算能力、反应速度和思维能力。
附件:演示程序http://www.xzpad.com/program_study/dian24/index.html
压缩包下载http://www.xzpad.com/program_study/dian24/index.rar
if(number.length!=4) {//验证输入是否正确
alert('24点需要有4个数字,请重新输入数字。');
return;
}
2.产生数字全排列
var n=new Array();
for(var i=0;i<4;i++){
var v1=number[i];
for(var j=0;j<4;j++){
首先是如何穷举,我是这样想的:“输入4个数,第1步拿出1个数有4种可能,第2步拿出运算符号有4种可能,第3步再拿出1个数有3种可能,这样一共有4×4×3=48种可能,再接着拿下一个符号,再拿下一个数字……”这样就穷举出所有的计算可能了。
其次如何解决小括号,我在拿出2个数和1个符号后,立即将它们进行计算并产生中间结果,接下来上面的2个数就可以丢弃,只使用中间结果,这样的方法就相当于我们使用分步计算,就避免了小括号的干扰,方便了算法的编写。下面我介绍一下我的代码:
}
n[n.length]=[v1,v2,v3,v4];
}
}
}
因为要剔除重复的排列,算法进行了一些检测,感觉有些啰嗦,没有想到更简单的算法。请读者想一想有没有更好的办法。这样的全排列一共有4×3×2=24种,相信大家一定会算的。
3.对全排列进行所有计算(封装在一个函数中)
function calc_one(v1,v2,v3,v4){
answ.innerHTML+=v1+o1+v2+'='+v5+'来自百度文库; '+v5+o2+v3+'='+v6+' ; '+v6+o3+v4+'='+v7+'<br/>';
}
}
}
}
}
思路非常简单,就是我刚才讲过的想法,最后呈现的结果也是分步列式。
在网上我搜索了“24点算法”,多是采用递归法,很明显我们的方法比递归法速度要快,对机器的要求也更低。可以找到它的所有解。最重要的是它的代码数量的我见过的最少的,一共80多行代码就解决了,有更好解决方案的请与我联系。
相关文档
最新文档