本文给两个问题提供解决方案
1,防御塔的属性相当多,什么攻击力,攻击速度,攻击范围,建造花费,等等等等......
把他们的数据放到程序里面显然是不合适的,如果把这些数据放到程序中,十分不便于修改,
如果修改,需要重新编译才能重新运行。
,2,有些人会修改游戏数据,做出所谓的破解版,让我们的努力付之东流
数据安全很重要
1)把数据放进文件里可以很好地解决这个问题,为了以后做其他大一点的游戏也能用得到,这里就直接用sqlite3数据库。
不大了解的看百度百科: 飞机票:sqlite数据库的百度百科
为了方便,我把
{
1,sqlite3数据库代码(英文注释)
2,对sqlite3数据库代码的封装(便于使用,有中文注释)
3,sqlite3数据库的中文版可视化管理工具
}
封装成了一个压缩包上传了: 飞机票:cocos2dx上sqlite3数据库代码,封装及管理工具
不要分,觉得好给个评论我会很开心的 ^_^
把游戏数据用管理工具存到数据库中,需要什么读取数据库就好,即使游戏数据发生改变也不用重新编译了。
2)①你可能已经发现了,sqlite3数据库极其精简,没有权限管理,得到了数据库文件,随便找一个管理工具就能进行更改
在这里为防止运行前游戏数据被更改,我采用了进行文件MD5校验,来检查文件是否被动过手脚
运行游戏时,计算文件的MD5,和程序内部事先准备好的MD5进行比对,如果不对,立刻退出。
代码文件: 飞机票:cocos2dx下可用的,验证文件MD5代码及使用方法
不要分,觉得好给个评论我会很开心的 ^_^
②压轴用的重头戏来了
你如果是手游爱好者的话,应该用过八门神器吧,它会在游戏运行时修改内存中的游戏数据。
我的方法是随机得到一个密匙作为数据成员,给其它数据成员设置set和get方法,set或get时,通过自定义算法对数据进行加密和解密,
保证数据成员中存储的数据是经过加密的,让看内存的人不能准确定位变量的地址,即使找到了地址,不知道算法,也不会改。
头文件代码:
#ifndef __TOWER_H__
#define __TOWER_H__
#include "cocos2d.h"
#include "DBUtil.h"
USING_NS_CC;
class Tower : public Layer
{
protected:
int speed[4];//攻速
int atk[4];//攻击力
int usekey(int valueWithoutKey);//加密数据
int unusekey(int valueWithKey);//解密数据
public:
static Tower* create(int type,Point position);//调用构造函数,调用初始化函数,设为自动释放,返回创建好的对象的指针
Tower(int type,Point position);//构造函数
//set与get方法
void setSpeed(int speed,int level);
int getSpeed(int level);
void setAtk(int atk,int level);
int getAtk(int level);
};
#endif //__TOWER_H__
cpp文件代码:
#include "Tower.h"
Tower::Tower(int type,Point position)
{
//随机得到key
srand(time(0));
key = rand()%10 + rand()%10*10 + rand()%10*100 + rand()%10*1000 +1111;
//连接数据库,得到防御塔信息
DBUtil TowerDB;
TowerDB.initDB("TowerDB");
//这是我写在DBUtil中的一个函数,会把防御塔数据从数据库中读取出来
TowerDB.getTowerDataInfo(type , this);
TowerDB.closeDB();
}
//===============================================
//===========关键数据的加密解密算法==============
//===============================================
int Tower::usekey(int valueWithoutKey)//加密数据
{
return (valueWithoutKey + key)<<4;
}
int Tower::unusekey(int valueWithKey)//解密数据
{
return (valueWithKey>>4) - key;
}
//===============================================
//===========属性的set与get方法==================
//===============================================
void Tower::setSpeed(int speed,int level)
{
this->speed[level] = usekey(speed);
}
int Tower::getSpeed(int level)
{
return unusekey(speed[level]);
}
void Tower::setAtk(int atk,int level)
{
this->atk[level] = usekey(atk);
}
int Tower::getAtk(int level)
{
return unusekey(atk[level]);
}
通过自定义加密方法,你甚至可以验证数据的合法性(如本文中,因为进行左移运算,当数据成员为奇数时即为非法数据)。
关于游戏数据安全问题,欢迎交流。