【提问+技术交流】问关于扫雷检测附近雷的方法
scratch吧
全部回复
仅看楼主
level 12
(o.0) 楼主
就是所有区块的信息都保存在一个链表里,一个区块一个克隆体,怎么检测附近雷?(另外怎么识别自己这个克隆体在链表中的位置),这个是要做10*10区块10个雷的
2018年08月28日 07点08分 1
level 12
(o.0) 楼主
不要沉啊!防沉补丁!召唤!
2018年08月28日 07点08分 2
level 7
克隆体编号+链表,用数学方式计算周边的方块编号,然后统计
so easy
2018年08月28日 08点08分 3
然而我最主要的就是不会怎么用“”数学方式“计算周边的方块编号”
2018年08月28日 08点08分
以前听说什么关于*256
2018年08月28日 08点08分
level 12
吧主带头不理提问贴……[滑稽][滑稽][滑稽]
2018年08月28日 08点08分 4
提问帖基本都坟了...我也不能挖坟吧[阴险]
2018年08月28日 08点08分
@(o.0) 把它们给精了不就行了
2018年08月28日 08点08分
@死去的记忆又回来了草 私自精品帖子,撤销吧主
2018年08月28日 08点08分
@(o.0) 真的?不是有一个提问精品贴了吗[阴险]
2018年08月29日 06点08分
level 10
有很多种方法。有用字符串的,有用链表的,有用碰撞箱的。
2018年08月28日 09点08分 5
碰撞箱。。。
2018年08月28日 10点08分
@笨猫研究院🌿 碰撞箱怎么了[阴险]
2018年08月28日 11点08分
level 8
你用链表存雷的地方,有为1,无为0,旁边的分别等于x-1 x+1 x-10 x+10
2018年08月28日 10点08分 6
level 8
如果链表的第x+1项=1就将变量+1
2018年08月28日 10点08分 7

2018年08月28日 11点08分
level 10

【碰撞箱方法】
(其实应该叫
【撞雷法】)
建立一个新角色“
碰撞箱”还有一个链表“
待检测方块”
(还有地雷和不是地雷的方块应为两个角色)
每次鼠标按下时清空链表,并且
碰撞箱移到鼠标所在的那个方块。然后
碰撞箱往鼠标周围八个方块“撞”。每撞一次检测所是碰到地雷还是不是地雷方块,并且记录到变量 “地雷数”。结束后如果“地雷数”为 0 ,则把周围八给方块的坐标加入链表里头,否则把这个方块的造型切换为相应的“地雷数”造型。最后图章并且删除这个方块(如果链表里头包括了本方块的坐标就删除那个项)。
这时检测链表里头有没有东西,如果有就让
碰撞箱做同样的事情,直到链表里头没有东西为止。
优点:操作容易,脚本数量少,出错率低。
缺点:速度是最慢的……
@笨猫研究院🌿
2018年08月28日 12点08分 8
那个……我准备这几天发个详细的教程。等着啊[OK]
2018年08月28日 13点08分
给dalao递柠檬茶
2018年08月28日 13点08分
当年我想出的就是这个,后来被人骂太蠢,于是我开始尝试穷举法.....
2018年08月28日 15点08分
@笨猫研究院🌿 不蠢啊!穷举法反而需要更多的计算次数。
2018年08月28日 23点08分
level 5
广度优先搜索。
扫雷提前用一个模拟二维数组的链表存状态比较好。
将初始雷的xy坐标入队。
每次取队首,如果访问过或者是雷就不继续往下搜
然后向四个方向扩散,(x+1,y)(x-1,y)(x,y-1)(x,y+1)将二维坐标的序号转换到一维的链表只需要简单的公式。
将状态更新之后就让克隆体换造型就行
伪代码大概是这个样子
Q.push(node{x, y});
while (!Q.empty())
{
node u = Q.front();
Q.pop();
if (vis[u.x][u.y]) continue;
if (is_mine[u.x][u.y]) continue;
vis[u.x][u.y]=true;
show[u.x][u.y]=true;
Q.push(node{x+1,y});
Q.push(node{x-1,y});
Q.push(node{x,y+1});
Q.push(node{x,y-1});
}
这里show大概就是标记有没有被翻开的状态吧
另外队列是一种先进先出的数据结构,在scratch里push()是加在末尾,front()是取第一项,pop()是删掉第一项
(好像听说队列这样实现是O(n)的,要记head和tail,但扫雷一般规模不高可以直接这么加)
vis数组可以保证你的搜索复杂度是在扫雷地图大小以内的,这个搜索方式也能保证正确性。
2018年08月29日 12点08分 10
直接在数据里进行操作肯定是比在屏幕上碰撞好一些的吧。
2018年08月29日 12点08分
@Mr_Wu0603 那是当然。我说的只是一个例子。还有删除第一项对Scratch来说很慢的……
2018年08月29日 13点08分
level 11
广度优先搜索
2018年09月08日 07点09分 12
1