mirror of
https://github.com/ApfelTeeSaft/PlanetFleet.git
synced 2026-08-26 19:33:38 +00:00
beginning of pathfinding implementation
This commit is contained in:
+18
-13
@@ -5,15 +5,16 @@ set(CMAKE_BUILD_TYPE Debug)
|
|||||||
set(BUILD_TESTS ON)
|
set(BUILD_TESTS ON)
|
||||||
cmake_policy(SET CMP0015 NEW)
|
cmake_policy(SET CMP0015 NEW)
|
||||||
|
|
||||||
set(states activeGameState.cpp inGameAppState.cpp guiAppState.cpp)
|
set(STATES activeGameState.cpp inGameAppState.cpp guiAppState.cpp)
|
||||||
set(util util.cpp binds.h)
|
set(UTIL util.cpp binds.h)
|
||||||
set(gui tooltip.cpp optionsButton.cpp exitButton.cpp consoleCommand.cpp)
|
set(GUI tooltip.cpp optionsButton.cpp exitButton.cpp consoleCommand.cpp)
|
||||||
set(core gameManager.cpp main.cpp defConfigs.cpp)
|
set(CORE gameManager.cpp defConfigs.cpp)
|
||||||
set(ships vessel.cpp destroyer.cpp cruiser.cpp aircraftCarrier.cpp submarine.cpp)
|
set(SHIPS vessel.cpp destroyer.cpp cruiser.cpp aircraftCarrier.cpp submarine.cpp)
|
||||||
set(projectiles projectile.cpp guidedMissile.cpp depthCharge.cpp missile.cpp shell.cpp torpedo.cpp)
|
set(PROJECTILES projectile.cpp guidedMissile.cpp depthCharge.cpp missile.cpp shell.cpp torpedo.cpp)
|
||||||
set(aircraft jet.cpp demoJet.cpp missileJet.cpp)
|
set(AIRCRAFT jet.cpp demoJet.cpp missileJet.cpp)
|
||||||
set(fx explosion.cpp)
|
set(FX explosion.cpp)
|
||||||
set(content player.cpp unitDataManager.cpp unit.cpp map.cpp ${ships} ${projectiles} ${aircraft} ${fx})
|
set(CONTENT player.cpp unitDataManager.cpp unit.cpp pathfinder.cpp map.cpp ${SHIPS} ${PROJECTILES} ${AIRCRAFT} ${FX})
|
||||||
|
set(GAME_SRC ${STATES} ${GUI} ${CORE} ${CONTENT} ${UTIL})
|
||||||
|
|
||||||
set(SFML_DIR external/SFML)
|
set(SFML_DIR external/SFML)
|
||||||
set(VB01_DIR external/vb01)
|
set(VB01_DIR external/vb01)
|
||||||
@@ -23,7 +24,7 @@ set(GAME_BASE_DIR external/gameBase)
|
|||||||
set(GLFW_DIR ${VB01_DIR}/external/glfw/)
|
set(GLFW_DIR ${VB01_DIR}/external/glfw/)
|
||||||
set(GAME_NAME battleship)
|
set(GAME_NAME battleship)
|
||||||
|
|
||||||
add_executable(${GAME_NAME} ${states} ${gui} ${core} ${content} ${util})
|
add_executable(${GAME_NAME} main.cpp ${GAME_SRC})
|
||||||
|
|
||||||
target_include_directories(${GAME_NAME} PUBLIC ${FREETYPE_DIR}/include)
|
target_include_directories(${GAME_NAME} PUBLIC ${FREETYPE_DIR}/include)
|
||||||
|
|
||||||
@@ -67,8 +68,12 @@ if(BUILD_TESTS)
|
|||||||
link_directories(C:/Program\ Files\ \(x86\)/cppunit/lib)
|
link_directories(C:/Program\ Files\ \(x86\)/cppunit/lib)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(TEST_SRC testMain.cpp ${GAME_SRC})
|
set(TEST_SRC testMain.cpp pathfinderTest.cpp ${GAME_SRC})
|
||||||
|
set(TEST_NAME battleshipTests)
|
||||||
|
|
||||||
add_executable(battleshipTests ${TEST_SRC})
|
add_executable(${TEST_NAME} ${TEST_SRC})
|
||||||
target_link_libraries(battleshipTests ${DEPS} cppunit)
|
target_include_directories(${TEST_NAME} PUBLIC ${VB01_DIR})
|
||||||
|
target_include_directories(${TEST_NAME} PUBLIC ${VB01_GUI_DIR})
|
||||||
|
target_include_directories(${TEST_NAME} PUBLIC ${GAME_BASE_DIR})
|
||||||
|
target_link_libraries(${TEST_NAME} ${DEPS} cppunit)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -125,9 +125,12 @@ namespace battleship{
|
|||||||
for(int i = 0; i < numCellsByDim[0]; i++){
|
for(int i = 0; i < numCellsByDim[0]; i++){
|
||||||
cells[i] = new GraphNode*[numCellsByDim[1]];
|
cells[i] = new GraphNode*[numCellsByDim[1]];
|
||||||
|
|
||||||
for(int j = 0; j < numCellsByDim[1]; j++){
|
for(int j = 0; j < numCellsByDim[1]; j++)
|
||||||
cells[i][j] = new GraphNode[numCellsByDim[2]];
|
cells[i][j] = new GraphNode[numCellsByDim[2]];
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = 0; i < numCellsByDim[0]; i++){
|
||||||
|
for(int j = 0; j < numCellsByDim[1]; j++){
|
||||||
for(int k = 0; k < numCellsByDim[2]; k++){
|
for(int k = 0; k < numCellsByDim[2]; k++){
|
||||||
GraphNode::Type type = GraphNode::SEA;
|
GraphNode::Type type = GraphNode::SEA;
|
||||||
|
|
||||||
@@ -138,6 +141,32 @@ namespace battleship{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int numCells = numCellsByDim[0] * numCellsByDim[1] * numCellsByDim[2];
|
||||||
|
weights = new int*[numCells];
|
||||||
|
|
||||||
|
for(int i = 0; i < numCells; i++){
|
||||||
|
weights[i] = new int[numCells];
|
||||||
|
int x1 = i / numCellsByDim[2] / numCellsByDim[1];
|
||||||
|
int y1 = i / numCellsByDim[2] % numCellsByDim[1];
|
||||||
|
int z1 = i % numCellsByDim[2];
|
||||||
|
|
||||||
|
for(int j = 0; j < numCells; j++){
|
||||||
|
int x2 = j / numCellsByDim[2] / numCellsByDim[1];
|
||||||
|
int y2 = j / numCellsByDim[2] % numCellsByDim[1];
|
||||||
|
int z2 = j % numCellsByDim[2];
|
||||||
|
int weight;
|
||||||
|
|
||||||
|
if(abs(x1 - x2) == 1 || abs(y1 - y2) == 1 || abs(z1 - z2) == 1)
|
||||||
|
weight = 1;
|
||||||
|
else if(x1 == x2 && y1 == y2 && z1 == z2)
|
||||||
|
weight = 0;
|
||||||
|
else
|
||||||
|
weight = -1;
|
||||||
|
|
||||||
|
weights[i][j] = weight;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Map::unload() {}
|
void Map::unload() {}
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ namespace battleship{
|
|||||||
std::string mapName;
|
std::string mapName;
|
||||||
float cellSize = 1;
|
float cellSize = 1;
|
||||||
GraphNode*** cells = nullptr;
|
GraphNode*** cells = nullptr;
|
||||||
|
int **weights = nullptr;
|
||||||
|
|
||||||
void loadSkybox(gameBase::LuaManager*);
|
void loadSkybox(gameBase::LuaManager*);
|
||||||
void loadTerrain(gameBase::LuaManager*);
|
void loadTerrain(gameBase::LuaManager*);
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
#include "pathfinder.h"
|
||||||
|
|
||||||
|
namespace battleship{
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
static Pathfinder *pathfinder = nullptr;
|
||||||
|
|
||||||
|
Pathfinder* Pathfinder::getSingleton(){
|
||||||
|
if(!pathfinder)
|
||||||
|
pathfinder = new Pathfinder();
|
||||||
|
|
||||||
|
return pathfinder;
|
||||||
|
}
|
||||||
|
|
||||||
|
Pathfinder::Pathfinder(){
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<int> Pathfinder::findPath(int **weights, int size, int source, int sink){
|
||||||
|
int pathWeights[size];
|
||||||
|
pathWeights[0] = 0;
|
||||||
|
|
||||||
|
for(int i = 1; i < size; i++)
|
||||||
|
pathWeights[i] = -1;
|
||||||
|
|
||||||
|
vector<int> path;
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#ifndef PATHFINDER_H
|
||||||
|
#define PATHFINDER_H
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace battleship{
|
||||||
|
class Pathfinder{
|
||||||
|
public:
|
||||||
|
static Pathfinder* getSingleton();
|
||||||
|
std::vector<int> findPath(int**, int, int, int);
|
||||||
|
private:
|
||||||
|
Pathfinder();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
#include "pathfinderTest.h"
|
||||||
|
#include "pathfinder.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace battleship{
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
void PathfinderTest::testFindPath(){
|
||||||
|
int size = 7;
|
||||||
|
int w[size][size] = {
|
||||||
|
{0, 2, 4, -1, -1, -1, -1},
|
||||||
|
{-1, 0, 1, 9, 13, -1, -1},
|
||||||
|
{-1, 2, 0, -1, 4, 5, -1},
|
||||||
|
{-1, -1, -1, 0, -1, -1, 1},
|
||||||
|
{1, -1, -1, 1, 0, -1, 3},
|
||||||
|
{-1, -1, -1, -1, 9, 0, 2},
|
||||||
|
{-1, -1, -1, -1, -1, -1, 0}
|
||||||
|
};
|
||||||
|
int **weights = new int*[size];
|
||||||
|
|
||||||
|
for(int i = 0; i < size; i++){
|
||||||
|
weights[i] = new int[size];
|
||||||
|
|
||||||
|
for(int j = 0; j < size; j++)
|
||||||
|
weights[i][j] = w[i][j];
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<int> path = pathfinder->findPath(weights, size, 0, size - 1);
|
||||||
|
CPPUNIT_ASSERT(path.size() == 6);
|
||||||
|
|
||||||
|
int sumPathWeights = 0;
|
||||||
|
|
||||||
|
for(int p : path)
|
||||||
|
sumPathWeights += p;
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT(sumPathWeights == 9);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PathfinderTest::setUp(){
|
||||||
|
pathfinder = Pathfinder::getSingleton();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PathfinderTest::tearDown(){
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
#ifndef PATHFINDER_TEST_H
|
||||||
|
#define PATHFINDER_TEST_H
|
||||||
|
|
||||||
|
#include <cppunit/TestFixture.h>
|
||||||
|
#include <cppunit/extensions/HelperMacros.h>
|
||||||
|
|
||||||
|
namespace battleship{
|
||||||
|
class Pathfinder;
|
||||||
|
|
||||||
|
class PathfinderTest : public CppUnit::TestFixture{
|
||||||
|
CPPUNIT_TEST_SUITE(PathfinderTest);
|
||||||
|
CPPUNIT_TEST(testFindPath);
|
||||||
|
CPPUNIT_TEST_SUITE_END();
|
||||||
|
|
||||||
|
public:
|
||||||
|
PathfinderTest(){}
|
||||||
|
void testFindPath();
|
||||||
|
void setUp();
|
||||||
|
void tearDown();
|
||||||
|
private:
|
||||||
|
Pathfinder *pathfinder = nullptr;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -3,10 +3,14 @@
|
|||||||
#include <cppunit/TestCaller.h>
|
#include <cppunit/TestCaller.h>
|
||||||
#include <cppunit/ui/text/TestRunner.h>
|
#include <cppunit/ui/text/TestRunner.h>
|
||||||
|
|
||||||
|
#include "pathfinderTest.h"
|
||||||
|
|
||||||
using namespace CppUnit;
|
using namespace CppUnit;
|
||||||
|
using namespace battleship;
|
||||||
|
|
||||||
int main(){
|
int main(){
|
||||||
TextUi::TestRunner runner;
|
TextUi::TestRunner runner;
|
||||||
|
runner.addTest(PathfinderTest::suite());
|
||||||
runner.run();
|
runner.run();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user