任何人都可以对如何处理这个问题给出一些消息吗?
答案 0 :(得分:1)
它必须是多维数组吗?像这样的“泡沫”结构怎么样:
typedef struct t_bubble_tag {
t_colour colour; /* whatever else you want to store about your bubble */
struct t_bubble_tag pUpperLeft;
struct t_bubble_tag pUpperRight;
struct t_bubble_tag pLeft;
struct t_bubble_tag pRight;
struct t_bubble_tag pLowerLeft;
struct t_bubble_tag pLowerRight;
} t_bubble;
然后,当你弹出一个给定的气泡时,你可以做两个方向和横向两个方向的树,并摆脱任何最终没有附着在顶墙上的“气岛”。请记住,气泡可以通过侧面或下面的其他气泡的“臂”来支撑。
我怀疑这比使用多维数组的存储效率更低,但速度更快。
答案 1 :(得分:1)
我在Lua用桌子实现了这个益智泡泡游戏, http://www.youtube.com/watch?v=rD0fQVSj_7w&list=UUlKVS4jFzSMXF9l6Jw1uoaw&feature=plcp 你可以在这里看到代码: https://gist.github.com/1725481
您可以使用二维表格将此实现用于拼图板:
function Puzzle:loadPuzzle()
print("Loading level "..level)
self.state = PUZZLE_LOADING
-- create the bubbles
local n = 0
local k = 0
local w = self.width
local h = self.height
for i=1, h do
self.bubbles[i] = {}
n = 0
if levels[level][i]~=nil then
n = #(levels[level][i])
end
local aux = 0
if math.fmod(i,2)==0 then
aux = (self.bubbleSize/2) + 16
end
local y = self.initHeight+self.tileSize*self.height - self.bubbleSize - (i-1)*self.tileSize
for j=1,self.width do
local c,state = nil,BUBBLE_EMPTY
if nil==levels[level][i] or nil == levels[level][i][j] then
c = nil
if aux>0 and j==self.width then
state = nil
end
else
c = levels[level][i][j]
state = BUBBLE_ATTACHED
self:addCurrentColor(c,currentColors)
end
self.bubbles[i][j] = Bubble(
vec2(aux+self.initWidth+self.tileSize*j - self.bubbleSize,y),
self.tileSize, -- bubble radius size
c --color
)
self.bubbles[i][j].state = state
end
end
sound(SOUND_POWERUP, 33755)
self.state = PUZZLE_PLAYING
print(""..(#currentColors).." colors")
end
用C代码写的很简单......
答案 2 :(得分:0)
我认为在拼图泡泡游戏中使用这种数据结构并不是一个好主意,因为它需要为主板上的所有气泡更新很多指针。
请采取这个简单的案例:
当你有两个或三个相同颜色的气泡和两个不同颜色的气泡时,所有气泡都已设置在主板上;并且推出的下一个气泡是第一种颜色,它击中了三个一组,你首先将气泡附加到其位置然后更新所有指针。
然后,你必须通过所有这些指针搜索泡泡姐妹(相同的颜色和相邻),但这个数据结构更难找到,因为你必须构建几个具有很多条件的递归函数。 / p>
另外你必须知道第一行气泡比下一行更多,即使行数为7(例如),奇数行也有6个气泡。
使用表格你必须考虑这些情况,这里也有一个复杂性。 也许,另一个实现可能是使用树,其中根有第一行气泡作为子节点。