24点游戏 VUE

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>24点</title>
    <!-- 引入vue.js -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <!-- 引入样式 -->
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
    <!-- 引入组件库 -->
    <script src="https://lib.baomitu.com/element-ui/2.13.2/index.js"></script>
    <!-- <script type="text/javascript" color="0,0,255" opacity='0.7' zIndex="-2" count="99" src="https://cdn.bootcss.com/canvas-nest.js/2.0.4/canvas-nest.js"></script> -->
</head>

<body>
    <div id="app" class="app">
        <el-row style='margin-top: 20px;'>
            <el-form ref="form" label-width='80px'>
                <el-col :span="5">
                    <el-form-item label="输入框1">
                        <el-input v-model="input1"></el-input>
                    </el-form-item>
                </el-col>
                <el-col :span="5">
                    <el-form-item label="输入框2">
                        <el-input v-model="input2"></el-input>
                    </el-form-item>
                </el-col>
                <el-col :span="5">
                    <el-form-item label="输入框3">
                        <el-input v-model="input3"></el-input>
                    </el-form-item>
                </el-col>
                <el-col :span="5">
                    <el-form-item label="输入框4">
                        <el-input v-model="input4"></el-input>
                    </el-form-item>
                </el-col>
                <el-col :span="4">
                    <el-button type="primary" plain icon="el-icon-success" @click='confirm'>确定</el-button>
                </el-col>
            </el-form>
        </el-row>
        <div style='border:2px solid pink;padding:20px'>
            <el-row>
                <el-col :span="24">
                    <div style="margin-bottom:20px">不加括号</div>
                </el-col>
            </el-row>
            <el-row>
                <el-col :span="12">
                    所有(总共:{{result.length}}个)
                    <div v-for='(item,index) in result'
                        style='padding:5px;display: flex;justify-content: space-between;border: 1px solid cyan;'>
                        <div>{{index+1}} </div>
                        <div>{{item}} </div>
                    </div>
                </el-col>
                <el-col :span="12">
                    结果等于24(总共:{{result24.length}}个)
                    <div v-for='(item,index) in result24'
                        style='padding:5px;display: flex;justify-content: space-between;border: 1px solid cyan;'>
                        <div>{{index+1}} </div>
                        <div>{{item}} </div>
                    </div>
                </el-col>
            </el-row>
        </div>
        <div style='border:2px solid red;padding:20px;margin-top: 30px;'>
            <el-row>
                <el-col :span="24">
                    <div style="margin-bottom:20px">加括号</div style="margin-bottom:20px">
                </el-col>
            </el-row>
            <el-row>
                <el-col :span="8">
                    所有(总共:{{r.length}}个)
                    <div v-for='(item,index) in r'
                        style='padding:5px;display: flex;justify-content: space-between;border: 1px solid cyan;'>
                        <div>{{index+1}} </div>
                        <div>{{item}} </div>
                    </div>
                </el-col>
                <el-col :span="8">
                    所有结果等于24(总共:{{r24.length}}个)
                    <div v-for='(item,index) in r24'
                        style='padding:5px;display: flex;justify-content: space-between;border: 1px solid cyan;'>
                        <div>{{index+1}} </div>
                        <div>{{item}} </div>
                    </div>
                </el-col>
                <el-col :span="8">
                    去除多余括号结果等于24(总共:{{newSetR24.length}}个)
                    <div v-for='(item,index) in newSetR24'
                        style='padding:5px;display: flex;justify-content: space-between;border: 1px solid cyan;'>
                        <div>{{index+1}} </div>
                        <div>{{item}} </div>
                    </div>
                </el-col>
            </el-row>
        </div>
    </div>
