Browse Source

refactor(CAPI): change view function

tags/0.1.0
DragonAura 2 years ago
parent
commit
99e3f61c1f
3 changed files with 57 additions and 49 deletions
  1. +22
    -15
      CAPI/cpp/API/include/utils.hpp
  2. +27
    -26
      CAPI/cpp/API/src/logic.cpp
  3. +8
    -8
      CAPI/cpp/API/src/main.cpp

+ 22
- 15
CAPI/cpp/API/include/utils.hpp View File

@@ -20,16 +20,20 @@ namespace AssistFunction
return grid / numOfGridPerCell;
}

inline bool HaveView(int viewRange, int x, int y, int newX, int newY, THUAI6::PlaceType myPlace, THUAI6::PlaceType newPlace, std::vector<std::vector<THUAI6::PlaceType>>& map)
inline bool HaveView(int viewRange, int x, int y, int newX, int newY, std::vector<std::vector<THUAI6::PlaceType>>& map)
{
int deltaX = newX - x;
int deltaY = newY - y;
double distance = deltaX * deltaX + deltaY * deltaY;
THUAI6::PlaceType myPlace = map[GridToCell(x)][GridToCell(y)];
THUAI6::PlaceType newPlace = map[GridToCell(newX)][GridToCell(newY)];
if (newPlace == THUAI6::PlaceType::Grass && myPlace != THUAI6::PlaceType::Grass) // 草丛外必不可能看到草丛内
return false;
if (distance < viewRange * viewRange)
{
int divide = std::max(std::abs(deltaX), std::abs(deltaY)) / 100;
if (divide == 0)
return true;
double dx = deltaX / divide;
double dy = deltaY / divide;
double myX = double(x);
@@ -209,6 +213,7 @@ namespace Proto2THUAI6
tricker->playerID = trickerMsg.player_id();
tricker->viewRange = trickerMsg.view_range();
tricker->radius = trickerMsg.radius();
tricker->playerType = THUAI6::PlayerType::TrickerPlayer;
tricker->buff.clear();
for (int i = 0; i < trickerMsg.buff().size(); i++)
tricker->buff.push_back(trickerBuffTypeDict[trickerMsg.buff(i)]);
@@ -358,13 +363,13 @@ namespace THUAI62Proto
{THUAI6::StudentType::StudentType4, protobuf::StudentType::STUDENTTYPE4},
};

inline std::map<THUAI6::StudentBuffType, protobuf::StudentBuffType> studentBuffTypeDict{
{THUAI6::StudentBuffType::NullStudentBuffType, protobuf::StudentBuffType::NULL_SBUFF_TYPE},
{THUAI6::StudentBuffType::StudentBuffType1, protobuf::StudentBuffType::SBUFFTYPE1},
{THUAI6::StudentBuffType::StudentBuffType2, protobuf::StudentBuffType::SBUFFTYPE2},
{THUAI6::StudentBuffType::StudentBuffType3, protobuf::StudentBuffType::SBUFFTYPE3},
{THUAI6::StudentBuffType::StudentBuffType4, protobuf::StudentBuffType::SBUFFTYPE4},
};
// inline std::map<THUAI6::StudentBuffType, protobuf::StudentBuffType> studentBuffTypeDict{
// {THUAI6::StudentBuffType::NullStudentBuffType, protobuf::StudentBuffType::NULL_SBUFF_TYPE},
// {THUAI6::StudentBuffType::StudentBuffType1, protobuf::StudentBuffType::SBUFFTYPE1},
// {THUAI6::StudentBuffType::StudentBuffType2, protobuf::StudentBuffType::SBUFFTYPE2},
// {THUAI6::StudentBuffType::StudentBuffType3, protobuf::StudentBuffType::SBUFFTYPE3},
// {THUAI6::StudentBuffType::StudentBuffType4, protobuf::StudentBuffType::SBUFFTYPE4},
// };

inline std::map<THUAI6::TrickerType, protobuf::TrickerType> trickerTypeDict{
{THUAI6::TrickerType::NullTrickerType, protobuf::TrickerType::NULL_TRICKER_TYPE},
@@ -374,13 +379,13 @@ namespace THUAI62Proto
{THUAI6::TrickerType::TrickerType4, protobuf::TrickerType::TRICKERTYPE4},
};

inline std::map<THUAI6::TrickerBuffType, protobuf::TrickerBuffType> trickerBuffTypeDict{
{THUAI6::TrickerBuffType::NullTrickerBuffType, protobuf::TrickerBuffType::NULL_TBUFF_TYPE},
{THUAI6::TrickerBuffType::TrickerBuffType1, protobuf::TrickerBuffType::TBUFFTYPE1},
{THUAI6::TrickerBuffType::TrickerBuffType2, protobuf::TrickerBuffType::TBUFFTYPE2},
{THUAI6::TrickerBuffType::TrickerBuffType3, protobuf::TrickerBuffType::TBUFFTYPE3},
{THUAI6::TrickerBuffType::TrickerBuffType4, protobuf::TrickerBuffType::TBUFFTYPE4},
};
// inline std::map<THUAI6::TrickerBuffType, protobuf::TrickerBuffType> trickerBuffTypeDict{
// {THUAI6::TrickerBuffType::NullTrickerBuffType, protobuf::TrickerBuffType::NULL_TBUFF_TYPE},
// {THUAI6::TrickerBuffType::TrickerBuffType1, protobuf::TrickerBuffType::TBUFFTYPE1},
// {THUAI6::TrickerBuffType::TrickerBuffType2, protobuf::TrickerBuffType::TBUFFTYPE2},
// {THUAI6::TrickerBuffType::TrickerBuffType3, protobuf::TrickerBuffType::TBUFFTYPE3},
// {THUAI6::TrickerBuffType::TrickerBuffType4, protobuf::TrickerBuffType::TBUFFTYPE4},
// };

// 用于将THUAI6的类转换为Protobuf的消息
inline protobuf::PlayerMsg THUAI62ProtobufPlayer(int64_t playerID, THUAI6::PlayerType playerType, THUAI6::StudentType studentType, THUAI6::TrickerType trickerType)
@@ -390,10 +395,12 @@ namespace THUAI62Proto
playerMsg.set_player_type(playerTypeDict[playerType]);
if (playerType == THUAI6::PlayerType::StudentPlayer)
{
playerMsg.set_player_type(protobuf::PlayerType::STUDENT_PLAYER);
playerMsg.set_student_type(studentTypeDict[studentType]);
}
else if (playerType == THUAI6::PlayerType::TrickerPlayer)
{
playerMsg.set_player_type(protobuf::PlayerType::TRICKER_PLAYER);
playerMsg.set_tricker_type(trickerTypeDict[trickerType]);
}
return playerMsg;


+ 27
- 26
CAPI/cpp/API/src/logic.cpp View File

@@ -325,6 +325,7 @@ void Logic::ProcessMessage()
bufferState->gameMap = std::move(map);
currentState->gameMap = bufferState->gameMap;
logger->info("Map loaded!");
break;
}
if (currentState->gameMap.empty())
{
@@ -404,14 +405,14 @@ void Logic::LoadBuffer(protobuf::MessageToClient& message)
switch (Proto2THUAI6::messageOfObjDict[item.message_of_obj_case()])
{
case THUAI6::MessageOfObj::PropMessage:
if (AssistFunction::HaveView(bufferState->studentSelf->viewRange, bufferState->studentSelf->x, bufferState->studentSelf->y, item.prop_message().x(), item.prop_message().y(), bufferState->studentSelf->place, Proto2THUAI6::placeTypeDict[item.prop_message().place()], currentState->gameMap))
if (AssistFunction::HaveView(bufferState->studentSelf->viewRange, bufferState->studentSelf->x, bufferState->studentSelf->y, item.prop_message().x(), item.prop_message().y(), currentState->gameMap))
{
bufferState->props.push_back(Proto2THUAI6::Protobuf2THUAI6Prop(item.prop_message()));
logger->debug("Add Prop!");
}
break;
case THUAI6::MessageOfObj::BulletMessage:
if (AssistFunction::HaveView(bufferState->studentSelf->viewRange, bufferState->studentSelf->x, bufferState->studentSelf->y, item.prop_message().x(), item.prop_message().y(), bufferState->studentSelf->place, Proto2THUAI6::placeTypeDict[item.prop_message().place()], currentState->gameMap))
if (AssistFunction::HaveView(bufferState->studentSelf->viewRange, bufferState->studentSelf->x, bufferState->studentSelf->y, item.prop_message().x(), item.prop_message().y(), currentState->gameMap))
{
bufferState->bullets.push_back(Proto2THUAI6::Protobuf2THUAI6Bullet(item.bullet_message()));
logger->debug("Add Bullet!");
@@ -419,9 +420,9 @@ void Logic::LoadBuffer(protobuf::MessageToClient& message)
break;
case THUAI6::MessageOfObj::ClassroomMessage:
{
if (AssistFunction::HaveView(bufferState->studentSelf->viewRange, bufferState->studentSelf->x, bufferState->studentSelf->y, item.classroom_message().x(), item.classroom_message().y(), bufferState->studentSelf->place, THUAI6::PlaceType::Land, currentState->gameMap))
if (AssistFunction::HaveView(bufferState->studentSelf->viewRange, bufferState->studentSelf->x, bufferState->studentSelf->y, item.classroom_message().x(), item.classroom_message().y(), currentState->gameMap))
{
auto pos = std::make_pair(item.classroom_message().x(), item.classroom_message().y());
auto pos = std::make_pair(AssistFunction::GridToCell(item.classroom_message().x()), AssistFunction::GridToCell(item.classroom_message().y()));
if (bufferState->mapInfo->classRoomState.count(pos) == 0)
{
bufferState->mapInfo->classRoomState.emplace(pos, item.classroom_message().progress());
@@ -437,9 +438,9 @@ void Logic::LoadBuffer(protobuf::MessageToClient& message)
}
case THUAI6::MessageOfObj::ChestMessage:
{
if (AssistFunction::HaveView(bufferState->studentSelf->viewRange, bufferState->studentSelf->x, bufferState->studentSelf->y, item.chest_message().x(), item.chest_message().y(), bufferState->studentSelf->place, THUAI6::PlaceType::Land, currentState->gameMap))
if (AssistFunction::HaveView(bufferState->studentSelf->viewRange, bufferState->studentSelf->x, bufferState->studentSelf->y, item.chest_message().x(), item.chest_message().y(), currentState->gameMap))
{
auto pos = std::make_pair(item.chest_message().x(), item.chest_message().y());
auto pos = std::make_pair(AssistFunction::GridToCell(item.chest_message().x()), AssistFunction::GridToCell(item.chest_message().y()));
if (bufferState->mapInfo->chestState.count(pos) == 0)
{
bufferState->mapInfo->chestState.emplace(pos, item.chest_message().progress());
@@ -455,9 +456,9 @@ void Logic::LoadBuffer(protobuf::MessageToClient& message)
}
case THUAI6::MessageOfObj::DoorMessage:
{
if (AssistFunction::HaveView(bufferState->studentSelf->viewRange, bufferState->studentSelf->x, bufferState->studentSelf->y, item.door_message().x(), item.door_message().y(), bufferState->studentSelf->place, THUAI6::PlaceType::Land, currentState->gameMap))
if (AssistFunction::HaveView(bufferState->studentSelf->viewRange, bufferState->studentSelf->x, bufferState->studentSelf->y, item.door_message().x(), item.door_message().y(), currentState->gameMap))
{
auto pos = std::make_pair(item.door_message().x(), item.door_message().y());
auto pos = std::make_pair(AssistFunction::GridToCell(item.door_message().x()), AssistFunction::GridToCell(item.door_message().y()));
if (bufferState->mapInfo->doorState.count(pos) == 0)
{
bufferState->mapInfo->doorState.emplace(pos, item.door_message().is_open());
@@ -475,9 +476,9 @@ void Logic::LoadBuffer(protobuf::MessageToClient& message)
}
case THUAI6::MessageOfObj::HiddenGateMessage:
{
if (AssistFunction::HaveView(bufferState->studentSelf->viewRange, bufferState->studentSelf->x, bufferState->studentSelf->y, item.hidden_gate_message().x(), item.hidden_gate_message().y(), bufferState->studentSelf->place, THUAI6::PlaceType::Land, currentState->gameMap))
if (AssistFunction::HaveView(bufferState->studentSelf->viewRange, bufferState->studentSelf->x, bufferState->studentSelf->y, item.hidden_gate_message().x(), item.hidden_gate_message().y(), currentState->gameMap))
{
auto pos = std::make_pair(item.hidden_gate_message().x(), item.hidden_gate_message().y());
auto pos = std::make_pair(AssistFunction::GridToCell(item.hidden_gate_message().x()), AssistFunction::GridToCell(item.hidden_gate_message().y()));
if (bufferState->mapInfo->hiddenGateState.count(pos) == 0)
{
bufferState->mapInfo->hiddenGateState.emplace(pos, Proto2THUAI6::Bool2HiddenGateState(item.hidden_gate_message().opened()));
@@ -493,9 +494,9 @@ void Logic::LoadBuffer(protobuf::MessageToClient& message)
}
case THUAI6::MessageOfObj::GateMessage:
{
if (!AssistFunction::HaveView(bufferState->studentSelf->viewRange, bufferState->studentSelf->x, bufferState->studentSelf->y, item.gate_message().x(), item.gate_message().y(), bufferState->studentSelf->place, THUAI6::PlaceType::Land, currentState->gameMap))
if (!AssistFunction::HaveView(bufferState->studentSelf->viewRange, bufferState->studentSelf->x, bufferState->studentSelf->y, item.gate_message().x(), item.gate_message().y(), currentState->gameMap))
{
auto pos = std::make_pair(item.gate_message().x(), item.gate_message().y());
auto pos = std::make_pair(AssistFunction::GridToCell(item.gate_message().x()), AssistFunction::GridToCell(item.gate_message().y()));
if (bufferState->mapInfo->gateState.count(pos) == 0)
{
bufferState->mapInfo->gateState.emplace(pos, item.gate_message().progress());
@@ -511,7 +512,7 @@ void Logic::LoadBuffer(protobuf::MessageToClient& message)
}
case THUAI6::MessageOfObj::TrickerMessage:
{
if (AssistFunction::HaveView(bufferState->studentSelf->viewRange, bufferState->studentSelf->x, bufferState->studentSelf->y, item.tricker_message().x(), item.tricker_message().y(), bufferState->studentSelf->place, Proto2THUAI6::placeTypeDict[item.tricker_message().place()], bufferState->gameMap))
if (AssistFunction::HaveView(bufferState->studentSelf->viewRange, bufferState->studentSelf->x, bufferState->studentSelf->y, item.tricker_message().x(), item.tricker_message().y(), bufferState->gameMap))
{
bufferState->trickers.push_back(Proto2THUAI6::Protobuf2THUAI6Tricker(item.tricker_message()));
logger->debug("Add Tricker!");
@@ -540,14 +541,14 @@ void Logic::LoadBuffer(protobuf::MessageToClient& message)
switch (Proto2THUAI6::messageOfObjDict[item.message_of_obj_case()])
{
case THUAI6::MessageOfObj::PropMessage:
if (AssistFunction::HaveView(bufferState->trickerSelf->viewRange, bufferState->trickerSelf->x, bufferState->trickerSelf->y, item.prop_message().x(), item.prop_message().y(), bufferState->trickerSelf->place, Proto2THUAI6::placeTypeDict[item.prop_message().place()], currentState->gameMap))
if (AssistFunction::HaveView(bufferState->trickerSelf->viewRange, bufferState->trickerSelf->x, bufferState->trickerSelf->y, item.prop_message().x(), item.prop_message().y(), currentState->gameMap))
{
bufferState->props.push_back(Proto2THUAI6::Protobuf2THUAI6Prop(item.prop_message()));
logger->debug("Add Prop!");
}
break;
case THUAI6::MessageOfObj::BulletMessage:
if (AssistFunction::HaveView(bufferState->trickerSelf->viewRange, bufferState->trickerSelf->x, bufferState->trickerSelf->y, item.prop_message().x(), item.prop_message().y(), bufferState->trickerSelf->place, Proto2THUAI6::placeTypeDict[item.prop_message().place()], currentState->gameMap))
if (AssistFunction::HaveView(bufferState->trickerSelf->viewRange, bufferState->trickerSelf->x, bufferState->trickerSelf->y, item.prop_message().x(), item.prop_message().y(), currentState->gameMap))
{
bufferState->bullets.push_back(Proto2THUAI6::Protobuf2THUAI6Bullet(item.bullet_message()));
logger->debug("Add Bullet!");
@@ -555,9 +556,9 @@ void Logic::LoadBuffer(protobuf::MessageToClient& message)
break;
case THUAI6::MessageOfObj::ClassroomMessage:
{
if (AssistFunction::HaveView(bufferState->trickerSelf->viewRange, bufferState->trickerSelf->x, bufferState->trickerSelf->y, item.classroom_message().x(), item.classroom_message().y(), bufferState->trickerSelf->place, THUAI6::PlaceType::Land, currentState->gameMap))
if (AssistFunction::HaveView(bufferState->trickerSelf->viewRange, bufferState->trickerSelf->x, bufferState->trickerSelf->y, item.classroom_message().x(), item.classroom_message().y(), currentState->gameMap))
{
auto pos = std::make_pair(item.classroom_message().x(), item.classroom_message().y());
auto pos = std::make_pair(AssistFunction::GridToCell(item.classroom_message().x()), AssistFunction::GridToCell(item.classroom_message().y()));
if (bufferState->mapInfo->classRoomState.count(pos) == 0)
{
bufferState->mapInfo->classRoomState.emplace(pos, item.classroom_message().progress());
@@ -573,9 +574,9 @@ void Logic::LoadBuffer(protobuf::MessageToClient& message)
}
case THUAI6::MessageOfObj::ChestMessage:
{
if (AssistFunction::HaveView(bufferState->trickerSelf->viewRange, bufferState->trickerSelf->x, bufferState->trickerSelf->y, item.chest_message().x(), item.chest_message().y(), bufferState->trickerSelf->place, THUAI6::PlaceType::Land, currentState->gameMap))
if (AssistFunction::HaveView(bufferState->trickerSelf->viewRange, bufferState->trickerSelf->x, bufferState->trickerSelf->y, item.chest_message().x(), item.chest_message().y(), currentState->gameMap))
{
auto pos = std::make_pair(item.chest_message().x(), item.chest_message().y());
auto pos = std::make_pair(AssistFunction::GridToCell(item.chest_message().x()), AssistFunction::GridToCell(item.chest_message().y()));
if (bufferState->mapInfo->chestState.count(pos) == 0)
{
bufferState->mapInfo->chestState.emplace(pos, item.chest_message().progress());
@@ -591,9 +592,9 @@ void Logic::LoadBuffer(protobuf::MessageToClient& message)
}
case THUAI6::MessageOfObj::DoorMessage:
{
if (AssistFunction::HaveView(bufferState->trickerSelf->viewRange, bufferState->trickerSelf->x, bufferState->trickerSelf->y, item.door_message().x(), item.door_message().y(), bufferState->trickerSelf->place, THUAI6::PlaceType::Land, currentState->gameMap))
if (AssistFunction::HaveView(bufferState->trickerSelf->viewRange, bufferState->trickerSelf->x, bufferState->trickerSelf->y, item.door_message().x(), item.door_message().y(), currentState->gameMap))
{
auto pos = std::make_pair(item.door_message().x(), item.door_message().y());
auto pos = std::make_pair(AssistFunction::GridToCell(item.door_message().x()), AssistFunction::GridToCell(item.door_message().y()));
if (bufferState->mapInfo->doorState.count(pos) == 0)
{
bufferState->mapInfo->doorState.emplace(pos, item.door_message().is_open());
@@ -611,9 +612,9 @@ void Logic::LoadBuffer(protobuf::MessageToClient& message)
}
case THUAI6::MessageOfObj::HiddenGateMessage:
{
if (AssistFunction::HaveView(bufferState->trickerSelf->viewRange, bufferState->trickerSelf->x, bufferState->trickerSelf->y, item.hidden_gate_message().x(), item.hidden_gate_message().y(), bufferState->trickerSelf->place, THUAI6::PlaceType::Land, currentState->gameMap))
if (AssistFunction::HaveView(bufferState->trickerSelf->viewRange, bufferState->trickerSelf->x, bufferState->trickerSelf->y, item.hidden_gate_message().x(), item.hidden_gate_message().y(), currentState->gameMap))
{
auto pos = std::make_pair(item.hidden_gate_message().x(), item.hidden_gate_message().y());
auto pos = std::make_pair(AssistFunction::GridToCell(item.hidden_gate_message().x()), AssistFunction::GridToCell(item.hidden_gate_message().y()));
if (bufferState->mapInfo->hiddenGateState.count(pos) == 0)
{
bufferState->mapInfo->hiddenGateState.emplace(pos, Proto2THUAI6::Bool2HiddenGateState(item.hidden_gate_message().opened()));
@@ -629,9 +630,9 @@ void Logic::LoadBuffer(protobuf::MessageToClient& message)
}
case THUAI6::MessageOfObj::GateMessage:
{
if (!AssistFunction::HaveView(bufferState->trickerSelf->viewRange, bufferState->trickerSelf->x, bufferState->trickerSelf->y, item.gate_message().x(), item.gate_message().y(), bufferState->trickerSelf->place, THUAI6::PlaceType::Land, currentState->gameMap))
if (!AssistFunction::HaveView(bufferState->trickerSelf->viewRange, bufferState->trickerSelf->x, bufferState->trickerSelf->y, item.gate_message().x(), item.gate_message().y(), currentState->gameMap))
{
auto pos = std::make_pair(item.gate_message().x(), item.gate_message().y());
auto pos = std::make_pair(AssistFunction::GridToCell(item.gate_message().x()), AssistFunction::GridToCell(item.gate_message().y()));
if (bufferState->mapInfo->gateState.count(pos) == 0)
{
bufferState->mapInfo->gateState.emplace(pos, item.gate_message().progress());
@@ -647,7 +648,7 @@ void Logic::LoadBuffer(protobuf::MessageToClient& message)
}
case THUAI6::MessageOfObj::StudentMessage:
{
if (AssistFunction::HaveView(bufferState->trickerSelf->viewRange, bufferState->trickerSelf->x, bufferState->trickerSelf->y, item.student_message().x(), item.student_message().y(), bufferState->trickerSelf->place, Proto2THUAI6::placeTypeDict[item.student_message().place()], bufferState->gameMap))
if (AssistFunction::HaveView(bufferState->trickerSelf->viewRange, bufferState->trickerSelf->x, bufferState->trickerSelf->y, item.student_message().x(), item.student_message().y(), bufferState->gameMap))
{
bufferState->students.push_back(Proto2THUAI6::Protobuf2THUAI6Student(item.student_message()));
logger->debug("Add Student!");


+ 8
- 8
CAPI/cpp/API/src/main.cpp View File

@@ -10,7 +10,7 @@
int THUAI6Main(int argc, char** argv, CreateAIFunc AIBuilder)
{
int pID = 0;
std::string sIP = "183.172.169.99";
std::string sIP = "172.22.32.1";
std::string sPort = "8888";
bool file = false;
bool print = false;
@@ -18,13 +18,13 @@ int THUAI6Main(int argc, char** argv, CreateAIFunc AIBuilder)
extern const THUAI6::PlayerType playerType;
extern const THUAI6::TrickerType trickerType;
extern const THUAI6::StudentType studentType;
// {
// file = true;
// print = true;
// Logic logic(playerType, pID, trickerType, studentType);
// logic.Main(AIBuilder, sIP, sPort, file, print, warnOnly);
// return 0;
// }
{
file = true;
print = true;
Logic logic(playerType, pID, trickerType, studentType);
logic.Main(AIBuilder, sIP, sPort, file, print, warnOnly);
return 0;
}

// 使用cmdline的正式版本
try


Loading…
Cancel
Save