三消游戏的简单完整实现

本文介绍了如何使用二维数组来实现三消游戏的核心逻辑,从用户点击开始,通过递归判断元素连续序列,满足消除条件后,传递动画信息给UI展示层播放动画。详细阐述了ArrayCore.lua和GamePaper.lua两个关键文件的功能,并分享了在设计消除条件时的心得体会。
摘要由CSDN通过智能技术生成

基本思路:用二维数组实现核心的消除逻辑,然后提供接口给UI展示层。

游戏引擎:Quick-Cocos2dx-Community 3.7.7 Release

思路分析:采用自顶向下的设计风格。从用户点击开始,一步一步分解整个流程。

逻辑主干如下:
1,用户点击->
2,进入核心逻辑层判断要消除->
3,遍历二维数组,递归获得每个点的连续序列->
4,判断出连续序列符合消除规则->
5,获得消除、下落等的动画信息->
6,UI展示层根据动画信息播放单次点击后的动画

文件名:
1,ArrayCore.lua 二维数组实现的核心逻辑层
2,GamePaper.lua 利用渲染引擎实现的UI展示层

1,用户点击
将两个元素的数组坐标传递给核心逻辑层,获得动画播放信息

local animateInfo = ArrayCore:userInput(x1,y1,x2,y2)

if animateInfo then
   playAnimateByInfo(animateInfo) 
end

2-5,ArrayCore.lua的完整代码如下 :

--  2019101819:50:20 bluebear
--  三消核心逻辑层
--  用户输入,如果产生消除,则与消除后的结果共同构成数据返回给显示层。

local ArrayCore = {
   name = "ArrayCore"}

local array = {
   }
local ROW, COL, NUM = 0

local function getNearNum(i, j)
    local n1, n2 = nil
    if i > 2 then
        if array[i-1][j] == array[i-2][j] then
            n1 = array[i-1][j]
        end
    end

    if j > 2 then
        if array[i][j-1] == array[i][j-2] then
            n2 = array[i][j-1]
        end
    end
    return n1, n2
end

function ArrayCore:initArrayRandom(row, col, num)
    math.randomseed(tostring(os.time()):reverse():sub(1, 7))
    for i = 1, row do
        array[i] = {
   }
        for j = 1, col do
            local random = math.random(num)
            local n1, n2 = getNearNum(i, j)
            while random == n1 or random == n2 do
                random = math.random(num)
            end
            array[i][j] = random
        end
    end
    ROW = row 
    COL = col 
    NUM = num
    self.ROW = ROW
    self.COL = COL
    self.NUM = NUM
end

function ArrayCore:resetArray()
    self:initArrayRandom(ROW, COL, NUM)
end

local function printTable(t)
    for __,a in pairs(t) do
        print(a[1],a[2])
    end
end

local function isTIncPos(t,pos)
    for i = 1,#t do
        if t[i][1] == pos[1] and t[i][2] == pos[2] then
            return true
        end
    end
    return false
end
ArrayCore.isTIncPos = isTIncPos

local function addT2T(t1,t2)
    for i = 1,#t2 do
        if not isTIncPos(t1,t2[i]) then
            table.insert(t1,t2[i])
        end
    end
end

local function checkPos(x,y)
    local tmp_table = {
   {
   x,y}}
    local n = array[x][y]
    local function func(x,y)
        if x>=2 and array[x-1][y] == n and not isTIncPos(tmp_table,{
   x-1,y}) then
            table.insert(tmp_table, {
   x-1, y})
            func(x-1,y)
        end

        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值