⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 client.cpp

📁 改工程是一个基于select模型实现的MUD游戏
💻 CPP
📖 第 1 页 / 共 5 页
字号:

}





//获取str名称的填充资源mobj相关信息
bool GetObjectInfo(SOCKET sock,string& str,Myobject& mobj)
{
	
	SCommand scom;
	scom.CommandID=CMD_GETOBJECTINFO;
	scom.DataSize=(int)str.length();
	
	int nRet=send(sock,(char*)&scom,sizeof(scom),0);
	if(nRet==SOCKET_ERROR)
	{
		cout<<"发送获取资源命令出错,请检查网络!"<<endl;
		return false;
	}


	nRet=send(sock,str.c_str(),(int)str.length(),0);
	if(nRet==SOCKET_ERROR)
	{
		cout<<"发送获取资源数据出错,请检查网络!"<<endl;
		return false;
	}


	/*int datasize=0;
	nRet=recv(sock,(char*)&datasize,sizeof(int),0);
	if(nRet==SOCKET_ERROR)
	{
		cout<<"接收资源数据出错,请检查网络!"<<endl;
		return false;
	}*/

	nRet=recv(sock,(char*)&mobj,sizeof(mobj),0);
	if(nRet==SOCKET_ERROR)
	{
		cout<<"接收物品资源数据出错,请检查网络!"<<endl;
		return false;
	}


	return true;

}

//彩色文字输出函数
void ColorTextOut(const char * str,bool bUnderLine)
{
	HANDLE hWnd=GetStdHandle(STD_OUTPUT_HANDLE);
	if(bUnderLine)
		SetConsoleTextAttribute(hWnd,FOREGROUND_GREEN|FOREGROUND_BLUE|COMMON_LVB_UNDERSCORE);
	else 
		SetConsoleTextAttribute(hWnd,FOREGROUND_GREEN|FOREGROUND_BLUE);
	cout<<str;
	SetConsoleTextAttribute(hWnd,FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED);
}


//游戏退出时的数据保存
void SaveGameData(SOCKET sock)
{

}


//更新各种数据!
void UpdateData(SOCKET sock)
{
	//更新在线数据
	GetOnlineRoleList(sock);
	GetGameMessage(sock);
	

}


