如何制作拼图泡沫的“矩阵”?

时间:2010-11-19 16:49:27

标签: c multidimensional-array

嘿伙计们,我正在尝试制作一个益智泡泡克隆,但我对如何处理背景材料感到难过。主要是线条不匹配的事实(即:而不是有另一个没有顶部的气泡,一个在左上角,一个在右上角,它有一个在左上角,一个在右上角http://dl.dropbox.com/u/680263/puzzle_bobble_2.jpg)以及如何确定哪些气泡在我拍摄时会弹出(哪个下降)而不会使我的i7哭泣的蛮力算法。

任何人都可以对如何处理这个问题给出一些消息吗?

3 个答案:

答案 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个气泡。

使用表格你必须考虑这些情况,这里也有一个复杂性。 也许,另一个实现可能是使用树,其中根有第一行气泡作为子节点。