气人的小火龙

  

根据客户端传递的小火龙的等级和数目来确定返还给玩家的宝石的数目?

#include <iostream>
#include <string>
#include<map>
#include <set>
#include <vector>
using namespace std;


//玩家剩余的包裹数目
const int spaceNum = 10;
//玩家包裹里水晶的数目
const int cryNum = 1;


//宝石的道具ID 
const int gemID = 799;
//水晶的道具ID 
const int crystalID = 800;
//小火龙的道具ID 
const int smallDragonID = 888;
int role[] = {1,10,2,25,3,50};
int role_len = sizeof(role)/sizeof(role[0]);
/**
 * \brief 发送提示给玩家
 * @test 提示的内容
 */
void sendTextToUser(const string &text)
{
cout << text << endl;
}


/**
 * \brief 写日志到文件,以便查询相关错误日志信息
 * @log 日志的内容
 */
void writeLog(const string &log)
{
cout << "log:" << log << endl; 
}


struct exchangeGem_CS
{
exchangeGem_CS()
{
//objThisIDA = 0;
//objThisIDB = 0;
}
set<int> st;
//int objThisIDA;//道具A的唯一ID
//int objThisIDB;//道具B的唯一ID
};


struct item
{
int id;// 道具ID
int thisid;//道具唯一ID 
int aptitude;//资质
};


/**
 * \brief 玩家的包裹类
 */
struct package
{
/**
* \brief 获取包裹剩余空间
* @return 包裹剩余空间数目
*/
int getSpaceNum(){ return spaceNum;}


/**
* \brief 添加道具进包裹
* @itemID 道具ID
* @itemNum 道具数目
* @return 道具是否添加成功
*/
bool addItem(int itemID,int itemNum)
{
//中间有很长的代码,可能会返回false;
sendTextToUser("添加道具成功");
return true;
}


/**
* \brief 从包裹里扣除道具
* @itemID 道具ID
* @return 道具是否扣除成功
*/
bool removeItem(int itemID)
{
//中间有很长的代码,可能会返回false;
return true;
}

/**
* \brief 从包裹里扣除道具
* @thisid 道具指针
* @return 道具是否扣除成功
*/
bool removeItem(item* m_item)
{
if (m_item == NULL) return false;
itemMap.erase(m_item->thisid);
delete m_item;
m_item = NULL;
return true;
}


/**
* \brief 从包裹里扣除道具
* @itemID 道具ID
* @return 道具是否扣除成功
*/
int getItemNum(int itemID)
{
if (itemID == crystalID)
return cryNum;
return 0;
}



/**
* \brief 从包裹里获取道具指针
* @thisid 道具ID
* @return 道具指针
*/
item* getItemByThisID(const int thisid)
{
std::map<int,item*>::iterator it = itemMap.find(thisid);
if ((it != itemMap.end()) && (it->second != NULL))
return it->second;
return NULL;
}


bool addItem(item* m_item)
{
if (NULL == m_item || itemMap.find(m_item->thisid) != itemMap.end())
return false;


itemMap.insert(std::make_pair(m_item->thisid,m_item));
return true;
}
std::map<int,item*> itemMap;
};


/**
 * \brief 玩家类
 */
struct user
{
package pack;
};
static void Init_ve(vector<int> &ve)
{
for(int i = 0,j = 0; i < 3*2; ++i)
{
if(i % 2 == 0)
ve.push_back(++j);
else
ve.push_back(0);
}
}
bool exchangeGem(exchangeGem_CS &cmd,user &m_user)
{
if(cmd.st.empty())
{
sendTextToUser("条件不足");
return false;
}
item *tmp = NULL;
vector<int> ve;
Init_ve(ve);
set<int>::iterator iter = cmd.st.begin();
while(iter != cmd.st.end())
{
tmp = m_user.pack.getItemByThisID(*iter++);
if(tmp && tmp->id == smallDragonID)
{
ve[(tmp->aptitude - 1) * 2]++;
if(!m_user.pack.removeItem(tmp))
{
writeLog("扣除小火龙失败");
return false;
}
}
tmp = NULL;
}
int gem_num = 0;
for(int i = 0,j = 0; i < ve.size() && j < role_len; )
{
if(ve[i] == role[j])
{
gem_num += role[j+1] * ve[i+1];
i+=2;
}
else
j+=2;
}
if(!m_user.pack.addItem(gemID,gem_num))
{
writeLog("添加宝石失败");
return false;
}
return true;
/* //if(cmd.objThisIDA == cmd.objThisIDB)
{
// writeLog("ID冲突");
// return false;
}
item* itemA = m_user.pack.getItemByThisID(cmd.objThisIDA);
item* itemB = m_user.pack.getItemByThisID(cmd.objThisIDB);
if(!itemA || !itemB || itemA->aptitude !=1 || itemB->aptitude !=1)
{
sendTextToUser("条件不足");
return false;
}
if(m_user.pack.getSpaceNum() < 2)
{
sendTextToUser("包裹空间不足");
return false;
}
if(!m_user.pack.removeItem(itemA))
{
writeLog("删除A失败");
return false;
}
if(!m_user.pack.removeItem(itemB))
{
writeLog("删除B失败");
return false;
}
if(!m_user.pack.addItem(gemID,100))
{
writeLog("添加宝石失败");
return false;
}
return true;
*/
}


int main()
{
//括号以内代码模拟 客户端消息发送到服务器解包以后,服务器处理逻辑的流程 返回0表示这个消息的处理逻辑结束 
/* 添加道具
* forExample
* user m_user;
         * m_user.addItem(1,1);
*/


//下面代码可认为是 之前玩家添加相关道具的过程。
user m_user;
item *dragon_1 = new item();
item *dragon_2 = new item();
if (dragon_1 && dragon_2)
{
dragon_1->id = smallDragonID;
dragon_1->thisid = 100;
dragon_1->aptitude = 1;
dragon_2->id = smallDragonID;
dragon_2->thisid = 101;
dragon_2->aptitude = 1;
}
m_user.pack.addItem(dragon_1);
m_user.pack.addItem(dragon_2);
//添加流程结束


//客户端发起请求流程
exchangeGem_CS cmd;
cmd.st.insert(100);
cmd.st.insert(102);
// cmd.objThisIDA = 1000;
// cmd.objThisIDB = 1001;

//服务器处理
exchangeGem(cmd,m_user);
return 0;
}

 主程最近在培训我们,突然感觉到压力很大,我的C++技术并不好,更擅长一些C语言,公司的其他人不论是学校还是实习经历还是技术都完全虐杀我,压力好大,怕随时丢了自己的饭碗。

   所以主程在一开始培训的时候,出了很简单的题目,半天写不出来。最后他给了代码,也给了更难的问题,提升版,终于在睡觉前写好了,不知道对错,先放上来吧,等到很多年以后,如果自己有幸成为主程,回顾一下现在心惊胆战怕丢工作的自己。。。


猜你喜欢

转载自blog.csdn.net/zhanglu_1024/article/details/78976700