TA的每日心情 | 怒 2015-1-6 15:11 |
---|
签到天数: 4 天 [LV.2]偶尔看看I
|
8楼
楼主 |
发表于 2007-4-4 12:54:00
|
只看该作者
//牌初始显示 p1.gotoAndStop(5); p2.gotoAndStop(18); p3.gotoAndStop(31); //表达式计算 ebtn.onPress = function() { out2.text = evalString(input2.text); }; //随机产生四个数 RandBtn.onRelease = function() { //预存52张牌,不含王。 var p54:Array=[1,2,3,4,5,6,7,8,9,10,14,15,16,17,18,19,20,21,22,23,27,28,29,30,31,32,33,34,35,36,40,41,42,43,44,45,46,47,48,49]; //抽四张牌 var p4:Array=[]; for(var i=0;i<4;i++){ p4.push(p54.splice(random(p54.length),1)[0]); } //牌显示 for(var i=0;i<p4.length;i++){ _root["p"+(i+1)].gotoAndStop(p4); } //数据显示 input.text =p4[0]%13 +","+p4[1]%13+","+p4[2]%13+","+p4[3]%13; }; //计算按钮 evalBtn.onRelease = function() { var inStr:String = input.text; //删除字串中的空格 var i = 0; while (true) { i = inStr.indexOf(" ", i); if (i == -1) { break; } inStr = inStr.slice(0, i)+inStr.slice(i+1); } var N4:Array = inStr.split(","); //以“,”号撤分 var Lok = eval24(N4); out.text = ""; if (Lok.length == 0) { out.text = "我没算出来!"; } else { for (var i = 0; i<Lok.length; i++) { out.text += Lok+"\n"; } } }; //计算函数 function eval24(Num4:Array) { var Num4i; var Num4j; var Num4k; var Num4m; var res1:Array = []; var res2:Array = []; for (var i = 0; i<4; i++) { Num4i = Number(Num4); for (var j = 0; j<4; j++) { if (i != j) { Num4j = Number(Num4[j]); var PArray1:Array = []; var PArray2:Array = []; //A任取两个数运算  Array1.push(Num4i+Num4j);  Array2.push("("+Num4i+"+"+Num4j+")");  Array1.push(Num4i-Num4j);  Array2.push("("+Num4i+"-"+Num4j+")");  Array1.push(Num4j-Num4i);  Array2.push("("+Num4j+"-"+Num4i+")");  Array1.push(Num4i*Num4j);  Array2.push("("+Num4i+"*"+Num4j+")");  Array1.push(Num4i/Num4j);  Array2.push("("+Num4i+"/"+Num4j+")"); PArray1.push(Num4j/Num4i); PArray2.push("("+Num4j+"/"+Num4i+")"); for (var k = 0; k<4; k++) { if (j != k && i != k) { Num4k = Number(Num4[k]); for (var m = 0; m<4; m++) { if (k != m && j != m && i != m) { Num4m = Number(Num4[m]); var kArray1:Array = []; var kArray2:Array = []; //B剩下两个数的运算 kArray1.push(Num4k+Num4m); kArray2.push("("+Num4k+"+"+Num4m+")"); kArray1.push(Num4k-Num4m); kArray2.push("("+Num4k+"-"+Num4m+")"); kArray1.push(Num4m-Num4k); kArray2.push("("+Num4m+"-"+Num4k+")"); kArray1.push(Num4k*Num4m); kArray2.push("("+Num4k+"*"+Num4m+")"); kArray1.push(Num4k/Num4m); kArray2.push("("+Num4k+"/"+Num4m+")"); kArray1.push(Num4m/Num4k); kArray2.push("("+Num4m+"/"+Num4k+")"); for (var a = 0; a<PArray1.length; a++) { for (var b = 0; b<kArray1.length; b++) { //(A#B)#(C#D) res1.push(PArray1[a]+kArray1); res2.push(PArray2[a]+"+"+kArray2); res1.push(PArray1[a]-kArray1); res2.push(PArray2[a]+"-"+kArray2); res1.push(kArray1-PArray1[a]); res2.push(kArray2+"-"+PArray2[a]); res1.push(PArray1[a]*kArray1); res2.push(PArray2[a]+"*"+kArray2); res1.push(PArray1[a]/kArray1); res2.push(PArray2[a]+"/"+kArray2); res1.push(kArray1/PArray1[a]); res2.push(kArray2+"/"+PArray2[a]); } } } } } } //((A#B)#C)#D for (var k = 0; k<4; k++) { if (j != k && i != k) { Num4k = Number(Num4[k]); for (var l = 0; l<PArray1.length; l++) { var kArray1:Array = []; var kArray2:Array = []; kArray1.push(PArray1[l]+Num4k); kArray2.push("("+PArray2[l]+"+"+Num4k+")"); kArray1.push(PArray1[l]-Num4k); kArray2.push("("+PArray2[l]+"-"+Num4k+")"); kArray1.push(Num4k-PArray1[l]); kArray2.push("("+Num4k+"-"+PArray2[l]+")"); kArray1.push(PArray1[l]*Num4k); kArray2.push("("+PArray2[l]+"*"+Num4k+")"); kArray1.push(PArray1[l]/Num4k); kArray2.push("("+PArray2[l]+"/"+Num4k+")"); kArray1.push(Num4k/PArray1[l]); kArray2.push("("+Num4k+"/"+PArray2[l]+")"); for (var m = 0; m<4; m++) { if (k != m && j != m && i != m) { Num4m = Number(Num4[m]); for (var n = 0; n<kArray1.length; n++) { res1.push(kArray1[n]+Num4m); res2.push(kArray2[n]+"+"+Num4m); res1.push(kArray1[n]-Num4m); res2.push(kArray2[n]+"-"+Num4m); res1.push(Num4m-kArray1[n]); res2.push(Num4m+"-"+kArray2[n]); res1.push(kArray1[n]*Num4m); res2.push(kArray2[n]+"*"+Num4m); res1.push(kArray1[n]/Num4m); res2.push(kArray2[n]+"/"+Num4m); res1.push(Num4m/kArray1[n]); res2.push(Num4m+"/"+kArray2[n]); } } } } } } } } } var retArray:Array = []; for (var m = 0; m<res2.length; m++) { //if (Number(res1[m])>=23.99 && Number(res1[m])<=24.01) { if (res1[m] == 24) { var ok:Boolean = true; for (var i = 0; i<retArray.length; i++) { if ((res2[m]+"="+res1[m]) == retArray) { ok = false; } } if (ok) { retArray.push(res2[m]+"="+res1[m]); } } } return retArray; } //计算字串表达式的值 //参数:字串计算表达式,只能有数字(可以是小数和负数),+ - * / ( )等符号,自动忽略空格。 function evalString(表达式:String):Number { //删除字串中的空格 var i = 0; while (true) { i = 表达式.indexOf(" ", i); if (i == -1) { break; } 表达式 = 表达式.slice(0, i)+表达式.slice(i+1); } var 堆栈:Array = ["@"]; //栈底标记"@" var a, b, c, d:String, Err:String = "ok"; var _fh = 1; //正负号 var posN = ""; // 扫描表达式 for (var i = 0; i<表达式.length; i++) { switch (表达式.charAt(i)) { case "(" : //左括号前面是数字,就插入乘号,否则就直接入栈。即左括号前的乘号可以省略。 d = 表达式.charAt(i-1); if ((d>"0" && d<"9") || d == ")") { 堆栈.push("*"); } 堆栈.push(表达式.charAt(i)); break; case ")" : //右括号则退栈计算,直到遇见一个左括号 b = 堆栈.pop(); c = 堆栈.pop(); a = 堆栈.pop(); if (堆栈.pop() == "(") { 堆栈.push(计算两数(a, c, b)); } else { //请拖动“组件”Alert到舞台上,然后删除,它就出现在库中了 //这样才能利用下面的弹出提示信息窗口。 mx.controls.Alert.show("括号不匹配!", "表达式错误"); return Number(""); } break; case "*" : case "/" : //如果前一个运算符为*或/,则退栈计算,再入栈,否则直接入栈 d = 堆栈[堆栈.length-2]; if (d == "*" || d == "/") { b = 堆栈.pop(); c = 堆栈.pop(); a = 堆栈.pop(); 堆栈.push(计算两数(a, c, b)); } 堆栈.push(表达式.charAt(i)); break; case "-" : //判断是减号?还是负号? d = 表达式.charAt(i-1); if (i == 0 || d == "(" || d == "/" || d == "*") { _fh = -1; break; } case "+" : //如果前一个运算符不是左括号也不是栈底,则退栈计算,再入栈 d = 堆栈[堆栈.length-2]; if (d != "(" && d != "@") { b = 堆栈.pop(); c = 堆栈.pop(); a = 堆栈.pop(); 堆栈.push(计算两数(a, c, b)); } 堆栈.push(表达式.charAt(i)); break; default : //如果是数字字符或者小数点则转化为数字 posN += 表达式.charAt(i); //如果下一个字符是运算符则把当前数字压入栈中 d = 表达式.charAt(i+1); if (!(d != "." && (d>"9" || d<"0"))) { break; } 堆栈.push(parseFloat(posN)*_fh); posN = ""; _fh = 1; } } //扫描完毕,计算栈中乘下数据 do { b = 堆栈.pop(); c = 堆栈.pop(); a = 堆栈.pop(); 堆栈.push(计算两数(a, c, b)); } while (堆栈.length>3); var ret = Number(堆栈.pop()); if (Err == "除数为零") { mx.controls.Alert.show("除数为零!", "错误:"); } else if (堆栈.pop() != "@" || isNaN(ret)) { mx.controls.Alert.show("请检查计算表达式!", "错误:"); } //返回结果 return ret; //计算两个数 function 计算两数(a, 运算符, b):Number { var ret = 0; if (运算符 == "+") { ret = a+b; } else if (运算符 == "-") { ret = a-b; } else if (运算符 == "*") { ret = a*b; } else if (运算符 == "/") { if (!b) { Err = "除数为零"; return Number(""); } else { ret = a/b; } } return ret; } }
|
|