自己写的贪吃蛇(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
- 自己写的贪吃蛇(4)
- 自己写的贪吃蛇(1)
- 自己写的贪吃蛇(2)
- 自己写的贪吃蛇(3)
- 自己写的贪吃蛇
- 分享自己写的一个贪吃蛇的游戏(Linux)
- 用java的swing框架自己写贪吃蛇游戏
- 我自己写的第一个游戏--贪吃蛇(c语言实现)
- 我自己写的第一个游戏--贪吃蛇(windows下c语言实现)
- QT写的贪吃蛇(C++)
- JS写的贪吃蛇
- c#写的贪吃蛇
- Java写的贪吃蛇
- jquery 写的贪吃蛇。。
- c++写的贪吃蛇
- QT5写的贪吃蛇
- glut写的贪吃蛇
- glut写的贪吃蛇
- 使用json与服务器交互4.0新特新(必须设置线程)
- OpenCv中摄像机标定的源代码解析
- Spring 注释 @Autowired 和@Resource 的区别
- 虚拟继承与不能被继承的类
- js == 与 === 的区别
- 自己写的贪吃蛇(4)
- ubuntu环境下使用apt-get配置apache+php+mysql
- MediaMetadataRetriever 的使用,视频截取一帧
- github—本地建立与远端仓库的联系以及代码上传与合并
- Eclipse 添加依赖 库 Libary
- 支持高并发web服务器搭建
- 栈内存指针的问题
- Spring框架研究总结之SpEL
- 关于jsp编译指令include和动作指令include的区别