单机游戏计时器防作弊解决方案

一、作弊方法描述
    一些游戏会在某些情况下让玩家等待一段时间,例如candy crush中游戏失败会消耗一点体力,体力不满时,会每隔30分钟涨一点。体力耗尽时就无法再进行游戏,此时玩家可以修改系统时间,调到未来的时间,再回到游戏中,体力就会涨满了。游戏的这种控制就失效了。

原理:当消耗一点体力时,游戏会记录一个时刻t1,等到当前时刻为t1+30分钟时,就会加上一点体力。如果把系统时间调后半个小时,那就不需要等待直接回复体力了。

二、解决思路
1、通过开机运行时间计算开机时刻
    ios和android都提供了一个方法:获取自开机到现在运行时间。就是利用这个方法来做时间校验。通过获取当前时间(有可能被修改)和开机运行时间,可以计算出开机时刻(前者减后者),如果一直保持开机状态,那么这个开机时刻应该是不变的。如果某次开机时刻算计算出来与上一次不同,那么就可以判断计时器出错。

2、记录开机时刻
    第一次运行游戏时会把开机时刻记录下来,用于之后计算的对比。

3、联网时间修正
    当用户时间异常,比如往后调了1个小时,计算出开机时刻与上次不同,此时需要联网修正时间。从网络上取得正确的当前时间,对比用户时间(有可能被修改),计算出时间差1个小时,记录这个时间差。之后每次获取用户当前时间的时候都要减去这个时间差,结果可以能当成正确的系统时间,再根据1的方法算出开机时刻就比较准确了。时间修正后会重设上次开机时刻做为新的参考值。

三、示例
    进入游戏时,取得当前系统时间8点,获得开机运行3个小时,计算出开机时刻是5点。
    游戏中在9点钟触发了一个30分钟的计时器,应该在9点半的时候完成。此时用户切到设置中修改了系统时间到10点。
    再回到游戏中,会进行计时器检查,系统时间是10点,开机运行4小时,计算出开机时刻是6点,与之前记录的5点不一样,判断出计时器出错。如果用户不进行联网校正,那就无法继续操作。
    用户联网后,取出网络真实时间9点,计算出用户时间差1小时(10-9),重置上次开机时刻,还是5点钟没变(如果是关机再开机这个值会变)。
    校正完后让计时器继续,取用户时间会减去时间差,即可以得到真实时间,那么计时器就可以正常运行了。
    如果用户保持联网状态,那么计时器出错就会瞬间被校正。

找了一圈没发现能得到开机启动时间资料,于是乎突发奇想,得到了解决方案。

我的思路是:程序里注册个广播接收器,接收开机启动的广播,当程序接到该广播后,写入文件SharedPreferences,当我们程序需要用到开机时间时,再从SharedPreferences中读取信息。

废话不多说,下面上源码。

AndroidManifest.xml

Receiver文件,记录开机时间。

public class BootUpReceiver extends BroadcastReceiver {
	private SharedPreferences sharedPreferences;// 配置文件
	private Editor editor;// 更改配置文件的类实例

	@Override
	public void onReceive(Context context, Intent intent) {
		if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {

			sharedPreferences = context.getSharedPreferences("这是存储文件的名字",
					Context.MODE_PRIVATE);
			editor = sharedPreferences.edit();

			editor.putLong("存储时间的key", new Date().getTime());

			editor.commit();// 别忘了提交哦
		}

	}
}

读取开机时间

/**
 * Description : 获取开机的时间
 *
 * @return String 秒数
 *
 */
public static long getUpTime(Activity context) {
    SharedPreferences sharedPreferences=context.getSharedPreferences("这是存储文件的名字", Context.MODE_PRIVATE);
    long seconds= sharedPreferences.getLong("存储时间的key", new Date().getTime());
    return seconds;
}
时间: 2024-10-29 19:08:48

单机游戏计时器防作弊解决方案的相关文章

防作弊

弱联网手游如何防作弊? http://www.docin.com/p-959178605.html http://www.gameres.com/msg_300842.html 初识网络游戏防作弊 http://blog.csdn.net/jellyyin/article/details/6194272 单机游戏计时器防作弊解决方案 http://www.cocoachina.com/bbs/read.php?tid=232414

微信qp游戏域名防封最新解决方案

很多人问,我的微信qp游戏为什么会被封?原因就是腾讯检测到你的网页内容存在诱导.诈骗等行为,还有一个重要因素就是被人举报,这也许是你的竞争对手故意黑你,当一人或者几个人举报并上传图片的时候腾讯会限制你游戏的某些功能,但是当有很多人举报的时候,腾讯就会把你微信qp游戏域名封掉,这个问题让开发商和游戏代理商都非常头,那我们要怎做到有效防封呢?猴子数据给关于微信qp游戏域名防封最新解决方案. 现在市场上有两种防封方案,第一种就是检测微信qp游戏域名并将域名切换.首先你要有一个微信域名检测接口,配置好你

