自己写的贪吃蛇(4)

来源:互联网 发布:什么是非线性优化 编辑:程序博客网 时间:2024/06/07 00:17

增加一个最短路径的显示,让蛇移动的直观点
修改doAI如下

function SnakeGame:doAI(target)    if #self.targetLines > 0 then        return    end    target = target or self.tail       for k, v in ipairs(self.lineSquare) do         v:removeFromParent()    end    self.lineSquare = {}       local closed = self:checkAWay(self.snakes, target)    if closed then        self.targetLines = {}        table.insert(self.targetLines, closed[#closed].dir)        local parent = closed[#closed].parent        local ii = 1                    while parent and parent ~= closed[1] do            local index = parent.index                        local x = self.cells[index]            table.insert(self.targetLines, parent.dir)            if target == self.tail then                table.insert(self.fakeSnakes, parent)            end            -- 显示最短路径            local m = tsixi.TLabel:create(ii, 14, cc.c3b(0, 0,0))            m:setPosition(x)            m:setAnchorPoint(0,0)            self:addChild(m)            table.insert(self.lineSquare, m)            ii = ii + 1            parent = parent.parent        end              else        print("not find a way!")    endend

这里写图片描述

当生成的红块在蛇身体部位时,最短路径就找不到。
可以这样处理,当找不到最短路径时,先让蛇去找自己的尾巴的一个最短路径,然后再去找红块的最短路径
修改doAI

function SnakeGame:doAI(target)    if #self.targetLines > 0 then        return    end    target = target or self.tail        for k, v in ipairs(self.lineSquare) do         v:removeFromParent()    end    self.lineSquare = {}      local closed = self:checkAWay(self.snakes, target)    if closed then        self.targetLines = {}        table.insert(self.targetLines, closed[#closed].dir)        local parent = closed[#closed].parent        local ii = 1                    while parent and parent ~= closed[1] do            local index = parent.index                        local x = self.cells[index]            table.insert(self.targetLines, parent.dir)            if target == self.tail then                table.insert(self.fakeSnakes, parent)            end            -- 显示最短路径            local m = tsixi.TLabel:create(ii, 14, cc.c3b(0, 0,0))            m:setPosition(x)            m:setAnchorPoint(0,0)            self:addChild(m)            table.insert(self.lineSquare, m)            ii = ii + 1            parent = parent.parent        end              else        print("not find a way!")        -- 去搜寻到尾巴的最短路径        self:doAI(self.snakes[#self.snakes])    endend

同时修改onEnter让它在搜寻尾巴最短路径后再去搜寻红块

function SnakeGame:onEnter()    local time1 = tsixi.THelper:currentMilliseconds()    local update = function(dt)        if not self.is_failed then            local now = tsixi.THelper:currentMilliseconds()            if not self.parse and (now - time1 >= 50 or self.must) then                self.must = false                time1 = now                self.direction = self.targetLines[#self.targetLines]                table.remove(self.targetLines)                if self.direction == nil then                    -- 到达上一个尾巴后再去搜寻红块                    self:doAI()                    self.direction = self.targetLines[#self.targetLines]                    table.remove(self.targetLines)                end                        self:doMove()            end             end    end    self:scheduleUpdateWithPriorityLua(update, 0) end

现在基本可以解决红块在蛇身体的情况了

再做一些优化,增加一条假蛇来表示吃了红块后蛇的样子,如果假蛇可以找到最短路径到其假蛇尾巴,则去吃那个红点, 否则不吃红点而是去搜寻真蛇的尾巴

function SnakeGame:doAI(target)    if #self.targetLines > 0 then        return    end    target = target or self.tail    for k, v in ipairs(self.lineSquare) do         v:removeFromParent()    end    self.lineSquare = {}    self.fakeSnakes = {}        local closed = self:checkAWay(self.snakes, target)    if closed then        self.targetLines = {}        self.find_index = -1        table.insert(self.targetLines, closed[#closed].dir)        local parent = closed[#closed].parent        local ii = 1        while parent and parent ~= closed[1] do            local index = parent.index                        local x = self.cells[index]            table.insert(self.targetLines, parent.dir)            if target == self.tail then                table.insert(self.fakeSnakes, parent)            end            local m = tsixi.TLabel:create(ii, 14, cc.c3b(0, 0,0))            m:setPosition(x)            m:setAnchorPoint(0,0)            self:addChild(m)            table.insert(self.lineSquare, m)            ii = ii + 1            parent = parent.parent        end             if target == self.tail then                        table.insert(self.fakeSnakes, 1, closed[#closed])            local delta = #self.snakes - #self.fakeSnakes                        if delta >= 0 then                for i = 1, delta + 1 do                     table.insert(self.fakeSnakes, self.snakes[i])                end            else                while #self.fakeSnakes - #self.snakes > 1 do                     table.remove(self.fakeSnakes)                end            end            closed = self:checkAWay(self.fakeSnakes, self.fakeSnakes[#self.fakeSnakes])            if not closed then                print("mmmmmmmmmmmmmmmmmmm")                self:doAI(self.snakes[#self.snakes])            end        end       else        print("not find a way!")        self.find_index = 0--self.find_index + 1        self:doAI(self.snakes[#self.snakes - self.find_index])    endend

现在基本可以吃100多个红块了,但有时候还是会找不到最短路径或者死循环。。。以后有空了再看看怎么回事吧。
好了,传统贪吃蛇小游戏就写在这里。

0 0
原创粉丝点击