JS实现24点游戏

游戏逻辑:拿一副牌,抽去大小王后,剩下1~10和JQK这些张牌。任意抽取4张牌(称为牌组),用加、减、乘、除把牌面上的数算成24。每张牌必须用且只能用一次。

实现思路:

  • 先定义四张牌的数据结构,代码函数dataWarp

{
    r: number, // 扑克牌代表的数字
    m: string // 运算的表达式(最后过滤出r === 24的时候,获取运算的方法)
}复制代码

  • 假设只要两张牌,获取所有的计算结果的可能性,代码函数calm
  • 降维计算四张牌,保持a,b不变,组合c,d,代码函数allCalm,要保证a,b,c,d都计算到,则需要计算a,b,c,d; a,c,b,d; a,d,c,b; b,c,a,d; b,d,c,a; c,d,b,a;
  • 获取所有计算结果,匹配到等于24的数据,拉取出运算表达式
        function dataWarp(...num) {
            return num.map((a) => ({
                m: a+'',
                r: a
            }));
        }
        function calm(a,b) {
            var r = [
                {
                    m: `(${a.m}+${b.m})`,
                    r: a.r+b.r
                },
                {
                    m: `(${a.m}-${b.m})`,
                    r: a.r-b.r
                },
                {
                    m: `(${b.m}-${a.m})`,
                    r: b.r-a.r
                },
                {
                    m: `(${a.m}*${b.m})`,
                    r: a.r*b.r
                },
            ];
            a.r !== 0 && r.push({
                m: `(${b.m}/${a.m})`,
                r: b.r/a.r
            });
            b.r !==0 && r.push({
                m: `(${a.m}/${b.m})`,
                r: a.r/b.r
            });
            return r;
        }
        function allCalm(a,b,c,d,u) {
            var s = [], t = [];
            calm(a,b).forEach((i) => {
                s = s.concat(calm(i, c));
                t = t.concat(calm(i, d));
            });
            s.forEach((i) => {
                u = u.concat(calm(i, d));
            });
            t.forEach((i) => {
                u = u.concat(calm(i, c));
            });
            return u;
        }
        function get24(a,b,c,d) {
            [a,b,c,d]= dataWarp(a,b,c,d);
            allCalm(c,d,b,a,allCalm(b,d,a,c,allCalm(b,c,a,d,allCalm(a,d,b,c,allCalm(a,c,b,d,allCalm(a,b,c,d,[])))))).forEach((i) => {
                if (i.r === 24) {
                    console.log(i.m);
                }
            });
        }复制代码


转载于:https://juejin.im/post/5be15b0c6fb9a04a006e7890

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值