背景是某天突然收到朋友的信息,说最近迷上了某款博彩游戏,类似于大街小巷的水果机,说我是IT人士,赶紧帮忙写个外挂大家赚点钱。
一开始我嗤之以鼻,我认为这种看脸的概率问题没必要浪费时间,但朋友说和一般的水果机不同,死缠烂打非让我研究下,于是只能勉强答应了。
根据链接下载了游戏,是客户端游戏,虽然也是水果机,但的确有点不同,小店里的水果机是1对1的关系,而这个是多对1,一个房间内有N个玩家同时玩,下面是这个水果机的大概玩法:
其中8个选项就是我们下注的8个项,
总额:表示该游戏房间内例如有100个玩家,这100个玩家所有押注选项1的总额是多少,
倍率:例如我压了100分选项3,那么开奖开的是选项3,我就得到8000分。
总所周知庄家(游戏公司)肯定是稳赚不亏的,所以我们只能从别的玩家手中赚钱,下面开始截取封包并记录数据,冒泡递减排序:
选项后面括号内的数字是倍率,括号后面带小数的数字是该选项押注总额,单位是万。
经过几天24小时不间断的抓取,我们有了一定数量的样本, 写个简单的统计算法开始分析:
果然不出所料,庄家为了保障利益,尽量会选择总额低的开,实际上其他的可以不用看,就看乘以倍率之后的名次关于开奖的概率分布就行了,
于是我们再自动控制键盘鼠标,同时抓数据,因为下注总额是实时的,在开奖前一秒按照我们统计的概率去下注就行了,
假如这次倍率最低为4倍 ,那么我们可以押概率最高的4个,中奖率高达73%,
如果最低为6倍,那么我们可以押概率最高的6个,中奖率高达90%!而且即使开奖的是最低倍,我们也不会亏。
于是我就开着程序一直挂着,不断的中奖,分数也越来越高,抱着明天坐等收钱的心态就去睡觉了,挂一夜看看到底能赚多少。
。。。然而还是太天真了,第二天起来一看,分数原地踏步,立马看了下日志,原来如此,先让你赢点,然后就会输,输多了再让你赢,幅度控制在20%左右,也就是最多赢120%,就会让你输。
按照统计的客观开奖概率,为什么会出现这种情况呢,很不科学,我开始重新审视算法,也在思考是不是忽略了什么,直到无意中看到了日志中封包数据。
重点就是游戏房间内好像有几百人,好像很多人玩很多人赢钱的样子,说话的就那么三五个人,其他人不管输赢从不说话?一直24小时全部在线?不管任何时间段押注全是秒押?其实全是机器人!
也就是系统生成的玩家,他们的存在一方面是充门面吸引玩家,最重要的目的是帮助系统下注,混淆押注总额,所以截取封包数据保存的样本全是假的!
你根本无法获取真实玩家的押注总额,那么服务端就可以根据真实的下注情况来选择让少部分人赢,大部分人输,甚至可以根据不同的玩家发送不同的开奖结果。
核心思路应该是
int UserScore=User.Score;
……
if(UserScore*1.2>User.Score)
{
必输!
}
老铁,悬崖勒马,回头是岸。