1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
--[[
Lua star example - Run with love (https://love2d.org/)
Copyright 2017 wesley werner <wesley.werner@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see http://www.gnu.org/licenses/.
]]--
local luastar = require("lua-star")
-- a 2D map where true is open and false is blocked
local map = { }
local mapsize = 10
local screensize = 500
local tilesize = screensize / mapsize
-- path start and end
local path = nil
local start = { x = 1, y = 10 }
local goal = { x = 10, y = 1 }
function love.load()
love.window.setMode( screensize, screensize )
-- build an open map
for x=1, mapsize do
map[x] = {}
for y=1, mapsize do
map[x][y] = true
end
end
requestPath()
end
function love.keypressed(key)
if key == "escape" then
love.event.quit()
end
end
function love.draw()
-- draw walls
love.graphics.setColor(255, 255, 255)
for x=1, mapsize do
for y=1, mapsize do
local fillstyle = "line"
if map[x][y] == false then fillstyle = "fill" end
love.graphics.rectangle(fillstyle, (x-1)*tilesize, (y-1)*tilesize, tilesize, tilesize)
end
end
-- draw start and end
love.graphics.print("START", (start.x-1) * tilesize, (start.y-1) * tilesize)
love.graphics.print("GOAL", (goal.x-1) * tilesize, (goal.y-1) * tilesize)
-- draw the path
if path then
for i, p in ipairs(path) do
love.graphics.setColor(0, 128, 0)
love.graphics.rectangle("fill", (p.x-1)*tilesize, (p.y-1)*tilesize, tilesize, tilesize)
love.graphics.setColor(255, 255, 255)
love.graphics.print(i, (p.x-1) * tilesize, (p.y-1) * tilesize)
end
end
end
function love.mousepressed( x, y, button, istouch )
local dx = math.floor(x / tilesize) + 1
local dy = math.floor(y / tilesize) + 1
map[dx][dy] = not map[dx][dy]
requestPath()
end
function positionIsOpenFunc(x, y)
-- should return true if the position is open to walk
return map[x][y]
end
function requestPath()
path = luastar:find(mapsize, mapsize, start, goal, positionIsOpenFunc)
end
|