Add new creation method from a visual representation

This commit is contained in:
Marc Di Luzio 2014-12-16 13:12:56 +00:00
parent 8ade68101b
commit 7f639a6bf4
6 changed files with 72 additions and 16 deletions

View file

@ -15,6 +15,7 @@ set( SOURCES
game.cpp
board.cpp
unitv.cpp
unit.cpp
)
add_library( game ${SOURCES} )

26
game/unit.cpp Normal file
View file

@ -0,0 +1,26 @@
#include "unit.h"
#include "unitv.h"
#include <memory>
std::unique_ptr<CUnit> CUnit::getUnitFromVis( unitVis_c vis )
{
switch( vis )
{
case '^':
case '>':
case 'v':
case '<':
{
std::unique_ptr<CUnit> p = std::unique_ptr<CUnit>(new CUnitV);
if( (bool)p && p->setFromVisual(vis) )
{
return std::move(p);
}
break;
}
}
return std::move(std::unique_ptr<CUnit>(nullptr));
}

View file

@ -2,6 +2,7 @@
#define _UNIT_H_
#include <string>
#include <memory>
#include "vector2.h"
@ -15,11 +16,15 @@ typedef char unitVis_c;
class CUnit
{
public:
CUnit() = default;
virtual ~CUnit() = default;
virtual unitVis_c getVisual() const = 0;
virtual unitVis_c getVisual() const = 0;
virtual bool setFromVisual(unitVis_c& vis) = 0;
static std::unique_ptr<CUnit> getUnitFromVis( unitVis_c vis );
protected:
CUnit() = default;
private:

View file

@ -8,17 +8,18 @@ CUnitV::CUnitV()
}
// Map of visual representation of unitv
static const std::map< dir_t, unitVis_c > sk_visMap =
{
{dir_t::N,'^'},
{dir_t::E,'>'},
{dir_t::S,'v'},
{dir_t::W,'<'},
};
unitVis_c CUnitV::getVisual() const
{
// Map of visual representation of unitv
static const std::map< dir_t, unitVis_c > sk_visMap =
{
{dir_t::N,'^'},
{dir_t::E,'>'},
{dir_t::S,'v'},
{dir_t::W,'<'},
};
std::map< dir_t, char >::const_iterator it = sk_visMap.find(dir);
if( it == sk_visMap.end() )
@ -27,4 +28,21 @@ unitVis_c CUnitV::getVisual() const
}
return it->second;
}
bool CUnitV::setFromVisual( unitVis_c& vis )
{
std::map< dir_t, char >::const_iterator it;
for( it = sk_visMap.begin(); it != sk_visMap.end(); it++ )
{
if( it->second == vis )
{
dir == it->first;
return true;
}
}
// No matching direction to visual
return false;
}

View file

@ -11,7 +11,8 @@ public:
CUnitV();
virtual ~CUnitV() = default;
virtual unitVis_c getVisual() const;
virtual unitVis_c getVisual() const override;
virtual bool setFromVisual( unitVis_c& vis ) override;
private:

View file

@ -43,8 +43,13 @@ int main()
{
tests::test_CBoard();
std::cout<<"Testing units"<<std::endl;
CUnitV myV;
{
CUnitV myV;
std::cout<<myV.getVisual()<<std::endl;
}
std::cout<<myV.getVisual()<<std::endl;
{
std::unique_ptr<CUnit> myV = CUnit::getUnitFromVis('v');
std::cout<<myV->getVisual()<<std::endl;
}
};