图2.6 玩家一(人)流程图
启动游戏,然后进行初始化,然后由庄家先出牌,接着按顺时针的顺序拿牌,出牌。对于玩家一的流程,首先在初始化的时候判断是否是庄家,如果是,那就首先出牌,如果不是,继续监听是否该轮到玩家一拿牌了,如果是,那就由玩家一拿牌,不是,那就由玩家一继续监听是否有吃碰杠,有的话,就提示玩家一是否要执行。玩家一一直处于一种监听状态,首先监听是否是他拿牌了,其次监听是否有吃碰杠,根据得到不同的动作,玩家一再进行操作,比如拿牌,或者进行吃碰杠。然后再在拿到牌以后判断是否能和牌,如果有的话那就进行提示,没有的话就出牌。最后,若玩家能和牌了,再有系统提示是否要开始新一轮的游戏,如果开始新一轮的游戏的话,那么庄家就是赢家,如果按退出的话,那就关闭游戏。接下来是其他玩家(电脑)的流程图,如图2.7所示。
图2.7 电脑玩家流程图
由于让电脑玩家考虑是否应该和牌实现起来比较复杂,所以本文在功能实现上决定,放弃追求麻将的番数,一旦有和牌的机会,就让电脑玩家和牌,这样在人工智能上就实现起来就方便了很多。其他流程跟玩家一(人)完全一样。
本文把麻将写成一个类,这样就有效地实现了封装,以方便调用。属性分别是花色和点数,另外包括以下两种情况,一是财神,本文把它的值定义为-1;二是白板,本文把它替代为原财神,这是杭州麻将的规则。
在MID设备上运行的Java程序被称为MIDlet。这些MIDlet在底层CLDC的支持下,通过MIDP中提供的包获得更多的功能(其中包括UI、网络、永续性存储等)。MIDlet可以直接使用MIDP本身提供的类库以及MIDP从CLDC中继承的那部分API。MIDlet程序的运行是由startApp(),pauseApp()和destroyApp()这3个方法控制的。它们都在Javax.microedition.midlet.MIDlet中定义,所有的MIDlet都必须实现这3个方法[12]。
程序初始化主要是针对J2ME运行机制作出的一些处理。初始化MIDlet时,必须写上三个方法:startApp(),pauseApp(),destroyApp()。startApp()方法具体实现如下:
public void startApp() {
Display.getDisplay(this).setCurrent(form);
conn = new Connection(this); // 初始化网络
}
表示将在游戏启动时运行Form表单,同时进行网络的初始化操作。
J2ME用户界面编程分为高级UI编程和低级UI编程。Screen类属于高级图形用户界面组件,Canvas是低级图形用户界面组件[13]。在同一时刻,只能有唯一一个Screen或者Canvas类的子类显示在屏幕上,可以调用Display的setCurrent()的方法来将前一个画面替换掉,必须自行将前一个画面的状态保留起来,并自己控制整个程序画面的切换[14]。Form表单是属于Screen的派生类,它是属于高级图形用户界面组件,然后再用Command类对按键进行监听。运行表单后,这样就可以进行不同的按键选择了。
网络的传输本文用两个类来实现。第一个类进行网络连接初始化,第二个类是客户端对服务器端进行发包收包操作,并进行响应的包解析。
主游戏模块是整个程序的核心,它继承了Canvas类,是低级用户界面组件,用Keypress进行按键响应[15]。如图2.8所示,是主游戏启动后的界面。
图2.8 游戏启动后界面
在上述体系结构的基础上,主要分为以下几个模块:初始化游戏模块、绘画机制模块、检测吃碰杠模块、和牌模块、电脑玩家出牌模块。
初始化游戏需要作以下工作:首先是财神的选定,本文采用随机的方法来选定财神,然后是庄家的选定,本文这样规定庄家,如果是第一局,就规定玩家一(人)是庄家,如果不是第一局的话,那么就由上一局是赢家的那家作为庄家。然后对四家发牌,采用随机发牌;最后是对四家手上的牌进行排序,初始化完毕。
绘画机制在整个程序中起到很重要的一块,在游戏设计中尤为重要。绘画模块大致可以分为两个模块:第一是初始化模块,第二是运行时模块。当游戏启动时,本文把画布设成全屏模式,加载一些图片,画出财神,以及一些为了美观作的修饰,等等,这些都是初始化模块需要做的工作;在运行时模块中,本文必须在run()函数中调用repaint()函数,以便能够在每次执行其他操作后进行刷新或者重画。比如,每次取了牌,必须得将手中的牌刷新一次,有人打出了牌,也得重新画一次,遇到吃,碰,杠,和,或者提示,都得进行绘画。
本文分别用三个函数eat(),bump(),gang()来检测吃、碰、杠。本文根据花色相同,点数相连来进行吃的检测;根据花色相同,点数相同来进行碰的检测;当然如果有四张牌点数花色都一样的话那就是杠了。
和牌模块算是整个游戏设计中的一个难点,本文采用列举的方法把各种和牌的模式归纳性的罗列了出来。可以把和牌大致分为以下两类:一类是特殊的,一类是普通的。
特殊的一类是七对子,即手中的14张牌都是一对一对的,总共七对(当然,也可以用财神替代)。这种牌如果和了的话就是四番。
普通的一类就是平时和的那种牌,即多个顺子,一副对。这种和牌可以考虑从对里面入手,可以分两种情况:一种是有对的,一种是没对的。如果有对的话,那可以把对子拿出来进行判断剩下的牌是否都是一顺一顺的(可以用一张财神来抵消任何一顺差一张牌的类型)。如果没有对的话,那就要看有没有财神,如果没的话,直接返回,表示不能和,如果有的话,可以用财神跟任何一张牌来搭配充当一对,然后对剩下的牌进行判断,是否都是一顺一顺的。
电脑出牌涉及到人工智能方面的问题,由于人工智能并非本文研究的课题,所以只简单地实现了电脑出牌的人工智能。本文采用积分的方法来实现,对于每一张牌,都会赋予不同的积分,然后对于积分最小的牌,就认为该牌最没有价值,最后将该牌打出。
具体赋予该牌的积分规则如下:根据牌值的大小赋予不同的值,越是中心牌,那么积分越大,但是不超过5分;如果是财神的话,赋予50分;如果是一顺的话,那么该顺子的每张牌都赋予20分;如果是相邻的牌或者是一对的话,那每张牌赋予10分,如果是相间的话,那每张牌赋予5分。最后再根据积分的大小
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页