diff --git a/README b/README index d089163..899a9ce 100644 --- a/README +++ b/README @@ -72,4 +72,4 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Here is a nice link to the licence: -http://www.gnu.org/licenses/gpl-2.0.html \ No newline at end of file +http://www.gnu.org/licenses/gpl-2.0.html diff --git a/Unuk-QT/Makefile b/Unuk-QT/Makefile index a7a60a4..d7e9061 100644 --- a/Unuk-QT/Makefile +++ b/Unuk-QT/Makefile @@ -1,6 +1,6 @@ ############################################################################# # Makefile for building: Unuk-QT -# Generated by qmake (2.01a) (Qt 4.7.3) on: Thu Jan 5 16:49:04 2012 +# Generated by qmake (2.01a) (Qt 4.7.3) on: Sat Jan 7 00:36:51 2012 # Project: Unuk-QT.pro # Template: app # Command: /usr/bin/qmake-qt4 -spec /usr/share/qt4/mkspecs/linux-g++ CONFIG+=debug -o Makefile Unuk-QT.pro @@ -69,7 +69,8 @@ SOURCES = ../src/libUnuk/Debug.cpp \ ../src/libUnuk/MapElement.cpp \ ../src/libUnuk/MapEntities.cpp \ ../src/libUnuk/FPS.cpp \ - ../src/libUnuk/MemManager.cpp + ../src/libUnuk/MemManager.cpp \ + ../src/libUnuk/AStar.cpp OBJECTS = Debug.o \ main.o \ Input.o \ @@ -96,7 +97,8 @@ OBJECTS = Debug.o \ MapElement.o \ MapEntities.o \ FPS.o \ - MemManager.o + MemManager.o \ + AStar.o DIST = /usr/share/qt4/mkspecs/common/g++.conf \ /usr/share/qt4/mkspecs/common/unix.conf \ /usr/share/qt4/mkspecs/common/linux.conf \ @@ -196,7 +198,7 @@ qmake: FORCE dist: @$(CHK_DIR_EXISTS) .tmp/Unuk-QT1.0.0 || $(MKDIR) .tmp/Unuk-QT1.0.0 - $(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/Unuk-QT1.0.0/ && $(COPY_FILE) --parents ../src/libUnuk/Debug.h ../src/Libs/wglext.h ../src/Libs/glxext.h ../src/libUnuk/Input.h ../src/libUnuk/Rect.h ../src/libUnuk/Timer.h ../src/libUnuk/Font.h ../Constants.h ../src/Unuk/Constants.h ../src/libUnuk/ApplySurface.h ../src/Unuk/Globals.h ../src/libUnuk/ImageLoader.h ../src/libUnuk/TextureManager.h ../src/libUnuk/Texture.h ../src/libUnuk/Text.h ../src/libUnuk/MapTile.h ../src/libUnuk/Map.h ../src/libUnuk/Button.h ../src/libUnuk/ButtonToggle.h ../src/libUnuk/MainMenu.h ../src/libUnuk/ParticleEmitter.h ../src/libUnuk/IngameMenu.h ../src/libUnuk/Collision.h ../src/libUnuk/Character.h ../src/libUnuk/NPC.h ../src/Unuk/Player.h ../src/Unuk/Game.h ../src/libUnuk/MapElement.h ../src/libUnuk/MapEntities.h ../src/libUnuk/FPS.h ../src/libUnuk/MemManager.h ../src/libUnuk/MemClass.h .tmp/Unuk-QT1.0.0/ && $(COPY_FILE) --parents ../src/libUnuk/Debug.cpp ../src/Unuk/main.cpp ../src/libUnuk/Input.cpp ../src/libUnuk/Timer.cpp ../src/libUnuk/Font.cpp ../src/libUnuk/ApplySurface.cpp ../src/Unuk/Globals.cpp ../src/libUnuk/Rect.cpp ../src/libUnuk/ImageLoader.cpp ../src/libUnuk/TextureManager.cpp ../src/libUnuk/Texture.cpp ../src/libUnuk/Text.cpp ../src/libUnuk/Map.cpp ../src/libUnuk/Button.cpp ../src/libUnuk/ButtonToggle.cpp ../src/libUnuk/ParticleEmitter.cpp ../src/libUnuk/MainMenu.cpp ../src/libUnuk/IngameMenu.cpp ../src/libUnuk/Collision.cpp ../src/libUnuk/Character.cpp ../src/libUnuk/NPC.cpp ../src/Unuk/Player.cpp ../src/Unuk/Game.cpp ../src/libUnuk/MapElement.cpp ../src/libUnuk/MapEntities.cpp ../src/libUnuk/FPS.cpp ../src/libUnuk/MemManager.cpp .tmp/Unuk-QT1.0.0/ && (cd `dirname .tmp/Unuk-QT1.0.0` && $(TAR) Unuk-QT1.0.0.tar Unuk-QT1.0.0 && $(COMPRESS) Unuk-QT1.0.0.tar) && $(MOVE) `dirname .tmp/Unuk-QT1.0.0`/Unuk-QT1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/Unuk-QT1.0.0 + $(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/Unuk-QT1.0.0/ && $(COPY_FILE) --parents ../src/libUnuk/Debug.h ../src/Libs/wglext.h ../src/Libs/glxext.h ../src/libUnuk/Input.h ../src/libUnuk/Rect.h ../src/libUnuk/Timer.h ../src/libUnuk/Font.h ../Constants.h ../src/Unuk/Constants.h ../src/libUnuk/ApplySurface.h ../src/Unuk/Globals.h ../src/libUnuk/ImageLoader.h ../src/libUnuk/TextureManager.h ../src/libUnuk/Texture.h ../src/libUnuk/Text.h ../src/libUnuk/MapTile.h ../src/libUnuk/Map.h ../src/libUnuk/Button.h ../src/libUnuk/ButtonToggle.h ../src/libUnuk/MainMenu.h ../src/libUnuk/ParticleEmitter.h ../src/libUnuk/IngameMenu.h ../src/libUnuk/Collision.h ../src/libUnuk/Character.h ../src/libUnuk/NPC.h ../src/Unuk/Player.h ../src/Unuk/Game.h ../src/libUnuk/MapElement.h ../src/libUnuk/MapEntities.h ../src/libUnuk/FPS.h ../src/libUnuk/MemManager.h ../src/libUnuk/MemClass.h ../src/libUnuk/Node.h ../src/libUnuk/AStarBase.h ../src/libUnuk/AStar.h .tmp/Unuk-QT1.0.0/ && $(COPY_FILE) --parents ../src/libUnuk/Debug.cpp ../src/Unuk/main.cpp ../src/libUnuk/Input.cpp ../src/libUnuk/Timer.cpp ../src/libUnuk/Font.cpp ../src/libUnuk/ApplySurface.cpp ../src/Unuk/Globals.cpp ../src/libUnuk/Rect.cpp ../src/libUnuk/ImageLoader.cpp ../src/libUnuk/TextureManager.cpp ../src/libUnuk/Texture.cpp ../src/libUnuk/Text.cpp ../src/libUnuk/Map.cpp ../src/libUnuk/Button.cpp ../src/libUnuk/ButtonToggle.cpp ../src/libUnuk/ParticleEmitter.cpp ../src/libUnuk/MainMenu.cpp ../src/libUnuk/IngameMenu.cpp ../src/libUnuk/Collision.cpp ../src/libUnuk/Character.cpp ../src/libUnuk/NPC.cpp ../src/Unuk/Player.cpp ../src/Unuk/Game.cpp ../src/libUnuk/MapElement.cpp ../src/libUnuk/MapEntities.cpp ../src/libUnuk/FPS.cpp ../src/libUnuk/MemManager.cpp ../src/libUnuk/AStar.cpp .tmp/Unuk-QT1.0.0/ && (cd `dirname .tmp/Unuk-QT1.0.0` && $(TAR) Unuk-QT1.0.0.tar Unuk-QT1.0.0 && $(COMPRESS) Unuk-QT1.0.0.tar) && $(MOVE) `dirname .tmp/Unuk-QT1.0.0`/Unuk-QT1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/Unuk-QT1.0.0 clean:compiler_clean @@ -261,9 +263,9 @@ main.o: ../src/Unuk/main.cpp ../src/libUnuk/MainMenu.h \ ../src/libUnuk/MapEntities.h \ ../src/libUnuk/NPC.h \ ../src/libUnuk/Character.h \ - ../src/libUnuk/Collision.h \ ../src/libUnuk/MemClass.h \ ../src/libUnuk/MemManager.h \ + ../src/libUnuk/Collision.h \ ../src/Unuk/Game.h \ ../src/Unuk/Player.h \ ../src/libUnuk/IngameMenu.h \ @@ -398,6 +400,8 @@ Collision.o: ../src/libUnuk/Collision.cpp ../src/libUnuk/Collision.h Character.o: ../src/libUnuk/Character.cpp ../src/libUnuk/Character.h \ ../src/Unuk/Globals.h \ ../src/Unuk/Constants.h \ + ../src/libUnuk/MemClass.h \ + ../src/libUnuk/MemManager.h \ ../src/libUnuk/ApplySurface.h \ ../src/libUnuk/Debug.h \ ../src/libUnuk/ImageLoader.h \ @@ -416,6 +420,8 @@ NPC.o: ../src/libUnuk/NPC.cpp ../src/libUnuk/NPC.h \ ../src/libUnuk/Character.h \ ../src/Unuk/Globals.h \ ../src/Unuk/Constants.h \ + ../src/libUnuk/MemClass.h \ + ../src/libUnuk/MemManager.h \ ../src/libUnuk/ApplySurface.h \ ../src/libUnuk/Debug.h \ ../src/libUnuk/ImageLoader.h \ @@ -427,15 +433,15 @@ NPC.o: ../src/libUnuk/NPC.cpp ../src/libUnuk/NPC.h \ ../src/libUnuk/MapEntities.h \ ../src/libUnuk/Timer.h \ ../src/libUnuk/Text.h \ - ../src/libUnuk/Font.h \ - ../src/libUnuk/MemClass.h \ - ../src/libUnuk/MemManager.h + ../src/libUnuk/Font.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o NPC.o ../src/libUnuk/NPC.cpp Player.o: ../src/Unuk/Player.cpp ../src/Unuk/Player.h \ ../src/Unuk/Globals.h \ ../src/Unuk/Constants.h \ ../src/libUnuk/Character.h \ + ../src/libUnuk/MemClass.h \ + ../src/libUnuk/MemManager.h \ ../src/libUnuk/ApplySurface.h \ ../src/libUnuk/Debug.h \ ../src/libUnuk/ImageLoader.h \ @@ -447,9 +453,7 @@ Player.o: ../src/Unuk/Player.cpp ../src/Unuk/Player.h \ ../src/libUnuk/MapEntities.h \ ../src/libUnuk/Timer.h \ ../src/libUnuk/Text.h \ - ../src/libUnuk/Font.h \ - ../src/libUnuk/MemClass.h \ - ../src/libUnuk/MemManager.h + ../src/libUnuk/Font.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o Player.o ../src/Unuk/Player.cpp Game.o: ../src/Unuk/Game.cpp ../src/Unuk/Game.h \ @@ -457,6 +461,8 @@ Game.o: ../src/Unuk/Game.cpp ../src/Unuk/Game.h \ ../src/Unuk/Globals.h \ ../src/Unuk/Player.h \ ../src/libUnuk/Character.h \ + ../src/libUnuk/MemClass.h \ + ../src/libUnuk/MemManager.h \ ../src/libUnuk/ApplySurface.h \ ../src/libUnuk/Debug.h \ ../src/libUnuk/ImageLoader.h \ @@ -469,8 +475,6 @@ Game.o: ../src/Unuk/Game.cpp ../src/Unuk/Game.h \ ../src/libUnuk/Timer.h \ ../src/libUnuk/Text.h \ ../src/libUnuk/Font.h \ - ../src/libUnuk/MemClass.h \ - ../src/libUnuk/MemManager.h \ ../src/libUnuk/IngameMenu.h \ ../src/libUnuk/Button.h \ ../src/libUnuk/Input.h \ @@ -505,6 +509,10 @@ MemManager.o: ../src/libUnuk/MemManager.cpp ../src/libUnuk/MemClass.h \ ../src/libUnuk/MemManager.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o MemManager.o ../src/libUnuk/MemManager.cpp +AStar.o: ../src/libUnuk/AStar.cpp ../src/libUnuk/AStar.h \ + ../src/libUnuk/AStarBase.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o AStar.o ../src/libUnuk/AStar.cpp + ####### Install install: FORCE diff --git a/Unuk-QT/Unuk-QT.pro b/Unuk-QT/Unuk-QT.pro index 799c48b..7af9372 100644 --- a/Unuk-QT/Unuk-QT.pro +++ b/Unuk-QT/Unuk-QT.pro @@ -40,7 +40,9 @@ HEADERS += ../src/libUnuk/Debug.h \ ../src/libUnuk/FPS.h \ ../src/libUnuk/MemManager.h \ ../src/libUnuk/MemClass.h \ - ../src/libUnuk/Node.h + ../src/libUnuk/Node.h \ + ../src/libUnuk/AStarBase.h \ + ../src/libUnuk/AStar.h SOURCES += ../src/libUnuk/Debug.cpp \ ../src/Unuk/main.cpp \ ../src/libUnuk/Input.cpp \ @@ -67,4 +69,5 @@ SOURCES += ../src/libUnuk/Debug.cpp \ ../src/libUnuk/MapElement.cpp \ ../src/libUnuk/MapEntities.cpp \ ../src/libUnuk/FPS.cpp \ - ../src/libUnuk/MemManager.cpp + ../src/libUnuk/MemManager.cpp \ + ../src/libUnuk/AStar.cpp diff --git a/Unuk-QT/Unuk-QT.pro.user b/Unuk-QT/Unuk-QT.pro.user index bd1c449..90154c2 100644 --- a/Unuk-QT/Unuk-QT.pro.user +++ b/Unuk-QT/Unuk-QT.pro.user @@ -71,6 +71,7 @@ DISPLAY=:0 HOME=/home/allanis HUSHLOGIN=FALSE + LANGUAGE= LD_LIBRARY_PATH=/usr/lib/qtcreator LOGNAME=allanis LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36: @@ -110,6 +111,7 @@ DISPLAY=:0 HOME=/home/allanis HUSHLOGIN=FALSE + LANGUAGE= LD_LIBRARY_PATH=/usr/lib/qtcreator LOGNAME=allanis LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36: @@ -142,10 +144,11 @@ Debug - DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-ICZ0NvJNRS,guid=3b12f0647bd9cd4da4459e180000003d + DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-nnryLpuskH,guid=b1dc32eb5ce3f37b1b9bd14200000047 DISPLAY=:0 HOME=/home/allanis HUSHLOGIN=FALSE + LANGUAGE= LD_LIBRARY_PATH=/usr/lib/qtcreator LOGNAME=allanis LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36: @@ -155,13 +158,13 @@ QTDIR=/usr/share/qt4 SHELL=/bin/bash SHLVL=1 - SSH_AGENT_PID=3260 - SSH_AUTH_SOCK=/tmp/ssh-lozFEJmg3235/agent.3235 + SSH_AGENT_PID=3398 + SSH_AUTH_SOCK=/tmp/ssh-LnbIeWkr3373/agent.3373 TERM=linux USER=allanis WINDOWPATH=7 XAUTHORITY=/home/allanis/.Xauthority - XDG_SESSION_COOKIE=6de6dd7b78e791242262c6460000012e-1323089410.422893-1130065724 + XDG_SESSION_COOKIE=6de6dd7b78e791242262c6460000012e-1325788236.314939-282202860 _=/usr/bin/startx true diff --git a/src/libUnuk/AStar.cpp b/src/libUnuk/AStar.cpp index 085e4bc..763fc4b 100644 --- a/src/libUnuk/AStar.cpp +++ b/src/libUnuk/AStar.cpp @@ -1,9 +1,92 @@ #include "AStar.h" AStar::AStar(void) { - + while(_openList.size() > 0) { + _openList.pop(); + } + _closedList.clear(); + _solution.clear(); } AStar::~AStar(void) { - + AStarBase* best = 0; + while(_openList.size() > 0) { + best = _openList.top(); + _openList.pop(); + delete best; + } + _closedList.clear(); } + +/* + * Solved the situation given by the initial state with AStar, + * and returns a vector of AStarBase that solves the problem. + */ +std::vector AStar::Solve(AStarBase* initState) { + AStarBase* best = 0; + while(_openList.size() > 0) { + best = _openList.top(); + _openList.pop(); + delete best; + } + _closedList.clear(); + + _openList.push(initState); + return GetSolutionSequence(Search()); +} + +// Search for the best path. +AStarBase* AStar::Search(void) { + AStarBase* best = 0; + long key = 0; + std::vector child; + + while(_openList.size() > 0) { + while(_closedList.find(key) != _closedList.end()) { + // Take the best state, and check if it is on the closed list. + if(_openList.size() > 0) { + best = _openList.top(); + _openList.pop(); + } else + return 0; + + key = best->CalculateKey(); + } + + // Put best on the closed list. + _closedList[key] = best; + + // Check id best is our goal. + if(best->isGoal()) + return best; + + // Generate the children. + child = best->GenerateChildren(); + for(unsigned int i = 0; i < child.size(); i++) { + _openList.push(child[i]); + } + } + return 0; +} + +// Generate a solution sequence for a given state. +std::vector AStar::GetSolutionSequence(AStarBase* node) { + _solution.clear(); + AStarBase* state = node; + + while(state != 0) { + _closedList.erase(state->_key); + _solution.insert(_solution.begin(), state); + state = state->_parent; + } + + // Delete the states which are not part of the solution. + while(_closedList.size() > 0) { + state = _closedList.begin()->second; + _closedList.erase(state->_key); + delete state; + } + + return _solution; +} + diff --git a/src/libUnuk/AStar.h b/src/libUnuk/AStar.h index 56099d0..c98ff9a 100644 --- a/src/libUnuk/AStar.h +++ b/src/libUnuk/AStar.h @@ -1,10 +1,35 @@ -#include +#ifndef _ASTAR_H_ +#define _ASTAR_H_ +#include +#include +#include + +#include "AStarBase.h" class AStar { public: AStar(void); ~AStar(void); + std::vector Solve(AStarBase* initState); + private: - + // Comparison structure. + struct Cmp : public std::binary_function { + bool operator()(AStarBase* a1, AStarBase* a2) const { + return (a1->_totalEstimatedCost >= a2->_totalEstimatedCost); + } + }; + + std::priority_queue, Cmp > _openList; + std::map _closedList; + + AStarBase* Search(void); + + std::vector GetSolutionSequence(AStarBase* node); + std::vector _solution; + }; + +#endif + diff --git a/src/libUnuk/AStarBase.h b/src/libUnuk/AStarBase.h new file mode 100644 index 0000000..5dca74c --- /dev/null +++ b/src/libUnuk/AStarBase.h @@ -0,0 +1,30 @@ +#ifndef _ASTARBASE_H_ +#define _ASTARBASE_H_ +#include + +class AStarBase { +public: + AStarBase(void) { }; + virtual ~AStarBase(void) { }; + + // Generate a unique key. + virtual long CalculateKey(void) = 0; + + // Aproximate the heuristic cost to the goal. + virtual double Estimate(void) = 0; + + // Have we reached the goal? + virtual bool isGoal(void) = 0; + + virtual std::vector GenerateChildren(void) = 0; + + AStarBase* _parent; + + double _pastCost; + double _totalEstimatedCost; + + long _key; +}; + +#endif + diff --git a/src/libUnuk/Node.h b/src/libUnuk/Node.h deleted file mode 100644 index b3876ce..0000000 --- a/src/libUnuk/Node.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef _NODE_H_ -#define _NODE_H_ -#include -#include - -class Node { -public: - Node(int xArg, int yArg); - virtual ~Node(void); - - inline int GetX(void) const { return x; } - inline int GetY(void) const { return y; } - inline float GetCost(void) { return _cost; } - -private: - int x, y; - float _cost; -}; - -#endif