用javascript编写“24点”游戏[1]

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 yanwl 的 blog

<html>
<head>
</head>
<script language='javascript'>
var debug = false;
var steps = new array();
var resultset = new array();
resultset.add = function(newresult)
{
 for (var i = 0; i < resultset.length; i++) 
 {
  if (resultset[i] == newresult)
  {
   return;
  }
 }
 resultset.push(newresult);
}
resultset.tostring = function()
{
 var msg = "";
 for (var i = 0; i < resultset.length; i++) 
 {
  msg += resultset[i] + "=24\n";
 }
 msg += "计算结束,共得到"+resultset.length+"个不同结果";
 return msg;
}
function assert(flag)
{
 if (!flag)
 {
  throw new error('assertion failed!');
 }
}
array.prototype.clone = function()
{
 return this.slice(0);
}
function calcul(stack,oper)
{
 assert(oper == '+' || oper == '-' || oper == '*' || oper == '/');
 var lift = new array();
 lift[0] = stack.pop()-0;
 lift[1] = stack.pop()-0;
 switch(oper)
 {
  case '+': stack.push(lift[1] + lift[0]);
      break;
  case '-': stack.push(lift[1] - lift[0]);
      break;
  case '*': stack.push(lift[1] * lift[0]);
      break;
  case '/': stack.push(lift[1] / lift[0]);
      break;
 }
 return lift;
}
function parseexp()   //由逆波兰式构造出表达式
{
 var stack = new array();
 var exprs = new array();

 for (var i = 0; i < steps.length; i++)
 {
  if (!isnan(steps[i]))
  {
   stack.push(steps[i]);
   exprs.push(steps[i].tostring());
  }
  else
  {
   var oper1 = exprs.pop();
   var oper2 = exprs.pop();
   var lift = calcul(stack, steps[i]);
   if (steps[i] == '*' || steps[i] == '+')    //规定较大的数出现在*和+的左边,以避免出现过多重复的结果
   {
    if (lift[0] > lift[1])
    {
     var tmp = oper1;
     oper1 = oper2;
     oper2 = tmp;
    }
   }
   var subexpr = "(" + oper2 + ")" + steps[i] + "(" + oper1 + ")";  //判断是否要添加括号
   var subexpr1 = oper2 + steps[i] + oper1;
   var subexpr2 = "(" + oper2 + ")" + steps[i] + oper1;
   var subexpr3 =  oper2 + steps[i] + "(" + oper1 + ")";
   if (math.abs(eval(subexpr) - eval(subexpr1)) < 0.0001) subexpr = subexpr1;
   else if (math.abs(eval(subexpr) - eval(subexpr2)) < 0.0001) subexpr = subexpr2;
   else if (math.abs(eval(subexpr) - eval(subexpr3)) < 0.0001) subexpr = subexpr3;

    exprs.push(subexpr);
  }
 }
 return exprs[0];
}

function playcards(stack, cards)
{
 if (debug) alert(stack + ":" + cards);
 if (stack.length == 1 && cards.length == 0)
 {
  if(math.abs(stack[0] - 24) < 0.0001)
  {
   resultset.add(parseexp());
  }
  return; //计算结束,输出计算结果
 }
 var newcards = null;
 var newstack = null;

 for(var i = 0 ; i < cards.length; i++)
 {
  var distinctcard = true;
  for (var j = 0; j < i; j++)
  {
   if (cards[j] == cards[i])
   {
    distinctcard = false;
    break;
   }
  }
  if (distinctcard)
  {
   newcards = cards.clone();
   newstack = stack.clone();
   newcards.splice(i,1);
   newstack.push(cards[i]);
   steps.push(cards[i]);
   playcards(newstack, newcards);
   steps.pop(cards[i]);
  }
 }
 
 calcard(stack.clone(),cards.clone(),'+');
 calcard(stack.clone(),cards.clone(),'-');
 calcard(stack.clone(),cards.clone(),'*');
 calcard(stack.clone(),cards.clone(),'/');
}

本文关键:用javascript编写“24点”游戏
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top