ID #22915

VC++ 2008开发网络百家乐街机游戏(上)

  前  言: 目前街头电子游戏厅内充斥着各类明目繁多的街机游戏,画面绚烂,游戏方式各异。其实剖开游戏的表面,分析内部的系统架构,您将会发现大大小小的街机游戏开发模式都是一直的,先在PC机上完成编码架构与环境测试,再移植到专用的街机平台上,有的甚至就是PC终端直接改装成街机。本文将以Visual C++ 2008平台下开发网络百家乐街机游戏为例,向您详细阐述街机游戏开发的全过程。

  一、 游戏背景介绍

  街机游戏厅内最为常见的就是百家乐一类的游戏,街机游戏迷们大多对此类游戏有兴趣,一为娱乐二为彩头。百家乐英文为Baccarat,其名字取自义大利语中的“零”,因为在大部份扑克牌游戏中占着高价值的人面牌及十点牌,在百家乐游戏中却都算作零。一些历史学家认为百家乐游戏起源于中世纪的意大利西西里岛,后来流传到法国,并广受豪门贵族欢迎,在传入美国后逐渐发展成熟起来,规则得到进一步完善。不论起源于哪,百家乐最早是只有庄家和玩家两人参加的数位博彩游戏,由庄家给玩家和自己各发两张牌,谁的两张牌加起来的总数最接近9,谁就赢。几个世纪以来,适用于第三张牌的一系列博彩规则,以及从每一个玩家收取一定拥金的规则不断发展变化。

  时至今日,百家乐成了博彩业最追捧的游戏。上世纪60年代年代,何鸿燊的合伙人叶汉将这种游戏引入澳门博彩业,并为其起了一个具有东方色彩的好名字─百家乐,百家乐成了中国人喜欢玩的一种博彩游戏。当然,本文以百家乐游戏为例,不是让您以此去做违法的事,只是百家乐的游戏规则是一种精辟的数学分析,它的规则能充分综合概率统计与数字逻辑的运用。对于软件开发者而言,设计一款完善的网络百家乐街机游戏,能很好的将软件开发与数学思维综合在一起,从而提升软件研发水平。

  二、 游戏规则数学分析

  百家乐游戏一般需用6副扑克(每副52张牌, 不包括大, 小王). 庄家和闲家将各发到两张牌. 然后依照标准的百家乐规则, 将第三张牌发给闲家或庄家. 百家乐游戏的目的是要玩家预测庄家或闲家谁手上纸牌的点数最接近 9 点. 你可将押注押在庄家, 闲家, 或是和局. 当双方的点数相同时即为平手. 如果游戏达成平手, 押在庄家和闲家的押注会退还. 庄家和闲家的赔率都是相同的, 只是如果你押庄家而庄家赢, 庄家会收取 5% 的佣金. 如果你下分和局同时结果正确的话, 将可以获得 8 赔 1 的赔率金额. 所有十点的牌都以 0 计算, 而A牌则计为一点, 其它按其原先牌面点数. 如果牌的点数总和超过9, 则将总和减去10.

  例如: 手中的牌    点数总和

  9+8=17        7

   5+5+5=15      5

   10+9=19       9

  庄和闲如何补牌早已设计好了,由荷官按规则执行,只要闲或庄任何一方两张牌的总点数为8点或者9点,胜负已定,这种情形称为天然赢。

   只要不是天然赢,闲家及庄家按下面顺序决定要不要第三张牌:

   只要闲的点数是5点或者5点以下,必须补第三张牌。

  如果闲家没有补第三张牌(即闲家两张牌的点数为或者7点)而庄家点数5点或5点以下,庄家必须要第三张牌;如果闲家补了第三张牌(即闲家的点数在5点或者5点以下),那么庄家依照下面的图表决定补不补第三张牌。

  庄家

  点数

  0

  1

  2

  3

  4

  5

  6

  7

  8

  9

  7

  -

  -

  -

  -

  -

  -

  -

  -

  -

  -

  6

  -

  -

  -

  -

  -

  -

  补牌

  补牌

  -

  -

  5

  -

  -

  -

  -

  补牌

  补牌

  补牌

  补牌

  -

  -

  4

  -

  -

  补牌

  补牌

  补牌

  补牌

  补牌

  补牌

  -

  -

  3

  补牌

  补牌

  补牌

  补牌

  补牌

  补牌

  补牌

  补牌

  -

  补牌

  2

  补牌

  补牌

  补牌

  补牌

  补牌

  补牌

  补牌

  补牌

  补牌

  补牌

  1

  补牌

  补牌

  补牌

  补牌

  补牌

  补牌

  补牌

  补牌

  补牌

  补牌

  0

  补牌

  补牌

  补牌

  补牌

  补牌

  补牌

  补牌

  补牌

  补牌

  补牌

  人们喜欢百家乐也是因为它的“快”,只要庄家给玩家和自己各发两张牌,谁的总数越接近9谁就嬴了。

  百家乐和 BLACKJACK 、 POKER 等游戏不同,在百家乐局上虽然也有庄和闲的分别,但玩家既可以把注下在庄上也可以把注下在闲上,那么运营方是怎样来实现其在规则上的优势呢,首先按照补牌规则,庄补牌比闲更具优势,闲输给庄,但玩家要是始终把注下在庄上,运营方岂不要吃亏,因此在百家乐游戏中还有一个补充规定,庄赢要抽水5%,这个5%要大于庄对闲的优势,这样一来,下在庄上的注也占不到任何便宜。下面我们进行具体分析。

  百家乐的庄与闲分别最少也有两张牌,最多也只有三张牌。由百家乐的规则很容易想到,百家乐也存在着一个庄与闲的点数的概率分布表,但并不能直接用这个概率分布按照公式(2?1?1)来计算收益率,因为百家乐的点数和对方的牌点甚至和对方的第三张牌有关,显然,三张牌的“6”点从来就不会和对方的“8”点遇到一起,因此这张表并没有更多的意义。

  点数

  0

  1

  2

  3

  4

  5

  6

  7

  8

  9

  庄家

  8.88

  6.93

  6.91

  7.28

  9.34

  10.07

  12.11

  12.84

  12.80

  12.84

  闲家

  9.40

  7.45

  7.43

  7.45

  7.43

  7.45

  13.32

  13.37

  13.32

  13.37

  有人会觉得这个表格不准确,至少庄或者闲出现“8”和“9”点的概率似乎应该相同。这是因为每发出一张牌,后面的牌出现的概率就有了细微的变化,如果以牌的平均出现概率1/13来计算,庄或者闲出现“8”和“9”点的概率就是相同的了。百家乐的收益率的计算,也是应用公式(2:1:1)来计算赔率的加权平均值,但是是通过计算具体到每一种情形下赔率和它发生的概率的乘积的累加值得到,计算收益率时顺便也得到了百家乐庄与闲的点数的概率分布表。

  下面以8副牌为例,并对牌的花色不加以区分,举例如下:

  闲:“2、4”,庄:“2、3、2”

  闲的第一张牌“2”出现的概率为32/416,庄的第一张牌“2”出现的概率为31/415,闲的第二张牌“4”出现的概率为32/414,庄的第二张牌“3”出现的概率为32/413,闲不能再补牌,庄必须再补一张,庄的第三张牌“2”出现的概率为30/412。闲“6”点,庄“7”点,由于庄的点数比闲大,押庄赢,押闲输,这种情形发生的概率:

  32/416×32/414×31/415×32/413×30/412

  又如闲:“2、4”,庄:“2、2、1”,

  闲的第一张牌“2”出现的概率为32/416,庄的第一张牌“2”出现的概率为31/415,闲的第二张牌“4”出现的概率为32/414,庄的第二张牌“3”出现的概率为32/413,闲不能再补牌,庄必须再补一张,出现庄的第三张牌“1”的概率为32/412。闲“6”点,庄“5”点,由于闲的点数比庄大,押闲赢,押庄输,这种情形发生的概率:

  32/416×32/414×31/415×32/413×32/412

  闲:“10、4、5”,庄:“10、5、2”

  闲的第一张牌“10”出现的概率为128/416,庄的第一张牌“4”出现的概率为32/415,闲的第二张牌“4”出现的概率为32/414,庄的第二张牌“5”出现的概率为32/413,闲必须补第三张牌,闲的第三张牌“5”出现的概率为31/412,庄也补第三张牌,庄的第三张牌“2”出现的概率为32/411。闲“9”点,庄“7”点,由于庄的点数比闲大,押庄赢,押闲输,这种情形发生的概率:

  128/416×32/414×31/412×32/415×32/413×30/411

  又如闲:“10、10、10”,庄:“10、10、10”,

  闲的第一张牌“10”出现的概率为128/416,庄的第一张牌“10”出现的概率为127/415,闲的第二张牌“10”出现的概率为126/414,庄的第二张牌“10”出现的概率为125/413,,闲必须补第三张牌,闲的第三张牌“10”出现的概率为124/412,庄也补第三张牌,庄的第三张牌“10”出现的概率为123/411。闲“0”点,庄“0”点,由于庄和闲的点数一样大,押庄或闲都不输不赢,押和赢,这种情形发生的概率:

  128/416×126/414×124/412×127/415×125/413×123/411

  把所有可能出现的情形都计算一遍并把所有的结果进行累加,就能得到我们需要的结果,当然,用程式来实现上面的思想并不难,下面是编程后计算得到的结果。

  庄、和、闲的概率:   45.860  44.625 9.516

  庄、闲、和的赢率:   49.471  49.382 42.820

  庄、闲、和的收益率: -1.058  -1.235 -14.360

  由庄、和、闲的概率计算收益率的过程如下: 

  押庄的收益率=0.95×45.860-44.625=-1.058

  押闲的收益率=44.625-45.860=-1.235

  押和的收益率=8×9.516-44.625-45.860=-14.357

  可见,百家乐中庄赢抽水“5%”其实并不是真正意义上的抽水,只是实现抽水的一种手段,而不是抽水本身。其实,在百家乐中,运营商在庄、闲、和上分别架了三台抽水机在抽水,数“和”那台马力出奇的大,闲次之,庄最小。上面的概率乘以消耗的牌的数目,把所有可能出现的情形都计算一遍,并把所有的结果进行累加就能得到每轮的平均耗牌数:4.939张牌。

  以上是百家乐游戏规则的详细数学分析,下面介绍该游戏架构的设计。

  三、 游戏架构及数据库结构设计

  根据目前街机游戏的设计结构,本系统架构由前台客户端/后台服务端/同步控制台/数据设置端四块组成,数据库大多采用小型数据库软件,本系统以Access2007数据库为例建立数据库文件。

  3.1  游戏架构

  前台客户端即玩家游戏时的主要操作平台,大多采用WIN32开发模式,以多线程运用为主。所有街机终端的操作输入装置只有几个简单的按钮,以本系统为例,每一个玩家接触的只有小分,大分,退分,红庄,黑闲,绿和六个按钮。同时街机游戏为提升人气,大多支持多人同步统一操作画面控制台游戏,即前台客户端支持多个玩家在同一个软件平台上同时操作,看到的反馈画面是完全一致的。本系统前端采用一台主机通过分频器连接十台显示器模式可供十人同时游戏。因此前台客户端软件的输入设计需对ISO标准键盘ASCII码分区定义,支持键盘的读码输入,而不同于普通软件的控件输入。后台服务端主要负责前台客户端游戏的运行监控;所有玩家的上分、退分;百家乐开局,每局的场次及路单结果生成;运营数据统计等工作,操作人员为游戏运行管理人员。同步控制台主要负责整个游戏的运行时间控制,在本系统设计的街机百家乐游戏中每局为180场,每场均根据后台设置的到倒计时规定每场的投分时限,时限到达后,系统根据本场百家乐的运行路单显示本场结果,前台端软件根据本场结果及各玩家的投分状况计算出各玩家的得失分值并计入数据库。同步控制台会产生每场的读秒运行时由前台客户端软件读取,由此控制每场游戏的同步运行。因为是网络百家乐街机游戏,本系统后台数据库采用ACCESS2007文件,为方便系统安装维护,开发数据设置端软件以方便网络数据的安装与配置。后台服务端的数据统计报表采用VC++专用报表工具aResReport设计,可方便直观的查看各类分析数据汇总。

  根据以上描述,系统逻辑架构设计如下:

