level 12
就是所有区块的信息都保存在一个链表里,一个区块一个克隆体,怎么检测附近雷?(另外怎么识别自己这个克隆体在链表中的位置),这个是要做10*10区块10个雷的
2018年08月28日 07点08分
1
level 7
克隆体编号+链表,用数学方式计算周边的方块编号,然后统计
so easy
2018年08月28日 08点08分
3
然而我最主要的就是不会怎么用“”数学方式“计算周边的方块编号”
2018年08月28日 08点08分
以前听说什么关于*256
2018年08月28日 08点08分
level 10
有很多种方法。有用字符串的,有用链表的,有用碰撞箱的。
2018年08月28日 09点08分
5
碰撞箱。。。
2018年08月28日 10点08分
level 8
你用链表存雷的地方,有为1,无为0,旁边的分别等于x-1 x+1 x-10 x+10
2018年08月28日 10点08分
6
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分