今天写了以下代码,是游戏开始开发框架的一部分
神马都不说了, 直接上代码吧
/// 党派PK, 站好合适的队伍
void ScoreBar::PK(vecparty& a_pay, vecparty& a_ju, vecparty& a_out,
RANKVEC& a_vecRank, SCOREVEC& a_vecScore, CRIMEVEC& a_vecCrime)
{
//少数党和多数党积分
int32_t noraml_score, crime_score;
noraml_score = CScoreCnfg::Instance().GetSpecialScore(CHEAT, false);
crime_score = CScoreCnfg::Instance().GetSpecialScore(CHEAT, true);
//酱油党积分
int32_t offline_score = 0;
offline_score = CScoreCnfg::Instance().GetSpecialScore(OUT, true);
//关键时刻到了,拍手党和举手党进行PK,PK规则很简单
//就是少数服从多数,虽然哥认为真理掌握在少数人手里
//除名党总是悲剧,虽然他也不想这样,但事实如此
if (a_pay.size() >= a_ju.size())
{ //拍手党被多数席位,举手党悲剧鸟
}
else
{ //举手党多数席位,拍手党悲剧鸟
//突然间举手党变成拍手党,身份变了
//上马甲了
a_pay.swap(a_ju);
}
//无论如何,多数党变成拍手党
for (uint32_t i = 0; i < a_pay.size(); ++i)
{ //虽然不如大家同乐,但多数者还是受益
a_vecScore.push_back(noraml_score);
a_vecRank.push_back(a_pay[i]);
}
if (crime_score >= offline_score)
{ //悲剧党比酱油党强大,所以酱油党才是真正的悲剧
}
else
{ //酱油党强大,华丽变身举手党
a_out.swap(a_ju);
}
//虽然表面看起来是举手党,但其实它可以是拍手党和酱油党
//神马都是浮云
for (uint32_t i = 0; i < a_ju.size(); ++i)
{
a_vecScore.push_back(crime_score);
a_vecRank.push_back(a_ju[i]);
a_vecCrime.push_back(a_ju[i]);
}
//酱油党的地位低下, 但它也会华丽的出场
for (uint32_t i = 0; i < a_out.size(); ++i)
{
a_vecScore.push_back(crime_score);
a_vecRank.push_back(a_out[i]);
a_vecCrime.push_back(a_out[i]);
}
}
/// 决议的时刻到了,各位都请屏住呼吸,耐心等待
/// a_pay : 拍手党
/// a_ju : 举手党
/// a_out : 酱油党(原计划参加会议的,结果没有来,是被BS的)
/// a_vecRank : 利益排名
/// a_vecScore : 赃款排名
void ScoreBar::Vote(vecparty& a_pay, vecparty& a_ju, vecparty& a_out,
RANKVEC& a_vecRank, SCOREVEC& a_vecScore, CRIMEVEC& a_vecCrime)
{
//少数党和多数党积分
int32_t noraml_score, crime_score;
noraml_score = crime_score = 0;
noraml_score = CScoreCnfg::Instance().GetSpecialScore(CHEAT, false);
crime_score = CScoreCnfg::Instance().GetSpecialScore(CHEAT, true);
//酱油党积分
int32_t offline_score = 0;
offline_score = CScoreCnfg::Instance().GetSpecialScore(OUT, true);
if (a_pay.size() == (m_vecRank.size() - a_out.size()))
{ //如果都是拍手党,那么大家一起同乐(不包括除名党)
for (uint32_t i = 0; i < a_pay.size(); ++i)
{ //大家一起愉快的进行分享利益,达成共识分的钱多
int32_t score = CScoreCnfg::Instance().GetNormalScore(m_vecRank.size(), i);
a_vecScore.push_back(score);
a_vecRank.push_back(a_pay[i]);
}
//除名党被排挤,只能悲剧
for (uint32_t i = 0; i < a_out.size(); ++i)
{
a_vecScore.push_back(offline_score);
a_vecRank.push_back(a_out[i]);
a_vecCrime.push_back(a_out[i]);
}
}
else
{ //悲剧啊, 参数和Vote一样
PK(a_pay, a_ju, a_out, a_vecRank, a_vecScore, a_vecCrime);
//设置为浮云局
m_pDesk->SetFunYunGame();
}
//统计
}
/// 更新积分
void ScoreBar::UpdateScore(vecparty& a_party, uint32_t& a_scoreindex, SCOREVEC& a_vecScore, bool a_bOut)
{
assert(a_vecScore.size() >= (a_party.size()+ a_scoreindex));
//每个人都有份,不要着急
GamePlayer* pPlayer = NULL;
for (uint32_t i = 0; i < a_party.size(); ++i)
{
pPlayer = m_pDesk->GetPlayer(a_party[i]);
if (NULL != pPlayer)
{
pPlayer->SetGameScore(a_vecScore[i + a_scoreindex]);
if (a_bOut)
pPlayer->SetGameResult(RESULT_OUT);
}
else
{
//只能愉快的记录日志
}
}
}
/// 秋后算账
/// 其实表面来看拍手党是拍手党,但实际不一定,有潜伏的
void ScoreBar::StatisticParty(vecparty& a_pay, vecparty& a_ju, vecparty& a_out,
SCOREVEC& a_vecScore)
{
GamePlayer* pPlayer = NULL;
//如果举手党为空,表示大家都很happy
if (a_ju.empty())
{
if (!a_pay.empty())
{ //拍手党拍的最响亮的,它赢了,它不是一个人在战斗
pPlayer = m_pDesk->GetPlayer(a_pay[0]);
if (NULL != pPlayer)
pPlayer->SetGameResult(RESULT_WIN);
}
else
{ //如果两党都为空,灵异事件,是不是宇宙射线的问题
//只能愉快的记录日志
}
}
uint32_t uScoreIndex = 0;
//拍手党积分大大的有
UpdateScore(a_pay, uScoreIndex, a_vecScore);
//举手党的积分一般是负的,不爽
UpdateScore(a_ju, uScoreIndex, a_vecScore);
//酱油党永远都是悲剧
UpdateScore(a_out, uScoreIndex, a_vecScore, true);
}
/// 获得各个利益集团的分赃结果,当然也包括悲剧党
void ScoreBar:: GetScoreRes(RANKVEC& _vecRank, SCOREVEC& _vecScore, CRIMEVEC& _vecCrime)
{
vecparty vecOutParty; //除名党
vecparty vecJuParty; //举手党(俗称利益党、反对党)
vecparty vecPayParty; //拍手党(俗称酱油党)
//伟大的时刻到了,请各位代表进行投票
for (uint32_t i = 0; i < m_vecRank.size(); ++i)
{
GamePlayer* pPlayer = m_pDesk->GetPlayer(m_vecRank[i]);
if (NULL == pPlayer || pPlayer->IsOut())
{ //如果在玩家列表中没有找到,或者是离线状态当成离线
//除名党不参与议题讨论
vecOutParty.push_back(m_vecRank[i]);
}
else
{
RESMAP::iterator it = m_mapRes.find(m_vecRank[i]);
if (m_mapRes.end() == it || it->second)
{ //如果没有找到,或者找到了为真,表示同意议题 (我党的拍手党)
vecPayParty.push_back(m_vecRank[i]);
}
else
{ //其他为不同意议题(我党的举手党)
vecJuParty.push_back(m_vecRank[i]);
}
}
}
//表决
Vote(vecPayParty, vecJuParty, vecOutParty, _vecRank, _vecScore, _vecCrime);
//秋后算账
StatisticParty(vecPayParty, vecJuParty, vecOutParty, _vecScore);
}