塔防游戏(二) 埋雷(防止游戏数据被更改)

本文给两个问题提供解决方案

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]);
}


通过自定义加密方法,你甚至可以验证数据的合法性(如本文中,因为进行左移运算,当数据成员为奇数时即为非法数据)。

 

关于游戏数据安全问题,欢迎交流。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值