VC++ 2008开发网络百家乐街机游戏(上) 

  3.2  数据库结构

  基于以上的分析,以ACCESS2007建立游戏数据库文件th_round.dat,并设置数据库文件访问密码。添加数据库表如下:

  th_round_bjcc表用于记录百家乐游戏本局的当前场次与总局数,bjcc字段记录本局场次,sumcc字段记录总局数

VC++ 2008开发网络百家乐街机游戏(上)

  th_round_time表用于存储同步控制台与前台客户端软件通讯的同步控制计时及上分机器读数,djs字段记录倒计时限,boolreadsf字段记录是否有机器上退分,jqh字段记录上退分的机器号,sfsz记录上退分的数值。

VC++ 2008开发网络百家乐街机游戏(上)

  th_round_fpjl表存储本局百家乐的所有发牌记录,本系统设计每局百家乐为180场,由10列×18行组成,发牌记录在开局时由系统根据游戏规则按机器发牌的随机概率算法自动生成,存储数据示例表示如下:

VC++ 2008开发网络百家乐街机游戏(上)

  th_round_lpjl表与th_round_fpjl表相对应,也由10列×18行组成,存储每一场对应机器发牌的庄闲和路单结果,th_round_lpjl表的设计是为在每局百家乐游戏开局前打印路单,路单即是存储每局百家乐游戏的所有180场庄闲和结果的密闭信封,在本局结束后开拆,由玩家与客户端软件屏幕显示的场次记录核对,确保游戏的公平性。存储数据示例如下:

VC++ 2008开发网络百家乐街机游戏(上)


2009-02-27 00:00
阅读:
I'm VC , Just U know Y
本站部分文章来源于互联网,版权归原作者所有。

延伸阅读:

浅谈VC++ 6.0中临时数据的存储方法

使用VC++开发考场随机排座系统

如何设置VC中的WinpCap开发环境

VC++ 2008开发网络百家乐街机游戏(下)

你有GIF的开发许可吗?PrecSubclassWindow 以及 MFC 中