凑10游戏代码思路求助

在抖音看到一个凑十游戏,玩法就是圈起来的加起来是10就可以消除,想模仿一下,现在卡在提示这一步了,我要怎么才能判断出来场上的数字还能不能凑出来10呢c81f5f5d343c8c88461baa4e7d2d2f8
像这样的 (但是这个弄成5*5了 应该是偶数个)

=======编辑=======
3 4
一次可以圈任意个数字

相连的任意个数加起来等于10吗?

只要保证场上所有数字加起来能被10整除就行了,sum(numbers)%10 == 0;
比如5×5的地图,一共有25个数字,先随机生成24个数字(大于0,小于10),最后再来算第25个数,保证总数的尾数是0就可以。

2
是像这样画一个框,计算框里所有的数字加起来等不等于10

但是 如果场上剩下的数字排序是 9 ,2,1,8这样的 ,相加得10 但是是没法框柱的 无法继续游戏的

玩法不是连连看那样点两个数字连线,是我没说清楚,不好意思

分格子然后遍历每个格子周围8个方向有没有满足条件的

圈住的已经写好了,现在不知道怎么在他圈完之后判断剩下的还能不能圈出来10

荣我想想,刚刚回答错了

cocos商店不是有同类型玩法吗?不会写,就去买代码参考,多大的事

三种情况:1 判断行 2 判断列 3判断正方形

之前是这么写的,但是遇到这样的长方形就判断正方形判断不出来了,把所有的长方形都列出来会不会计算量太大了
1,1,
0,1,
4,3

0表示这个格子为空

总共才到10 数值不大

空的点视为0
左上向右下搜索视为正向,一次搜索是行列遍历,因为很快就能剪枝,计算量不大。
旋转90、180、270度后,复用同一个搜索算法
因此遍历4次大循环,每次行列遍历。

遍历 穷举

先mark下,等休息的时候写一下
目前大概的思路前面有楼层说过,针对行列遍历;
1.标识已经block掉(消除掉)的格子(blockedCellMap:{[row_col:string]:boolean}),这样做方便后面遍历查询;
2.有一个方法function getCellValue用来获取指定行列格子的值,如果该格子blocked掉,返回0,否则返回这个格子上的值
未完待续…

为啥不换思路,随机位置随机生成一种符合10的组合,其他空格再随机数字,这样最少有一种解,而且不用检查有没有解 :stuck_out_tongue_winking_eye:

有点像递归 随便确定一个格子 比如说是8 只需要判断它的4个邻格能不能凑出2来就行

假如就是5x5的棋盘。分解一下问题就不是那么困难了:
那么相当于选择两个位置,计算这两个位置所围成的小矩形内的数字和是否为10.
总结出来calcSum(idx0, idx2)
另外这两个位置可选数量就是25x24种情况:
(0,1),(0,2)…(1,2),(1,3)…(22,23),(22,24),(23,24) <=总共600中情况
分别当做参数去调用calcSum,有等于10的情况跳出计算,说明至少有一个矩形范围可以围成恰好10的情况。(这时候按照策划需求,可以继续找,也可以中断,比如策划说看了广告需要告诉此时所有可以围出的范围,那你就要600种情况找完)
根据我的经验,现代设备做这样量级的计算不是问题。
但是如果棋盘很大,我也心里也没数,具体可以测试出来。
优化:
做calcSum函数的时候可以优化一下,其中最复杂的情况的参数应该是(0,24),其实在遍历做加法的时候一旦当前的sum已经大于10了就结束calcSum了,用不着计算本次具体的值直接返回false,小于等于10的话不能停,要继续加。(注意中间等于10不要停,因为一定是拐行加和为10,不是方形范围不能算,方形范围在总结的那600种情况中如果出现早就出现了)
另外,这个优化只能用在你的格子无负数的情况。

前提是你要理解我说的 “两个点所围成的小矩形”是什么意思哦。
x a o o x
x o o b x
x x x x x
x x x x x
此时点a和b所围成的小矩形就是指点 (a,所有的o,b)这6个点了

计算量不算大