回 帖 发 新 帖 刷新版面

主题:[原创]用JavaScript算24点问题

很小就玩过的一个游戏:从扑克牌里抽出4张牌,就有4个数。用+、-、*、/四则运算,每个数只能用一次,但不能不用,算出24来。(当然不一定有解)
把下面的文本保存成网页文件(*.htm),然后在IE浏览器中打开。输入4个你抽到的数,让电脑也算算。怎么样,有趣吧?



<html>
<head>
<title>算24点</title>
<script language="javascript">
<!--
//   Computing 24 points.
//   Programmed by j.t.Chang.

var  tag = 24;
var  a = new Array(4);
var  astr = new Array(4);
var  f = new Array("+","-","*","/");
var  found;

function prn()
{ var  s,i;  

  i = astr[0].length;
  s = astr[0].substr(1,i-2);
  s = "我想到啦!\n\n"+s+ " = "+tag;
  alert(s);
}

function cal(n)
{var i,j,k,p,x,y;
var ta = new Array(4);
var ts = new Array(4);
var tmpstr;
  
   if (n==0)
     { if (Math.abs(a[0]-tag)<0.0000001)
          { found = true;
            prn();
           }           
        return ;          
      }    
    for (i=0;i<n;i++)
      for (j=i+1;j<n+1;j++)
        {  x = a[i];
           y = a[j];
           for (k=0;k<4;k++)
             { for (p=0;p<4;p++)
                 { ta[p] = a[p];
                   ts[p] = astr[p];                     
                 }                   
               if ((k==3)&&(y==0));
                 else{  tmpstr = "("+x+")"+f[k]+"("+y+")";
                        astr[i] = "(" + astr[i] + f[k] + astr[j] + ")";
                        a[i] = eval(tmpstr);
                        for (p=j;p<n;p++)
                           { a[p] = a[p+1];
                             astr[p] = astr[p+1];               
                           }
                        cal(n-1);
                        if (found) return;
                        for (p=0;p<4;p++)
                          { a[p] = ta[p];
                            astr[p] = ts[p];                     
                          }
                      }   
               if ((k==0)||(k==2));
                 else
                  {  if  ((k==3)&&(x==0));
                     else
                     {   tmpstr = "("+y+")"+f[k]+"("+x+")";
                         astr[i] = "(" + astr[j] + f[k] + astr[i] + ")";
                         a[i] = eval(tmpstr);
                         for (p=j;p<n;p++)
                             { a[p] = a[p+1];
                               astr[p] = astr[p+1];               
                             }
                         cal(n-1);
                         if (found) return;
                         for (p=0;p<4;p++)
                              { a[p] = ta[p];
                                astr[p] = ts[p];                     
                              }  
                       }
                  }
             }
        }     
}

function FindAnswer()
{ a[0] = astr[0] = T1.value * 1;
  a[1] = astr[1] = T2.value * 1;
  a[2] = astr[2] = T3.value * 1;
  a[3] = astr[3] = T4.value * 1;
  found  = false;
  cal(3);
  if (!found)  
  { alert("我不算了!\n\n"+"想了这么久……还是算不出来!");  
  }      
}
//-->
</script>
</head>
<body>
<b><font color="#FF0000">扑克牌算24点</font></b>
<hr>
<p align="right">j.t.Chang编&nbsp;&nbsp; E-mail: <a href="mailto:jtchang@21cn.com">jtchang@21cn.com</a></p>
<p>
<br>
很小就玩过的一个游戏:从扑克牌里抽出4张牌,就有4个数。用+、-、*、/四则运算,每个数只能用一次,但不能不用,算出24来。</p>
<br>
<p>玩一下吧!让电脑算算看。</p>
<p>输入4个数字:</p>
   <input type="text" name="T1" size="7">
   <input type="text" name="T2" size="7">    
   <input type="text" name="T3" size="7">
   <input type="text" name="T4" size="7"> &nbsp;
   <input type="button" value="算算看吧" name="B1" onclick="FindAnswer()">
</body>
</html>

回复列表 (共7个回复)

沙发

good

板凳

body之间还能看懂,head之间看不懂[em1]

3 楼

这个好象以前在哪看到过算法还可以改进

4 楼

这么多的for呀,好晕!

5 楼

6 楼

哪个高手帮忙分析一下~~

7 楼

能给点注释就好了.

我来回复

您尚未登录,请登录后再回复。点此登录或注册