继续完善接口。

This commit is contained in:
saturneric 2019-08-22 23:56:53 +08:00
parent e3b0a9e158
commit a432a0a090
33 changed files with 268 additions and 14 deletions

2
.gitignore vendored
View File

@ -339,3 +339,5 @@ ASALocalRun/
# BeatPulse healthcheck temp database
healthchecksdb
/Pop Engine/.DS_Store
/Pop Engine/._.DS_Store

BIN
Pop Engine/._Career.cpp Normal file

Binary file not shown.

BIN
Pop Engine/._Career.h Normal file

Binary file not shown.

BIN
Pop Engine/._Engine.cpp Normal file

Binary file not shown.

BIN
Pop Engine/._Engine.h Normal file

Binary file not shown.

BIN
Pop Engine/._Land.cpp Normal file

Binary file not shown.

BIN
Pop Engine/._Land.h Normal file

Binary file not shown.

BIN
Pop Engine/._Market.cpp Normal file

Binary file not shown.

BIN
Pop Engine/._Market.h Normal file

Binary file not shown.

BIN
Pop Engine/._Need.cpp Normal file

Binary file not shown.

BIN
Pop Engine/._Need.h Normal file

Binary file not shown.

BIN
Pop Engine/._Pop Engine.cpp Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
Pop Engine/._Population.cpp Normal file

Binary file not shown.

BIN
Pop Engine/._Population.h Normal file

Binary file not shown.

BIN
Pop Engine/._Production.cpp Normal file

Binary file not shown.

BIN
Pop Engine/._Production.h Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1 +1,5 @@
#include "Career.h"
shared_ptr<Production> Career::get_production(){
return pdt;
}

View File

