需求:
上表1:
筛选出需要附魔的 装备ID 和 装备等级
上表2:
将对应的装备ID加入到该表内,并设置对应附魔组值.
上表3:
根据组值设定对应的具体附魔ID.
步骤:
1.首先根据上表1,需要筛选(去重)出一共有多少个装备等级. (对应表1为筛选结果.)
2.结合上表1的物品ID需要生成上表2对应的组ID.组ID为上表1 ItemLevel前边加数字99
3.根据对应组ID生成具体的附魔ID范围, 附魔ID起始值 = 14002.
组ID对应附魔范围公式: ceil为向上取整
组ID具体组值范围 = 14002 ~ ceil( 组ID /2)
组ID=5 为例, 5/2为2.5, ceil(2.5)为3.
那么为5的组ID范围就是 14002, 14003, 14004这3个范围. 下表2前3行就是结果.
此时组ID对应的范围附魔值全部生成完毕.
4.根据上表1的ItemLevel对比下表1的id. 如果相等.则写入到下表3. 下表3 entry=装备ID,g1=装备等级+99后的值.
下表1 下表2 下表3
代码:
#include <iostream>
#include <vector>
#include <winsock.h> //注意顺序,要放在mysql.h前
#include <mysql.h>//控制台项目中要在mysql.h之前include <winsock.h>
#include <map>
#include <vector>
#include <fstream>
#include <algorithm>
#include <string>
#include<math.h>
using namespace std;
const int nMin = 14002; //开始数值
/* 程序概要
* if(ItemSetVec.ItemLevel == NumSetVec.id)
* {
* StoreVec.ItemEntry = ItemSetVec.itemEntry;
* StoreVec.Group = NumSetVec.ids;
* }
* 最后在把StoreVec字段写入数据库表对应字段内即可.
*/
//存储 <装备ID>:<装备等级>
struct ItemSet
{
int itemEntry; //装备ID
int ItemLevel; //装等ID
};
typedef vector<ItemSet> ItemSetVec;
//存储 手动筛选出来装备等级
//因为装等数值范围跳跃大, 不连续.所以 在原始组值前增加 : 99, 比如装备等级5即变成995, 装备等级10, 即变成9910
//装备等级 == 装备附魔组ID
struct NumSet
{
int id; //原始装备等级
int ids; //开头加 99的装备等级
};
typedef vector<NumSet> NumSetVec;
//存储 装备ENTRY 和 组ID
struct StroeSet
{
int ItemEntry, Group;
};
typedef vector<StroeSet> StoreVec;
void test1()
{
ItemSetVec IVec;
NumSetVec NVec;
StoreVec SVec;
MYSQL* pConn;
pConn = mysql_init(NULL);
//第2、3、4、5参数的意思分别是:服务器地址、用户名、密码、数据库名,第6个为mysql端口号(0为默认值3306)
if (!mysql_real_connect(pConn, "127.0.0.1", "root", "root", "_t", 3306, NULL, 0))
{
printf("无法连接数据库:%s", mysql_error(pConn));
return;
}
mysql_query(pConn, "set names gbk");
if (mysql_query(pConn, "select id, ids from _id "))
{
printf("查询失败:%s", mysql_error(pConn));
return;
}
MYSQL_RES* result = mysql_store_result(pConn);
MYSQL_ROW row;
/*根据规则写入数据库组值:附魔ID*/
/*
装备举例 :
力量斧头 装备等级为5级, 力量斧头可以随机到 附魔组ID : 995 内的随机一条FM.
光之护盾 装备等级为10级, 光之护盾可以随机到 附魔组ID : 9910 内的随机一条FM.
附魔组ID的结构举例 :
<附魔组ID : 具体FM编号> 其中两个字段都为主键.
可以形成以下结构:
装备ID, 附魔ID
995, 2
995, 3
9910, 2
9910, 3
*/
printf("---------------组值:附魔ID 数据表开始写入---------------\n");
while (row = mysql_fetch_row(result))
{
double dRow = atoi(row[0]); //char 转 数字
double dNum = dRow / 2; //取double 值
int nNum = ceil(dNum); //向上取整
for (size_t i = 0; i < nNum; i++)
{
string sql = "INSERT INTO _tab(id, value) VALUES('" + to_string(dRow) + "', '" + to_string(nMin + i) + "')";
mysql_query(pConn, sql.c_str());
}
}
printf("组值:附魔ID 数据表写入完毕!.....\n");
printf("组值:附魔ID 数据表写入完毕!.....\n");
printf("组值:附魔ID 数据表写入完毕!.....\n");
/*---------------------------------------------------------------------------------------*/
if (mysql_query(pConn, "select id, ids from _id "))
{
printf("查询失败:%s", mysql_error(pConn));
return;
}
MYSQL_RES* result3 = mysql_store_result(pConn);
MYSQL_ROW row3;
while (row3 = mysql_fetch_row(result3))
{
NumSet nst;
nst.id = atoi(row3[0]);
nst.ids = atoi(row3[1]);
NVec.push_back(nst);
}
printf("NumSet存储完毕.....存储[%u]条\n", (int)NVec.size());
printf("NumSet存储完毕.....存储[%u]条\n", (int)NVec.size());
printf("NumSet存储完毕.....存储[%u]条\n", (int)NVec.size());
/*---------------------------------------------------------------------------------------*/
if (mysql_query(pConn, "select entry,ItemLevel from item_template "))
{
printf("查询失败:%s", mysql_error(pConn));
return;
}
MYSQL_RES* result2 = mysql_store_result(pConn);
MYSQL_ROW row2;
while (row2 = mysql_fetch_row(result2))
{
ItemSet ist;
ist.itemEntry = atoi(row2[0]);
ist.ItemLevel = atoi(row2[1]);
IVec.push_back(ist);
}
printf("ItemSet存储完毕.....存储[%u]条\n", (int)IVec.size());
printf("ItemSet存储完毕.....存储[%u]条\n", (int)IVec.size());
printf("ItemSet存储完毕.....存储[%u]条\n", (int)IVec.size());
/*---------------------------------------------------------------------------------------*/
int nCount = 1;
for (auto i = NVec.begin(); i != NVec.end(); i++) //遍历NumSetV
{
cout << "第:" << nCount << "次遍历,装备剩余条数: " << IVec.size() << endl;
for (auto k = IVec.begin(); k != IVec.end(); k++) //根据NumSetV.装等 遍历ItemSetV
{
if (i->id == k->ItemLevel)
{
StroeSet sst;
sst.ItemEntry = k->itemEntry;
sst.Group = i->ids;
SVec.push_back(sst);
IVec.erase(k);
k = IVec.begin(); //erase函数的返回值是这么介绍的:一个迭代器,指定在任何删除的元素之后剩余的第一个元素,如果不存在这样的元素,则指定指向向量结尾的指针,所以指向了起始位置
string sql = "INSERT INTO _ss(entry, g1) VALUES('" + to_string(sst.ItemEntry) + "', '" + to_string(sst.Group) + "')";
mysql_query(pConn, sql.c_str());
}
}
nCount++;
}
mysql_free_result(result);
mysql_close(pConn);
}
int main()
{
test1();
system("pause");
return 0;
}
运行结果:
Mysql+VS 项目设置:
1.
2.
3.
4.
5.