【转】两步实现超实用的XML存档 易使用,跨平台,防作弊(内容加密 + 防拷贝)

转载自风宇冲Unity3D教程学院 两步实现超实用的XML存档 本套存档的优点:易使用,跨平台,防作弊(内容加密 + 防拷贝) 脚本下载地址 使用方法非常简单:把GameDataManager和XmlSaver两个脚本添加至工程后(1)新建一个GameObject,起名GameDataManager并将GameDataManager脚本拖到上面.(2)在GameDataManager里的GameData类中添加需要储存的数据OK,跨平台防破解防拷贝的存档就搞定了!之后每次存档调用GameData

只需要一点点C++基础,新手也可以制作单机游戏内存修改器

声明:本文只是为了初学C++的,能够做出一些实用的东西,跳出管理系统的束缚,提升学习的兴趣,在这里选取了单机游戏,请不要尝试在线游戏,违发而已未必可行.序:首先我们需要一个Qt+VS环境Qt从http://download.qt.io/archive/中下载,第一个和第三个,在里面选择对应版本.然后就是配环境了,这里提供2013+Qt5.5.1的环境配置,如果环境不同,请自行百度.这点解决问题能力都没有,就别学C++了...我的环境是2013+Qt5.5.1,不同版本可能略有差异,不过大同小异.

Linux/Unix平台源代码及技术文档防泄密解决方案

一.           需求背景 1.应用软件研发行业范围很广 应用软件是为满足用户不同领域.不同问题的应用需求而提供的软件,主要包括:办公室类软件,基于网络B/S,C/S软件,多媒体软件,计算计辅助设计,计算机游戏,分析类软件,统计软件,协作软件,商务软件,会计软件,ERP,CRM,PDM等.这些软件系统的研发源代码,都是企业的生命支柱. 2. 应用软件研发行业保密现状 目前大环境下,研发人员流动性很强,这就要求企业建立一套机制,对企业自己的知识库和项目源代码,技术文档等进行安全控制,不但要

猴子数据2019最新小说防封解决方案

之前我们分享过猴子数据开发的几种防封方案.由于产品的不同和运营方式的差异化,仅某一种防封方案并不能满足所有的客户需求,而且随时微信规则的不停变化,方案也是需要不断地升级和完善,这样才能保证防封方案的有效性和持久性.今天和大家分享的是微信小说防封的解决方案,怎么才能让小说平台的域名在微信中存活的更久些呢?在我们分享小说防封解决方案之前我们先了解下小说推广域名为什么容易被微信拦截,一般原因总结为两点:第一点是微信机器人会自动检测小说里面的内容,一般有颜色或者有敏感词汇的小说肯定是会被屏蔽的(现在的小

手游休闲单机游戏挣钱之道

手游休闲单机游戏,用户主要来源于三大运营商,付费方式主要为短信付费,付费率和付费值偏低,生命周期短,基本沦落到骗钱为生了,遇到的骗术: 1免费英雄,免费道具,后面好的要花钱,但是显示不明显,玩家误以为也是免费的,... 2退出时,提示消费,玩家习惯以为是确认取消,误操作,结果就扣钱了 降低付费玩家投诉率的办法(超过万分之七,会有下架风险): 玩家花1分钱可以得1个特别好的装备或英雄, 手游休闲单机游戏挣钱之道,布布扣,bubuko.com

一步一部学习Unity3d学习笔记系1.2 单机游戏和网游的数据验证概念

这一次的笔记的主要内容是单机和网游的数据存储,数据验证方式,在游戏的时候除了控制角色的行动,还涉及到用户角色的升级,经验,金钱赚取,道具购买,技能升级 等等一些数据的交易, 那么单机游戏和网游的区别如下如图: 单机购买流程: 单机游戏的数据存储都是在本地客户端存储的,验证简单,执行简单,在玩单机游戏的时候我想很多人都知道外挂是怎么回事吧没救是通过修改内存,或者是本地数据无敌,随时原地满血复活状态. 网游相对来说数据安全性就比较高了,前几年的网游还有外挂,比如说CF 开启外挂来直接枪枪爆头,隔墙爆

单机游戏如何防止类似八门神器这类的内存修改器的篡改办法

当下由于八门神器这类的存在,好多的单机游戏开发程序员都听蛋疼,今天看到伟哥实现了一个办法.... 大体的思路是: 1.实现一个类似与由一个值可以生成唯一的另一个值的函数(类似于C++ 的 std::hash<std::string>)hashFunc 2.本地保存两个相对的成员变量(this->coin, this->hash_coin) 3.每次对 coin赋值总会一起用 hashFunc对 hash_coin来赋值 4.当读取的时候判断 hash_coin 和 hashFunc