智游城

标题: 作为程序员你会怎么设计扑克服务器端程序? [打印本页]

作者: omylove    时间: 2011-2-13 03:15
标题: 作为程序员你会怎么设计扑克服务器端程序?
看到关于扑克室的讨论。我也来说说服务器处理的东西。虽然没多大意义。。

首先我们假设服务器端程序是公平公正的。

洗牌过程
   策略一: 跟现场一样先定好所有牌的顺序,随机生成52张牌的全部顺序。比如数组C[0]..C[51],然后依次发给每个玩家。
   策略二: 不洗牌,比如把牌按顺序放在一个数组C[0]..C[51],然后要给某个玩家发牌时生成随机数(0..51)并且判断这张牌没发出去的话,发给此用户。
   似乎没有三了。

同理的公共牌根据洗牌策略1或者2发牌。

那么我们要讨论的问题来了。其实无论哪种策略,从程序的角度来讲,洗牌发牌过程一定需要使用到随机数生成,任意时间点产生的随机数都是不一样的(当然我们的范围只有52个),那么是不是可以认为每一次执行一个操作所使用的时间都会影响到下一张牌(策略二)或者下一手牌(策略一)的出现。

假设以上内容都是成立的,那么有意义么?似乎是没有意义的,因为我们无法得知哪个时间点产生的随机数对我们是有利的,哪个是有害的。而且即使万一你知道了那么由于网络延迟、主机负载等原因你也无法一点能点到那个时间点。


那么我到底想说什么呢?

1.我知道这里也挺多搞计算机的高手,如果是你设计一个network的服务器端你会如何设计呢?

2.因果报应啊。那么你所有遇到的BB都和你自己有关的。因为你上一手牌或者上一张牌的某个动作(call,r,f,b)所使用的时间导致了,当前这张牌的出现。那么是否可以在你特别倒霉的时候多等上几毫秒再行动呢?或者会影响下一手你不是那么倒霉呢?哈哈。说笑的。
作者: Nolimit1980    时间: 2011-2-13 06:46
两种方案的结果是一样的。第一种方案有个缺点,一旦服务器被 hack 或者有后门,所有的一切呈现在黑客面前(当然找到需要的数据也很难),对手的牌、接下来要出的牌等等,比如你手里有一中对,牌面有顺和花的听牌,你也知道对手的牌(monster draw + 两张高牌),也知道下两张是什么牌,你知道对手的听牌不会来,所以你就能在翻牌跟对方的全下(semi-bluff)。还有什么事情比打牌赚钱更容易的呢?

第二种方案让你看不到后两张牌是什么,所以你只能严格按照赢率来打牌,也能抓对手的诈唬或者弃掉自己的强牌。优势比上一种小了无数倍,但能看到对手的牌已经让你占了巨大的优势。

按理说应该用方案一的,但实际情况很难说,如果考虑最坏的情况,应该采用方案二,即便是服务器自己也不知道下一张牌是什么,最小程度地减少作弊的危害。
作者: WaitingAlone    时间: 2011-2-13 11:32
BB牌出现的一刻软件明显感觉不流畅,就是在计算
作者: 52magic    时间: 2011-2-13 12:54
感觉扑克室用的是第二种随机方案吧
作者: mfdzkw    时间: 2011-2-14 16:59
最近我也在想程序的问题,不过我想的是客户端的程序。
比如:FTP的客户端,它最简单的加注有加一个大盲、一个池、追加前位翻倍、ALLIN的(其他需要手工输入或拉滑竿),那么如果在河牌的时候,对方突破来了一个很奇怪的筹码,表示他是手工输入的,这表示什么意思呢?我总结过自己,当我心态很平稳的时候,才会手工输入,通过非手工输入的方式可能存在莽撞(或随意、急躁)的行为。
所以,我在打牌的时候,看到别人手工输入一个特别的筹码,我就特别小心一些。
作者: checkhold    时间: 2011-2-14 18:27
呵呵。ps经常有人加注 1999 或则 是2999 啊什么的。 弄1米高。
作者: yyz13    时间: 2011-2-14 20:51
回复 6# checkhold


    我最喜欢加999啦。。。大酬宾,赶快CALL我的意思。。。
作者: yyz13    时间: 2011-2-14 20:54
正常概率下,,,冤家牌是不太多的。。。

我觉得冤家牌是一个可控的系数。。。调高系数就是FTP。。调小系数就是PS。。。把系数调到0就是QQ德州扑克。
作者: xiuilnag    时间: 2011-2-14 21:23
搞得太复杂
作者: 52magic    时间: 2011-2-14 21:58
FTP解释其发牌机制 谁来解释下吧
The card shuffles at Full Tilt Poker are better than any physical deck of cards. Our software uses advanced shuffle algorithms to ensure that every possible ordering of cards can be reached, and is as equally likely as any other. This is not achieved in real deck shuffles and it ensures that our players are guaranteed a completely random deal every time.

The server randomizes the deck by using several different core systems which each generate a random number. These randomized numbers are then combined to generate a random card. This redundancy ensures that even if several core systems failed or were compromised in some way, the output would still be random. This means that any card dealt on our system is always guaranteed to be random and completely unpredictable.
作者: dolphin    时间: 2011-2-14 22:59
没什么意思,就是说有几个系统生成随机数,这几个随机数再合起来产生一张随机牌。这种重复性保证了即使几个系统失败了,那么产生出的牌仍然是随机的。
作者: flyinglion    时间: 2011-2-15 01:39
本帖最后由 flyinglion 于 2011-2-15 01:44 编辑

计算机不可能产生真正的随机数,给的种子一定,随机数也是一定的。
如果随机数是取自系统时钟,那要是我们知道程序,就知道了当前的种子取值为多少,代入的话就可以算出某年某月某分某手牌是什么了。所以他们必须有很多个种子,造成看似随机的效果,其实也不过是计算的复杂性多了一点而已。
又或许随机数取自按键延迟,比如大家考虑多少时间,以及网络的延时,那样的话,你的动作就会影响到下一张牌了。

不过这没有意义,就算知道他们程序是怎么写的,种子取自哪里,也没有他们的服务器啊。诶,不过这么说来,或许因果报应有理?如果特别倒霉,那故意改变一下下注的时间或许有效?不过也有可能更倒霉啊……
作者: colin    时间: 2011-2-15 05:07
不懂软件,太复杂了。
作者: foolishdaily    时间: 2011-2-16 08:59
12楼说的对,计算机不可能存在真正的随机,关键是扑克室用的服务器太强大了,你要是想算出来他的发牌顺序或者概率,要有比那个更强大或者至少一样强大的PC服务器才能做到,有这个钱数的,没必要去打牌了。
作者: wl23th    时间: 2011-2-17 23:15
呵呵   存技术贴啊
作者: 独孤飘云    时间: 2011-2-23 02:07
复杂啊,留着慢慢研究。
作者: kaimilove    时间: 2011-2-24 03:00
提示: 作者被禁止或删除 内容自动屏蔽
作者: enenppl    时间: 2011-2-24 10:25
這個問題我也有想過,
總之,遇到BB,都覺得自己點得太快. haha




欢迎光临 智游城 (http://zhiyoucheng.co/) Powered by Discuz! X3.2