@ -10,6 +10,7 @@ using namespace std;
class Career
{
public:
shared_ptr<Production> get_production(void);
private:
// The prodution which this career makes.

View File

@ -1 +1,5 @@
#include "Land.h"
shared_ptr<Market> Land::get_market(){
return mkt;
}

View File

@ -4,14 +4,18 @@
#include <string>
#include <vector>
#include "Population.h"
#include "Production.h"
class Market;
class Population;
using namespace std;
class Land
{
public:
shared_ptr<Market> get_market(void);
private:
vector<unique_ptr<Population>> pops;

View File

@ -1 +1,37 @@
#include "Market.h"
#include "Production.h"
#include "SellProduction.h"
#include <assert.h>
#include <algorithm>
shared_ptr<SellProduction> Market::get_sell_production(shared_ptr<Production> p_pdt){
auto p_sl_pdt_i = sl_pdts.find(p_pdt);
return p_sl_pdt_i->second;
}
shared_ptr<Market> Market::get_parent_market(){
return pae_mkts;
}
shared_ptr<PermitManager> Market::ask_for_selling_right(shared_ptr<Population> p_pop, shared_ptr<Production> p_pdt) {
shared_ptr<PermitManager> p_pm(new PermitManager(p_pop, p_pdt, this));
pmt_mgrs_buying.push_back(p_pm);
return p_pm;
}
shared_ptr<PermitManager> Market::ask_for_buying_right(shared_ptr<Population> p_pop) {
shared_ptr<PermitManager> p_pm(new PermitManager(p_pop, this));
pmt_mgrs_buying.push_back(p_pm);
return p_pm;
}
shared_ptr<Request> Market::send_production_to_sell(shared_ptr<PermitManager> p_pm, float price, float amount) {
shared_ptr<Request> pn_req(new Request(p_pm, price, amount));
auto p_spt = get_sell_production(p_pm->p_dpt);
p_spt->new_request(pn_req);
return pn_req;
}

View File

@ -2,22 +2,121 @@
#include <memory>
#include <vector>
#include <map>
#include "Population.h"
#include "SellProduction.h"
#include "Land.h"
using namespace std;
#define BUY_DEFINE 0
#define SELL_DEFINE 1
using Goods = float;
using Money = float;
// Money, Goods which the market returns to the seller or customer.
typedef pair<Money, Goods> MarketReturn;
// Information about price and need of a certain procuction in the market.
typedef pair<const Money, const Goods> MarketInfo;
// The Right to sell in this market.
typedef uint32_t SellingPermit;
// The Right to buy producrtion in this market.
typedef uint32_t BuyingPermit;
typedef uint32_t Permit;
// The number to identify certain population.
typedef uint32_t PopID;
// 市场准入证书
struct PermitManager {
const uint16_t type;
const shared_ptr<Population> p_pop;
const shared_ptr<Production> p_dpt;
const Market* p_mkt;
using PPOP = shared_ptr<Population>;
using PPDT = shared_ptr<Production>;
// 市场购买许可
PermitManager(PPOP pt_pop, PPDT pt_pdt, Market *pt_mkt) : type(BUY_DEFINE), p_pop(pt_pop), p_dpt(pt_pdt), p_mkt(pt_mkt) {}
// 市场销售许可
PermitManager(PPOP pt_pop, Market *pt_mkt) : type(SELL_DEFINE), p_pop(pt_pop), p_mkt(pt_mkt) {}
};
class SellProduction;
// 交易委托
struct Request {
friend class SellProduction;
const uint16_t type;
const shared_ptr<PermitManager> p_pmt;
const shared_ptr<Production> pdt;
Request(shared_ptr<PermitManager> pt_pmt, float price, float amount) : type(pt_pmt->type), p_pmt(pt_pmt), pdt(pt_pmt->p_dpt) {
this->price = price;
this->amount = amount;
this->active = true;
}
~Request() = default;
// 销售者或者购买者查询交易委托所用接口
const float show_money() { return money; }
const float show_amount() { return amount; }
private:
float money;
float amount;
float price;
bool active;
// 取消交易委托
void cancel() {
this->active = false;
}
};
class Market
{
public:
unique_ptr<MarketInfo> get_selling_production_info(shared_ptr<Production> p_pdt);
shared_ptr<Request> send_production_to_sell(shared_ptr<PermitManager> p_pm, float price,float amount);
MarketReturn get_money_from_selling(shared_ptr<Request> p_req);
MarketReturn cancel_selling_request(SellingPermit spmt_id);
// 获得市场销售准入证书
shared_ptr<PermitManager> ask_for_selling_right(shared_ptr<Population> p_pop, shared_ptr<Production> p_pdt);
// 获得市场购买准入证书
shared_ptr<PermitManager> ask_for_buying_right(shared_ptr<Population> p_pop);
void buy_production(BuyingPermit bpmt_id, string pdt_name, float money);
shared_ptr<Market> get_parent_market(void);
private:
// Selling productions in the market.
vector<unique_ptr<SellProduction>> sl_pdts;
map<shared_ptr<Production>, shared_ptr<SellProduction>> sl_pdts;
// Lands in this market
vector<shared_ptr<Land>> lands;
// Children markets.
vector<shared_ptr<Market>> sub_mkts;
// Parent market.
shared_ptr<Market> pae_mkts;
vector<shared_ptr<PermitManager>> pmt_mgrs_selling, pmt_mgrs_buying;
shared_ptr<SellProduction> get_sell_production(shared_ptr<Production> p_pdt);
void process_request(void);
void exchange_production(void);
void transfer_production(void);
};

View File

@ -10,6 +10,7 @@ using namespace std;
class Need
{
public:
private:
// Certain kinds of production which one of those careers need to matain their lives.

View File

@ -1 +1,8 @@
#include "Population.h"
#include "Production.h"
#include "Market.h"
void Population::work(){
goods = pop * ability / career->get_production()->get_value();
}

View File

@ -1,34 +1,47 @@
#pragma once
#include <memory>
#include <cstdint>
#include "Career.h"
#include "Market.h"
#include "Land.h"
using namespace std;
// The number to identify certain population.
typedef uint32_t PopID;
class Population
{
public:
// Population group working to get production.
void work(void);
// Sell production to get money.
void sell(void);
void sell_production(void);
// Give part of the money to nation.
void tax(void);
void give_tax(void);
// Buy the production the population needed from the market.
void buy(void);
void buy_needing(void);
// Part of the population move to another land
void move(void);
void move_away(void);
//Part of the population changes the career
void increase(void);
private:
// Career of this population group.
shared_ptr<Career> career;
// The land which the population belongs to.
shared_ptr<Land> land;
// Ability to make production.
float ability;
// The number of people of this population group.
float pop;
// Money rest from all recycle.
float money;
// Goods which this population makes.
float goods;
PopID pop_id;
};
};

View File

@ -1 +1,9 @@
#include "Production.h"
float Production::get_value(){
return value;
}
string Production::get_name(){
return name;
}

View File

@ -9,6 +9,8 @@ using namespace std;
class Production
{
public:
float get_value(void);
string get_name(void);
private:
// Raw material to make this production.

View File

@ -1 +1,36 @@
#include "SellProduction.h"
void SellProduction::new_request(shared_ptr<Request> pn_req) {
if (pn_req->type == SELL_DEFINE) {
reqs_sl.push_back(pn_req);
update_selling_map(pn_req->price, pn_req->amount);
}
else
{
reqs_by.push_back(pn_req);
update_buying_map(pn_req->price, pn_req->amount);
}
}
inline void SellProduction::update_buying_map(Price price, Amount amount)
{
update_map(pce_b_lst, price, amount);
}
inline void SellProduction::update_selling_map(Price price, Amount amount)
{
update_map(pce_s_lst, price, amount);
}
void SellProduction::update_map(map<Price, PriceList>& pce_map, Price price, Amount amount)
{
auto pcemp_i = pce_s_lst.find(price);
if (pcemp_i == pce_s_lst.end()) {
pce_s_lst.insert(PriceMap(price, PriceList(price, amount)));
}
else {
pcemp_i->second.second += amount;
}
}

View File

@ -1,14 +1,52 @@
#pragma once
#include "Production.h"
class SellProduction :
public Production
#include "Market.h"
#include <map>
using std::pair;
using std::map;
class SellProduction
{
public:
using Amount = float;
using Price = float;
using PriceList = pair<Price, Amount>;
using PriceMap = pair<Price, PriceList>;
SellProduction(shared_ptr<Production> pt_pdt) : p_pdt(pt_pdt) {}
// 委托请求接口
void new_request(shared_ptr<Request> pn_req);
bool cancel_request(shared_ptr<Request> pn_req);
const float get_average_price();
const float get_selling_amount();
const float get_buying_amount();
private:
float num;
float price;
float need;
shared_ptr<Production> type;
// 价位表
map<Price, PriceList> pce_s_lst, pce_b_lst;
// 产品指针
shared_ptr<Production> p_pdt;
// 销售交易委托
vector<shared_ptr<Request>> reqs_sl;
// 购买交易委托
vector<shared_ptr<Request>> reqs_by;
// 交易统计
float buy_amt = 0.0, sell_amt = 0.0;
// 平均价格
float price_avg = 0.0;
// 更新价位表接口
void update_buying_map(Price price, Amount amount);
void update_selling_map(Price price, Amount amount);
void update_map(map<Price, PriceList>& pce_map, Price price, Amount amount);
};