《24点》APP——提示功能实现

本文详细介绍了《24点》APP提示功能的实现,包括判断4个随机数字是否能等于24的算法,以及如何生成等式表达式。在判断过程中,通过设置误差范围和避免除数为0确保正确性。在获取表达式时,通过递归保存计算步骤,最终组合成完整的计算表达式。完整代码可在GitHub找到。
摘要由CSDN通过智能技术生成

format,png

 d2c06c34bdce9851da351f350ac7d3b9.gif 

本文字数:8788

预计阅读时间:22分钟

背景

打算做《挑战24点》,调研了商店里现存的24点APP。大部分的盈利逻辑是:

  1. 设置闯关模式,通过闯关增加趣味性,吸引用户活跃度,通过底部banner广告和后台唤起广告盈利

  2. 提示的获取,通过限制提示次数,超出次数后观看广告或者购买来解锁额外次数。

这里分享一下,《24点》APP提示功能如何实现,效果如下:

683cb3e3e1d884f206a5359190939ea4.gif
demo1

提示功能实现又分为两步,步骤如下:

  1. 判断结果能不能等于24;

  • 笔者一开始认为《24点》APP的4个数字是完全随机的,但完全随机会导致可能计算不出24的情况,对于用户来说,花时间思考了很久但是最终发现是题目不能等于24,容易打击积极性。所以对于刚开始的用户来说,首先要保证随机出的数字一定是要等于24,实现逻辑就是,每次随机出4个数字后,在显示出来之前判断,是否等于24,如果不等于则再次生成随机数字,直到随机出的数字可以等于24时才显示到屏幕上。

  • 但是对于部分想要挑战高难度的用户来说,随机过程中出现不能计算出结果的反而更具有挑战性。所以可以通过在设置中做个Switch开关,开启代表生成的随机数字一定能计算出24,关闭表示不一定能,默认开启,用户可自由选择难度。

如果能等于24,显示出能得到24的表达式;如果不能,提示用户当前随机数字不能得到24。这个步骤中,需要注意的是,计算过程中数字是小数还是整数?表达式中数字的显示等。

  • 计算过程中数字的类型。首先随机生成4个数字是整数。而通过整数去运算,在Swift中,当运算符左右都为整数时,其结果也是整数。这种情况就会导致计算失败,比如:((15 + 1)* (3 / 2)),通过整数计算最终是16,而通过小数计算是24,所以,不能通过整数计算,运算的第一步就是把随机的4个数字转为小数。

  • 表达式中数字的显示。而将数字转为 double 后,最后表达式中数字的显示会带有精度,在添加到表达式中时不能直接使用 String(format:"%f"),要使用 NSNumber 进行转换一次,然后再转 String。

下面详细记录一下实现的过程:

解法原理

步骤一,判断能不能等于24

每次随机数字的逻辑在这里就不详细展开了,下面主要分享下,给定4个数字,如何判断这4个数字能不能等于24。

有[a, b, c, d] 四个数字,任取两个数字,通过遍历运算符得到运算结果 e,然后把运算结果和剩余的数字放入新的数组中,重复上面的计算过程,直到数组中有一个元素为止;最后判断数组中唯一的数字是否等于24即可。

这里需要注意几点,一是遍历运算符的时候,加和乘符合交换律,所以不需要重复计算;二是除法会有小数,所以最终判断是否等于24的时候,需要通过设置误差范围来判断;再有就是除法的除数不能为零。

所以最终解法描述如下:

  1. 定义误差范围,定义要对比的值,定义运算符数组;

  2. 定义判断是否相等的判断方法,传入值和要对比的值的绝对值小于误差范围,即视作相等;

  3. 数据转换,由于传入的数字是Int,所以通过 map 转为 Double 类型;

  4. 实现计算方法

    1. 运算符为"+"或"*"时,注意交换律,刚开始 i < j,所以到 i > j 时,就不需要重复计算了

    2. 运算符为"-"时,除数不能为0

    3. 把取出的两个数字通过运算符计算出结果,放入余下数字的新数组中,新数组中即有3个数字

    4. 再从这个新数组中取出两个数字重复上面的计算过程,递归调用,得到返回结果

    5. 如果返回结果不为真,则从3个数字的新数组中,移除最后一个元素即此次通过运算符运算后的数字;然后再继续遍历下一个运算符

    6. 数组为空,不合法;

    7. 数组中只有一个数字,即停止,调用判断相等方法判断是否相等

    8. 从数组中依次取两个数字,两个数字不能相等

    9. 把余下的数字放入新的数组中

    10. 遍历运算符数组

    11. 如果所有运算符已遍历完成,结果还不为真,则继续遍历原始数组,取出后面的数字。

流程图如下:

097ecc05fe090a93a6ccd8dce71643a8.png
24点算法

代码实现如下:

// 1. 定义误差范围,定义要对比的值,定义运算符数组;
let elipson = 0.001
let Targe
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值