#include "kobaltmeer.hpp" #include #include using namespace kobaltmeer; int main(){ std::set returning; return run("C++ Sammler",[&](const json& input,unsigned seed){ (void)seed;const auto& rules=input.at("rules");const auto& state=input.at("state"); int player=input.at("player"),size=rules.at("size"),capacity=rules.at("capacity"); const auto& own=state.at("players").at(player);Point yard{own.at("yard")[0],own.at("yard")[1]}; std::vector fleet;std::vector harbors; for(const auto& site:state.at("sites"))if(site.at("owner")==player)harbors.push_back(position(site)); std::map,int> occupied; for(const auto& ship:state.at("ships"))if(ship.at("owner")==player){fleet.push_back(ship);auto p=position(ship);occupied[{p.x,p.y}]=ship.at("id");} std::set> reserved;json out=orders(); std::sort(fleet.begin(),fleet.end(),[](const json&a,const json&b){return a.at("cargo")>b.at("cargo");}); for(const auto& ship:fleet){int id=ship.at("id"),cargo=ship.at("cargo");Point pos=position(ship);occupied.erase({pos.x,pos.y}); auto home=*std::min_element(harbors.begin(),harbors.end(),[&](Point a,Point b){return distance(pos,a,size)()-state.at("turn").get(); if(cargo>=capacity*.75||(cargo>0&&remaining<=distance(pos,home,size)+6))returning.insert(id); int value=state.at("resource").at(pos.y).at(pos.x),divisor=rules.at("move_divisor"); int fuel=rules.value("floor_move_cost",false)?value/divisor:(value+divisor-1)/divisor; char chosen='O';double best=-1e9; for(char action:std::string("ONESW")){auto target=destination(pos,action,size); if(action!='O'&&cargobest){best=score;chosen=action;} } auto target=destination(pos,chosen,size);reserved.insert({target.x,target.y});out["ships"][std::to_string(id)]=std::string(1,chosen); explain(out,id,returning.count(id)?home:target,returning.count(id)?"C++: Fracht abliefern":"C++: Nachbarfeld oder Abbau"); } out["spawn"]=fleet.size()<8&&state.at("turn").get()()*.55&&own.at("bank")>=rules.at("ship_cost")&&!reserved.count({yard.x,yard.y}); return out; }); }