</body>
<script type="text/javascript">
    var app = new Vue({
        el: '#app', //选择器
        data: {
            input1: '',
            input2: '',
            input3: '',
            input4: '',
            result: [],
            result24: [],
            r: [],
            r24: [],
            newSetR24: []
        },
        methods: {
            /**
             * 方法1:直接使用js的eval方法
             * */
            confirm() {
                if (this.input1 && this.input2 && this.input3 && this.input4) {
                    this.result = [];
                    this.result24 = [];
                    this.r = [];
                    this.r24 = [];
                    this.newSetR24 = [];
                    // 运算法则
                    let soul = ['+', '-', '*', '/'];
                    let list = [this.input1, this.input2, this.input3, this.input4]
                    // let list = [1, 2, 3, 4]
                    let a = list[0];
                    let b = list[1];
                    let c = list[2];
                    let d = list[3];
                    // 锁住第一个数字位置
                    for (let i = 0; i < 4; i++) {
                        // 锁住第二个数字位置
                        for (let j = 0; j < 4; j++) {
                            // 锁住第三个数字位置
                            for (let k = 0; k < 4; k++) {
                                // =========数据是字符串:用的方法1和2============================
                                // //不加括号
                                // let s = `${a}${soul[i]}${b}${soul[j]}${c}${soul[k]}${d}`;
                                // let z = this.evil(s)
                                // // let z = eval(s) eval方法有些不能用,就用上面的this.evil()方法代替
                                // // this.myEval(s)
                                // if (z == 24) {
                                //     this.result24.push(s + '=' + z)
                                // }
                                // this.result.push(s + '=' + z)
                                // //加括号
                                // let s1 = `(${a}${soul[i]}${b})${soul[j]}${c}${soul[k]}${d}`;
                                // let z1 = eval(s1)
                                // if (z1 == 24) {
                                //     this.r24.push(s1 + '=' + z1)
                                // }
                                // //去重1
                                // if (z1 == 24) {
                                //     if (['+', '-'].includes(soul[j]) || ['*', '/'].includes(soul[i])) {
                                //         //找出所有可以去除括号的条件
                                //     } else {
                                //         this.newSetR24.push(s1 + '=' + z1)
                                //     }
                                // }
                                // let s2 = `${a}${soul[i]}(${b}${soul[j]}${c})${soul[k]}${d}`;
                                // let z2 = eval(s2)
                                // if (z2 == 24) {
                                //     this.r24.push(s2 + '=' + z2)
                                // }
                                // //去重2
                                // if (z2 == 24) {
                                //     if (['+'].includes(soul[i]) || (['-'].includes(soul[i]) && ['*', '/'].includes(soul[j])) || (['*'].includes(soul[i]) && ['*', '/'].includes(soul[j]))) {
                                //         //找出所有可以去除括号的条件
                                //     } else {
                                //         this.newSetR24.push(s2 + '=' + z2)
                                //     }
                                // }
                                // let s3 = `${a}${soul[i]}${b}${soul[j]}(${c}${soul[k]}${d})`;
                                // let z3 = eval(s3)
                                // if (z3 == 24) {
                                //     this.r24.push(s3 + '=' + z3)
                                // }
                                // //去重3
                                // if (z3 == 24) {
                                //     if (['+'].includes(soul[j]) || (['-'].includes(soul[j]) && ['*', '/'].includes(soul[k])) || (['*'].includes(soul[j]) && ['*', '/'].includes(soul[k]))) {
                                //         //找出所有可以去除括号的条件
                                //     } else {
                                //         this.newSetR24.push(s3 + '=' + z3)
                                //     }
                                // }
                                // let s4 = `(${a}${soul[i]}${b}${soul[j]}${c})${soul[k]}${d}`;
                                // let z4 = eval(s4)
                                // if (z4 == 24) {
                                //     this.r24.push(s4 + '=' + z4)
                                // }
                                // //去重4
                                // if (z4 == 24) {
                                //     if (['+', '-'].includes(soul[k]) || (['*', '/'].includes(soul[k]) && ['*', '/'].includes(soul[i]) && ['*', '/'].includes(soul[j]))) {
                                //         //找出所有可以去除括号的条件
                                //     } else {
                                //         this.newSetR24.push(s4 + '=' + z4)
                                //     }
                                // }
                                // let s5 = `${a}${soul[i]}(${b}${soul[j]}${c}${soul[k]}${d})`;
                                // let z5 = eval(s5)
                                // if (z5 == 24) {
                                //     this.r24.push(s5 + '=' + z5)
                                // }
                                // //去重5
                                // if (z5 == 24) {
                                //     if (['+'].includes(soul[i]) || (['-'].includes(soul[i]) && ['*', '/'].includes(soul[j]) && ['*', '/'].includes(soul[k])) || (['*'].includes(soul[i]) && ['*', '/'].includes(soul[j]) && ['*', '/'].includes(soul[k]))) {
                                //         //找出所有可以去除括号的条件
                                //     } else {
                                //         this.newSetR24.push(s5 + '=' + z5)
                                //     }
                                // }
                                // let s6 = `(${a}${soul[i]}${b})${soul[j]}(${c}${soul[k]}${d})`;
                                // let z6 = eval(s6)
                                // if (z6 == 24) {
                                //     this.r24.push(s6 + '=' + z6)
                                // }
                                // //去重6
                                // if (z6 == 24) {
                                //     if (['+'].includes(soul[j]) || (['-'].includes(soul[j]) && ['+', '-', '*', '/'].includes(soul[i])) || (['-'].includes(soul[j]) && ['*', '/'].includes(soul[k])) || (['*'].includes(soul[j]) && ['*', '/'].includes(soul[i]) && ['*', '/'].includes(soul[k]))) {
                                //         //找出所有可以去除括号的条件
                                //     } else {
                                //         this.newSetR24.push(s6 + '=' + z6)
                                //     }
                                // }
                                // this.r.push(s1 + '=' + z1, s2 + '=' + z2, s3 + '=' + z3,
                                //     s4 + '=' + z4, s5 + '=' + z5, s6 + '=' + z6)
                                // =======数据是数组:用的方法3========================
                                let s = [a, soul[i], b, soul[j], c, soul[k], d,] 
                                let q=this.createSuffixExp(s)
                                let w=this.calcExp(q)
                                let str = `${a}${soul[i]}${b}${soul[j]}${c}${soul[k]}${d}`;
                                  if (w == 24) {
                                    this.result24.push(str + '=' + w)
                                }
                                this.result.push(str + '=' + w)
                                //加括号
                                let s1 = ['(',a, soul[i], b,')', soul[j], c, soul[k], d,];
                                let q1=this.createSuffixExp(s1)
                                let w1=this.calcExp(q1)
                                let str1 = `(${a}${soul[i]}${b})${soul[j]}${c}${soul[k]}${d}`;
                                if (w1 == 24) {
                                    this.r24.push(str1 + '=' + w1)
                                }
                                //去重1
                                if (w1 == 24) {
                                    if (['+', '-'].includes(soul[j]) || ['*', '/'].includes(soul[i])) {
                                        //找出所有可以去除括号的条件
                                    } else {
                                        this.newSetR24.push(str1 + '=' + w1)
                                    }
                                }
                               

                                let s2 = [a, soul[i], '(',b, soul[j], c, ')',soul[k], d,];
                                let q2=this.createSuffixExp(s2)
                                let w2=this.calcExp(q2)
                                let str2 = `${a}${soul[i]}(${b}${soul[j]}${c})${soul[k]}${d}`;
                                if (w2 == 24) {
                                    this.r24.push(str2 + '=' + w2)
                                }
                                //去重2
                                if (w2 == 24) {
                                    if (['+'].includes(soul[i]) || (['-'].includes(soul[i]) && ['*', '/'].includes(soul[j])) || (['*'].includes(soul[i]) && ['*', '/'].includes(soul[j]))) {
                                        //找出所有可以去除括号的条件
                                    } else {
                                        this.newSetR24.push(str2 + '=' + w2)
                                    }
                                }


                                let s3 = [a, soul[i], b, soul[j],'(', c,soul[k], d, ')'];
                                let q3=this.createSuffixExp(s3)
                                let w3=this.calcExp(q3)
                                let str3 = `${a}${soul[i]}${b}${soul[j]}(${c}${soul[k]}${d})`;
                                if (w3 == 24) {
                                    this.r24.push(str3 + '=' + w3)
                                }
                                //去重3
                                if (w3 == 24) {
                                    if (['+'].includes(soul[j]) || (['-'].includes(soul[j]) && ['*', '/'].includes(soul[k])) || (['*'].includes(soul[j]) && ['*', '/'].includes(soul[k]))) {
                                        //找出所有可以去除括号的条件
                                    } else {
                                        this.newSetR24.push(str3 + '=' + w3)
                                    }
                                }


                                let s4 = ['(',a, soul[i], b, soul[j], c, ')',soul[k], d];
                                let q4=this.createSuffixExp(s4)
                                let w4=this.calcExp(q4)
                                let str4 = `(${a}${soul[i]}${b}${soul[j]}${c})${soul[k]}${d}`;
                                if (w4 == 24) {
                                    this.r24.push(str4 + '=' + w4)
                                }
                                //去重4
                                if (w4 == 24) {
                                    if (['+', '-'].includes(soul[k]) || (['*', '/'].includes(soul[k]) && ['*', '/'].includes(soul[i]) && ['*', '/'].includes(soul[j]))) {
                                        //找出所有可以去除括号的条件
                                    } else {
                                        this.newSetR24.push(str4 + '=' + w4)
                                    }
                                }


                                let s5 = [a, soul[i],'(', b, soul[j], c,soul[k], d, ')'];
                                let q5=this.createSuffixExp(s5)
                                let w5=this.calcExp(q5)
                                let str5 = `${a}${soul[i]}(${b}${soul[j]}${c}${soul[k]}${d})`;
                                if (w5 == 24) {
                                    this.r24.push(str5 + '=' + w5)
                                }
                                //去重5
                                if (w5 == 24) {
                                    if (['+'].includes(soul[i]) || (['-'].includes(soul[i]) && ['*', '/'].includes(soul[j]) && ['*', '/'].includes(soul[k])) || (['*'].includes(soul[i]) && ['*', '/'].includes(soul[j]) && ['*', '/'].includes(soul[k]))) {
                                        //找出所有可以去除括号的条件
                                    } else {
                                        this.newSetR24.push(str5 + '=' + w5)
                                    }
                                }


                                let s6 = ['(',a, soul[i], b, ')', soul[j],'(', c,soul[k], d, ')'];
                                let q6=this.createSuffixExp(s6)
                                let w6=this.calcExp(q6)
                                let str6 = `(${a}${soul[i]}${b})${soul[j]}(${c}${soul[k]}${d})`;
                                if (w6 == 24) {
                                    this.r24.push(str6 + '=' + w6)
                                }
                                //去重6
                                if (w6 == 24) {
                                    if (['+'].includes(soul[j]) || (['-'].includes(soul[j]) && ['+', '-', '*', '/'].includes(soul[i])) || (['-'].includes(soul[j]) && ['*', '/'].includes(soul[k])) || (['*'].includes(soul[j]) && ['*', '/'].includes(soul[i]) && ['*', '/'].includes(soul[k]))) {
                                        //找出所有可以去除括号的条件
                                    } else {
                                        this.newSetR24.push(str6 + '=' + w6)
                                    }
                                }

                                this.r.push(str1 + '=' + w1,str2 + '=' + w2,str3 + '=' + w3,str4 + '=' + w4,str5 + '=' + w5,str6 + '=' + w6,)
                            }
                        }
                    }
                } else {
                    this.$message.error('请输入数字');
                }
            },
            /**
             * 方法2:用evil代替js的eval方法
             * */
            //计算表达式的值
            evil(fn) {
                var Fn = Function;  //一个变量指向Function,防止有些前端编译工具报错
                return new Fn('return ' + fn)();
            },
            /**
             * 方法3:自己计算,通过中缀表达式转后缀表达式的方法
             * */

            //将中缀表达式转换成后缀表达式
            // 这里传入的arr必须是一个数组,不然没法处理大于等于10的数
            createSuffixExp(arr) {
                let suffixExp = []//数字栈
                let opeStack = []//符号栈
                let numReg = /^[0-9]+$/;
                for (let i of arr) {
                    if (numReg.test(i)) {
                        suffixExp.push(i);
                    } else if (['*', '/'].indexOf(i) >= 0) {
                        if (['*', '/'].indexOf(opeStack[opeStack.length - 1]) > -1) {// 如果运算符里有优先级相同的,就先弹栈,再压栈
                            suffixExp.push(opeStack.pop());
                            opeStack.push(i);
                            continue;
                        }
                        opeStack.push(i);
                    } else if ([')'].indexOf(i) >= 0) {
                        // 弹栈,直到弹出来的是左括号为止
                        let ele = opeStack.pop();//这个是返回的去除最后一个后的新数组
                        while (ele !== '(') {
                            suffixExp.push(ele);
                            ele = opeStack.pop();
                        }
                    } else if (i === '(') {
                        opeStack.push(i);
                    } else if (opeStack.length > 0) {
                        // 如果没有括号隔着,不会有*在+的下面
                        while (opeStack.length > 0 && opeStack[opeStack.length - 1] !== '(') {
                            suffixExp.push(opeStack.pop());
                        }
                        opeStack.push(i);
                    } else {
                        opeStack.push(i);
                    }
                }
                while (opeStack.length > 0) {
                    suffixExp.push(opeStack.pop());
                }
                return suffixExp
            },
            //计算
            calcExp(arr) {
                while (arr.length > 1) {
                    for (let i = 0; i < arr.length; i++) {
                        if (['+', '-', '*', '/'].indexOf(arr[i]) > -1) {
                            let num1 = Number(arr[i - 2]);
                            let num2 = Number(arr[i - 1]);
                            let ret = 0;
                            switch (arr[i]) {
                                case '+':
                                    ret = num1 + num2;
                                    break;
                                case '-':
                                    ret = num1 - num2;
                                    break;
                                case '*':
                                    ret = num1 * num2;
                                    break;
                                case '/':
                                    ret = num1 / num2;
                                    break;
                            }
                            arr.splice(i - 2, 3, ret);//splice的替换方法,参数1:起始下标,参数2:替换几个数,参数3:替换的数据
                            break;
                        }
                    }
                }
                // 使用pop是为了置空arr,从而让js的垃圾回收机制收回内存。
                //这里使用pop方法是因为最后一个数据算出来是[10],相当于提取一下最后一个数据
                let result=arr.pop()
                return result;
            },
        }
    })
</script>
<style type="text/css">
    html,
    body,
    #app {
        margin: 0;
        padding: 0;
        width: 100%;
        text-align: center;
        /* border: 1px solid crimson; */
    }
</style>

</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值