//特色功能之一
//显示背包物品,并使用物品,(包括辅助药品,装备的支持)
//处理背包物品的存储管理,(对多种多数量的支持)
void UseThinginPackage(SOCKET sock)
{

	cout<<"*******************我的百宝箱*********************"<<endl;
	int index=0;
	for(int i=0;i<OBJECTNUM;i++)
	{
		if(g_player.ownObject[i].ownObjectName!="null")
		{
			cout<<"["<<(index++)<<"]"<<g_player.ownObject[i].ownObjectName<<"   数量:"<<g_player.ownObject[i].num<<endl;
		}
		else
		{ 
			cout<<"["<<(index++)<<"]"<<"  空  "<<endl;
		}
	}
	if(index==0)
	{
		cout<<"你的背包里空空如也!"<<endl;
		return;
	}

	//使用物品菜单
	while(true)
	{
		char in;//因为物品刚好为10个,把数字键都占用了,所有提出字符转换的想法
		int choice=-1;
		updateNewDS useupdata;//使用数据
		memset(&useupdata,0,sizeof(useupdata));
		updateNewDS effupdata;//效果数据
		memset(&effupdata,0,sizeof(effupdata));
		updateNewDS backupdata;//备用数据
		memset(&backupdata,0,sizeof(backupdata));
		cout<<"请输入你要使用物品的序号,(序号外任意键退出)"<<endl;
		cin>>in;
		if(in>'9'||in<'0')
		{
			break;
		}
	
		choice=in-'0';//还原成数字

		
		if(g_player.ownObject[choice].ownObjectName=="null")
		{
			cout<<"改格子没有存放任何物品!"<<endl;
			return;
		}


		//使用数据指令
		SCommand scom;
		memset(&scom,0,sizeof(scom));

		Myobject mobj;
		memset(&mobj,0,sizeof(mobj));


		//标识前后两次操作!(可能有第三项操作)
		bool bfirstsuccess=false;
		bool bsecondsuccess=false;
		bool bthirdsuccess=false;
		bool bbackused=false;

		//辅助药品需要
		if(GetObjectInfo(sock,g_player.ownObject[choice].ownObjectName,mobj))
		{
			if(g_player.level<mobj.needLevel)
			{
				ColorTextOut("[系统]",false);
				cout<<"你的等级不够!"<<endl;
				continue;
			}
			else
			{
				switch(mobj.moType)
				{
				case OT_HP:
					g_player.ownObject[choice].num-=1;

					//当某物品用完了
					if(g_player.ownObject[choice].num==0)
					{
						//使用数据
						strcpy(useupdata.item,"null");
						useupdata.opType=DBOP_TYPE_ALL;
						useupdata.num=0;
						sprintf(useupdata.op,"objectname%d,objcetnum%d",choice+1,choice+1);

						//更新本地状态
						g_player.ownObject[choice].ownObjectName="null";
						g_player.ownObject[choice].num=0;
				
					}
					else//还有某物品剩余
					{					
						useupdata.num=g_player.ownObject[choice].num;
						sprintf(useupdata.op,"objectnum%d",choice+1);
						strcpy(useupdata.item,"null");
						useupdata.opType=DBOP_TYPE_NUM;
					}

					//效果数据,公共部分
					g_player.hp+=mobj.value;
					if(g_player.hp>hpTop)//大于hp上限
						g_player.hp=hpTop;
					effupdata.num=g_player.hp;
					strcpy(effupdata.op,"hp");
					strcpy(effupdata.item,"null");
					effupdata.opType=DBOP_TYPE_NUM;

					break;
				case OT_MP:

					g_player.ownObject[choice].num-=1;

					//当某物品用完了
					if(g_player.ownObject[choice].num==0)
					{
						//使用数据
						strcpy(useupdata.item,"null");
						useupdata.opType=DBOP_TYPE_ALL;
						useupdata.num=0;
						sprintf(useupdata.op,"objectname%d,objcetnum%d",choice+1,choice+1);

						//更新本地状态
						g_player.ownObject[choice].ownObjectName="null";
						g_player.ownObject[choice].num=0;
				
					}
					else//还有某物品剩余
					{					
						useupdata.num=g_player.ownObject[choice].num;
						sprintf(useupdata.op,"objectnum%d",choice+1);
						strcpy(useupdata.item,"null");
						useupdata.opType=DBOP_TYPE_NUM;
					}

					//效果数据,公共部分
					g_player.mp+=mobj.value;
					if(g_player.hp>mpTop)//大于hp上限
						g_player.mp=mpTop;
					effupdata.num=g_player.mp;
					strcpy(effupdata.op,"mp");
					strcpy(effupdata.item,"null");
					effupdata.opType=DBOP_TYPE_NUM;


					break;


				//装备的更新
				//从背包里减去该装备,在装备栏增加该装备,原已有装备,交换之。当换上的装备有多余时,需一格空间存储换下来的装备,如无,则换装失败
				//
				//装备类物品使用
				
				case OT_ARMOUR:
					if(g_player.ownEquip[0]=="null")//原来装备为空
					{
						if(g_player.ownObject[choice].num>1)//背包里有多件本装备
						{
							//本地数据修改
							g_player.ownObject[choice].num-=1;

							//数据报封装
							useupdata.num=g_player.ownObject[choice].num;
							sprintf(useupdata.op,"objectnum%d",choice+1);
							strcpy(useupdata.item,"null");
							useupdata.opType=DBOP_TYPE_NUM;

							//身上装备数据修改
							g_player.ownEquip[0]=g_player.ownObject[choice].ownObjectName;

							//身上装备数据包封装
							sprintf(effupdata.op,"equipname%d",1);
							strcpy(effupdata.item,g_player.ownEquip[0].c_str());
							effupdata.opType=DBOP_TYPE_STRING;
							effupdata.num=0;

						}
						else//仅此一件
						{

							//身上装备数据修改
							g_player.ownEquip[0]=g_player.ownObject[choice].ownObjectName;

							//身上装备数据包封装
							sprintf(effupdata.op,"equipname%d",1);
							strcpy(effupdata.item,g_player.ownEquip[0].c_str());
							effupdata.opType=DBOP_TYPE_STRING;
							effupdata.num=0;


							//换下装备数据修改
							g_player.ownObject[choice].ownObjectName="null";
							g_player.ownObject[choice].num-=1;

							//数据包封装
							useupdata.num=g_player.ownObject[choice].num;
							strcpy(useupdata.item,g_player.ownObject[choice].ownObjectName.c_str());
							sprintf(useupdata.op,"objectname%d objectnum&d",choice+1,choice+1);
							useupdata.opType=DBOP_TYPE_ALL;

							

						}
						
					}
					else//原来已有装备,换装
					{
						//转换中间量
						string temp;
						temp=g_player.ownEquip[0];
						bool bGeted=false;//找到标识
						bool bInsert=false;
						
						if(g_player.ownObject[choice].num>1)//背包里有多于1件的该装备
						{
							for(int i=0;i<OBJECTNUM;i++)
							{
								if(g_player.ownObject[i].ownObjectName!="null")
								{
									if(g_player.ownObject[i].ownObjectName==temp)//背包中有本装备,
									{
										//换下的装备数据更改
										g_player.ownObject[i].num++;

										//换下装备数据包封装
										sprintf(useupdata.op,"objectnum%d",i+1);
										useupdata.num=g_player.ownObject[i].num;
										strcpy(useupdata.item,"null");
										useupdata.opType=DBOP_TYPE_NUM;


										//身上装备修改
										g_player.ownEquip[0]=g_player.ownObject[choice].ownObjectName;


										//身上装备数据包封装
										sprintf(effupdata.op,"equipname%d",1);
										effupdata.opType=DBOP_TYPE_STRING;
										strcpy(effupdata.item,g_player.ownEquip[0].c_str());
										effupdata.num=0;


										//换上的装备修改
										g_player.ownObject[choice].num--;

										//换上装备的数据封装
										sprintf(backupdata.op,"objectnum%d",choice+1);
										backupdata.num=g_player.ownObject[choice].num;
										strcpy(backupdata.item,"null");
										backupdata.opType=DBOP_TYPE_NUM;


										bGeted=true;
									}
								}
								else continue;

							}

							if(!bGeted)//没找到,找个空位子保存
							{
								for(int i=0;i<OBJECTNUM;i++)
								{
									if(g_player.ownObject[i].ownObjectName=="null")
									{
										//找到空位,保存
										g_player.ownObject[i].ownObjectName=temp;
										g_player.ownObject[i].num=1;

										//换下数据包封装
										sprintf(useupdata.op,"objectname%d objectnum%d",i+1,i+1);
										strcpy(useupdata.item,temp.c_str());
										useupdata.opType=DBOP_TYPE_ALL;
										useupdata.num=1;

										//身上装备修改
										g_player.ownEquip[0]=g_player.ownObject[choice].ownObjectName;

										//身上装备数据封装
										sprintf(effupdata.op,"equipname%d",1);
										strcpy(effupdata.item,g_player.ownEquip[0].c_str());
										effupdata.opType=DBOP_TYPE_STRING;
										effupdata.num=0;


										//背包装备修改
										g_player.ownObject[choice].num--;

										//背包装备数据封装
										sprintf(backupdata.op,"objectnum%d",choice+1);
										backupdata.num=g_player.ownObject[choice].num;
										strcpy(backupdata.item,"null");
										backupdata.opType=DBOP_TYPE_NUM;

										bInsert=true;

										break;//保存后退出,遍历
				
									}
									
								}

								if(!bInsert)//没找到,也没有位子
								{
									cout<<"你的东西太多了,装不下了!"<<endl;
									return;
								}


							}
						}
						else//背包里只有一件本装备
						{

							bool bGeted=false;//判断换下装备是否有多件

							//身上装备修改
							g_player.ownEquip[0]=g_player.ownObject[choice].ownObjectName;

			
							//封装数据包
							sprintf(effupdata.op,"equipname%d",1);//数据库从1开始
							effupdata.opType=DBOP_TYPE_STRING;
							strcpy(effupdata.item,g_player.ownObject[choice].ownObjectName.c_str());
							effupdata.num=0;



							//换下装备在背包里有没有多的
							int i=0;
							for(;i<OBJECTNUM;i++)
							{
								if(g_player.ownObject[i].ownObjectName==temp)
								{
									bGeted=true;
									break;
								}
							}

							if(bGeted)//背包里有同样换下装备
							{
								//背包装备数据修改
								g_player.ownObject[i].num++;

								//背包数据封装
								sprintf(useupdata.op,"objectnum%d",i+1);
								useupdata.num=g_player.ownObject[i].num;
								useupdata.opType=DBOP_TYPE_NUM;
								strcpy(useupdata.item,"null");


								//换上装备本地数据处理
								g_player.ownObject[choice].num--;
								g_player.ownObject[choice].ownObjectName="null";

								//换上装备数据包封装
								sprintf(backupdata.op,"objectname%d objectnum%d",choice+1,choice+1);
								strcpy(backupdata.item,"null");
								backupdata.num=g_player.ownObject[choice].num;
								backupdata.opType=DBOP_TYPE_ALL;

							}
							else//没有找到,互换
							{
								//背包数据修改
								g_player.ownObject[choice].ownObjectName=temp;

								//封装数据包
								strcpy(useupdata.item,temp.c_str());
								sprintf(useupdata.op,"objectname%d objectnum%d",choice+1,choice+1);
								useupdata.num=1;
								useupdata.opType=DBOP_TYPE_ALL;
							}
						}
						
					}
					break;
				case OT_ARM:
					if(g_player.ownEquip[1]=="null")//原来装备为空
					{
						
						//g_player.ownObject[choice].ownObjectName="null";
						if(g_player.ownObject[choice].num>1)//背包里有多件本装备
						{
							//换上装备数据修改
							g_player.ownObject[choice].num-=1;

							//换上装备数据报封装
							useupdata.num=g_player.ownObject[choice].num;
							sprintf(useupdata.op,"objectnum%d",choice+1);
							strcpy(useupdata.item,"null");
							useupdata.opType=DBOP_TYPE_NUM;


							//身上装备数据修改
							g_player.ownEquip[1]=g_player.ownObject[choice].ownObjectName;

							//身上装备数据修改
							sprintf(effupdata.op,"equipname%d",2);
							strcpy(effupdata.item,g_player.ownEquip[1].c_str());
							effupdata.opType=DBOP_TYPE_STRING;
							effupdata.num=0;



						}
						else//仅此一件
						{
							//身上装备数据修改
							g_player.ownEquip[1]=g_player.ownObject[choice].ownObjectName;

							//身上装备数据修改
							sprintf(effupdata.op,"equipname%d",2);
							strcpy(effupdata.item,g_player.ownEquip[1].c_str());
							effupdata.opType=DBOP_TYPE_STRING;
							effupdata.num=0;



							//换上装备数据修改
							g_player.ownObject[choice].ownObjectName="null";
							g_player.ownObject[choice].num-=1;

							//换上装备数据包封装
							useupdata.num=g_player.ownObject[choice].num;
							strcpy(useupdata.item,g_player.ownObject[choice].ownObjectName.c_str());
							sprintf(useupdata.op,"objectname%d objectnum&d",choice+1,choice+1);
							useupdata.opType=DBOP_TYPE_ALL;


							

						}
						
					}
					else//原来已有装备,换装
					{
						//转换中间量
						string temp;
						temp=g_player.ownEquip[1];
						bool bGeted=false;//找到标识
						bool bInsert=false;
						
						if(g_player.ownObject[choice].num>1)//背包里有多于1件的该装备
						{
							for(int i=0;i<OBJECTNUM;i++)
							{
								if(g_player.ownObject[i].ownObjectName!="null")
								{
									if(g_player.ownObject[i].ownObjectName==temp)//背包中有本装备,
									{
										//换下的装备数据更改
										g_player.ownObject[i].num++;

										//换下装备数据包封装
										sprintf(useupdata.op,"objectnum%d",i+1);
										useupdata.num=g_player.ownObject[i].num;
										strcpy(useupdata.item,"null");
										useupdata.opType=DBOP_TYPE_NUM;


										//身上装备修改
										g_player.ownEquip[1]=g_player.ownObject[choice].ownObjectName;


										//身上装

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -