[JS]拼图游戏外挂开发实战

2016-12-31 写技术

    我在玩诛仙3,这个游戏本身做得很好,很精致,同时它的官网会时不进推出些活动,今天晚上就是跨年了,完美给我们的礼物就是一个拼图游戏,好像拼得越快资历越好,我这人手拙眼穷,肯定是最慢的。但我有代码呀,呵呵!

    F12下去,打开了游戏页面的前端代码,看到它把一张图放到了5X5的矩阵里,形成25个小格子,其实每个格子就是一个DIV,每个DIV用background来显示图片,但图片是同一张,也就是原图,只是做了偏移,background-position不同而已……

    这些细节我也研究了很久,甚至写出了模拟移动方格的代码,发现js要模拟鼠标的点击没问题,但要模拟移动还真没什么办法,于是干脆摆格子算了,

    于是我写出了如下代码:

function good(){
var x=0;
var y=0;
$(".play_cell").each(function(){
	if(x>=5){
		y++;
		x=0;
	}
	if(y>=5){
		console.log("Y === 5 ");
		return 0;
	}
	var xx = x*(-116);
	var yy = y*(-116);
	xx = xx+"px";
	yy = yy+"px";
	$(this).css("background-position", xx+" "+yy);
	x++;
});
x=2;
$(".play_cell").each(function(){
	if(x-->0){
		var xx= x*(-116);
		xx = xx+"px";
		var yy = "0px";
		$(this).css("background-position", xx+" "+yy );
	}else{
		return 0;
	}
});
}

 

    你看,我还特意留下最后一格不拼完呢。因为,还要手动移动格子去触发游戏的评分机制。

    可是我失败了,系统没有提示我过关了。我想如果是我做游戏,肯定会有一个数组做为背景,不会直接去识别DIV内容的。细看之下,果不其然,有这么一段:

    check: function() {
        this.e_playCount.html(++this.playCount);
        if(this.ranArr.join() == this.imgArr.join()) {
            this.success();
        }
    },

    这个就是游戏最后判断通关与否的关键了,哈哈,他直接比对两个数组是否相等,很显然,一个数组是随机生成的,一个是移动图片后产生的,我才懒得往下看呢,直接在这里插入了流氓的一句:

    this.ranArr = this.imgArr;

    再一动,果然有效,可是系统提示“请按规则进行游戏”。

    难不成还有什么机制防作弊不成?

    我看看它的结果提交过程吧:

    success: function() {
        /*alert("ok");
         this.score += this.scoreArr[this.level]
         this.e_playScore.html(this.score);*/
        // alert("ok");
        console.log(typeof(this.timer)+'======');
        clearInterval(this.timer);
        console.log(this.timer);
        // alert(this.useTime);
        var time = this.useTime;
        $.ajax({
            url: "/zhuxian/patch/patchDone",
            type: "POST",
            dataType: "json",
            data: {
                time: this.useTime
            },
            success: function (data) {
                if(data.success){
                    if(data.status!=20){
                        updateScore(data.score);
                        updateBest(data.best);
                        if(data.count==5){
                            rankList();
                        }
                        alertMsg("恭喜您","本次耗时"+formatTime(time)+", 今天已经完成"+data.count+"次拼图");
                    }else{
                        alertMsg("恭喜您","拼图完成,"+"本次耗时"+formatTime(time));
                    }

                }else{
                    alertMsg("提示",data.message);
                }
            }
        });

    看吧,写这游戏的人肯定也是匆匆完成,调试代码还留那了,重点是这个提交仅有的参数是时间呀,所以我唯一能暴露的就是时间呀,那它能判断我作弊也想必是根据时间来的,完成太快了,低于某个点就认为作弊。

    这还不容易,我把一切准备好,等会再提交不就行了么。于是我用几毫秒的时间把图拼好——其实拼不拼都不重要了,然后就等二十秒再最后操作游戏触发提交事件。

    成功了,成绩是二十秒。神一样的速度。当然这个时间还可以多实验下,不知道它的下限是多少。我懒得弄了。

标签: JS

发表评论:

Powered by anycle 湘ICP备15001973号-1