五子棋论文 (3)

上传人:fgh****35 文档编号:173411989 上传时间:2022-12-10 格式:DOC 页数:29 大小:441KB
收藏 版权申诉 举报 下载
五子棋论文 (3)_第1页
第1页 / 共29页
五子棋论文 (3)_第2页
第2页 / 共29页
五子棋论文 (3)_第3页
第3页 / 共29页
资源描述:

《五子棋论文 (3)》由会员分享,可在线阅读,更多相关《五子棋论文 (3)(29页珍藏版)》请在装配图网上搜索。

1、 基于J2ME五子棋手机游戏开发摘要 基于J2ME 技术,设计并开发了一款五子棋手机游戏,程序实验取用Java语言,便于游戏软件的移植,采用手机模拟器进行模拟测试,便于检查游戏功能的实现。在构建了完善的游戏思维的基础上,划分功能模块,实现整套游戏的开发。整个程序完成的功能是一个人机对战的五子棋游戏,游戏的重点与难点在于计算机人工智能算法,总的来说就是根据棋型选择最优的点下子。关键词 J2ME;手机游戏;人工智能 ABSTRACT Based on J2ME technology, we designed and developed a mobile game backgammon, proce

2、dures, experimental access to java language, to facilitate the transplant games, mobile simulator used to simulate the test, easy to check the function of the realization of the game. Construction of a perfect game in mind, based on division of function modules, to achieve complete game development.

3、 Complete the whole process is the function of a human-computer play against a backgammon game, the game is important and difficult computer AI algorithms, in general is to choose the best according to point type chess erupted.KEY WORDS J2ME;Games of Mobile;Artificial Intelligence3目录1. 前 言12.相关介绍22.

4、1 J2ME简介22.2 Configuration和CLDC22.3 手机游戏特点33.棋类游戏的相关探讨43.1 逻辑层和表现层的分离43.2 自适应尺寸和可移植性44.五子棋游戏的架构54.1 事件驱动游戏54.2 游戏的类结构54.3 游戏的流程74.4 五子棋的人工智能84.4.1 五子棋的获胜组合84.4.2 设计获胜棋型95.游戏设计与实现95.1 MIDlet简介95.1.1 MIDlet生命周期105.1.3 FIRMIDlet类代码片断125.2 游戏介绍表单的实现125.3 游戏设置表单的实现135.3.1 Gauge与ChoiceGroup组件介绍135.3.2 Opt

5、ion类设计145.3.3 Option类代码片断155.4 棋子Dot类的实现165.5 对战逻辑FIRlogic类的实现175.5.1 落子与悔棋175.5.2 棋型检测的实现175.5.3 FIRlogic类代码片断195.6 游戏画布205.6.1 Canvas类介绍205.6.2 FIRCanvas类实现215.6.3 用户输入236. 结束语24参考文献25致谢27基于J2ME的五子棋手机游戏开发1. 前 言随着手机网络的日益进化,手机硬件性能的不断提升,手机功能越来越多, 人们对于掌上数字娱乐的追求与日俱增,随着越来越多的智能手机的上市,手机的功能已经不再局限于收发短信、接听电话

6、等人们的基本通信需求,手机的游戏功能得以彰显。对于多媒体的支持,使得在手机上开发游戏应用程序更加得心应手,而且游戏的表现力也得到了极大的发挥。随着计算机软件技术的不断发展,嵌入手机等移动设备的软件开发逐渐出现了新的突破。Java 技术的兴起,解决了移动设备软件开发固有的一些弊端,也使高级手机游戏的开发成为现实,其良好的跨平台特性和面向对象的优势在嵌入移动设备的软件开发中显示出了巨大的威力。而J2ME(Java 2 Micro Edition) 的诞生给高级手机游戏的开发又带来了新的生机。J2ME 技术用于手机游戏开发,不但便于查看游戏运行过程中内存的占用量和程序的每一部分代码消耗了多少处理器时

7、间,而且可以不断地优化代码,使用J2ME 和MIDP 进行手机游戏开发已越来越受到人们的关注。忙碌的人们,在等车时、在公交车上、在偶尔的闲暇时间,掏出口袋中的手机,玩起手机游戏,短暂的娱乐使紧张的神经得以放松,从而以更加良好的状态投入到学习工作中去。本游戏主要的内容是人机对战,先达到五子连株者为胜,棋盘大小范围是10x10至20x20,游戏难度分为三等级(初阶、中阶和高阶),玩家自行设置。玩家使用四个方向键的上(2)、下(8)、左(4)、右(6)来移动落子点位,移动到空白位置使用确定键(5)来落子,游戏过程中允许悔棋(最多连续悔5步)。整个程序完成的功能是一个人机对战的五子棋游戏,游戏重点与难

8、点在于如何设计一套快速有效的人工智能算法,尽可能增加游戏的可玩性。本程序取用根据盘面形势,判断在某个位置落子后会形成什么棋型(如“五连”、“冲四”、“活三”等),然后通览全盘选出最佳落子点的方法。2.相关介绍本次毕业设计采用了J2ME技术,Java是目前占据优势的手机软件开发技术,并且它是一种开放平台,这意味着可以开发一组代码并使其在众多的移动设备上运行。下面将述J2ME的一些相关知识。2.1 J2ME简介Sun公司将J2ME(java 2 Micro Edition,Java2微型版)定义为“一种以广泛的消费性产品为目标、高度优化的Java运行时环境”。J2ME是为了那些使用有限能源、有限网

9、络连接(常常是无线连接),以及有限图形用户界面的设备而开发的。从1999年6月在Java One Developer Conference上声明之后,J2ME便进入了小型设备开发的行列。当时,由于分布式编程深受Java开发者团体的欢迎,大多数与会者都只对J2EE的功能感兴趣。富有戏剧性的是,在随后的两年里,开发者意识到了运行Java的小型组件同样具有很高的价值,J2ME逐步流行。J2ME不只是一个单独的技术规范,而是一系列技术规范的总称。这些规范定义了Java技术在资源限制的设备中的表现形式,而且新规范在不断制订当中,并且这些规范的制订是完全向公众开放的。目前所说的手机游戏其实是其中规范的一种

10、,即MIDP(移动信息设备规范),该规范应用最为普通,因此习惯上也被人们笼统地称为J2ME技术。J2ME主要应用于手机等小型嵌入式设备,这些设备由不同的厂商设计生产,功千差万别。J2ME在应用于这些设备的同时也保留了Java的传统特性,即任何时间和任何地点的代码都具有可移值性、部署灵活性、安全的网络传输性,以及代码稳定性。2.2 Configuration和CLDCJ2ME 平台是由配置(Configuration) 和简表( Pro2 file) 构成的。配置是提供给最大范围设备使用的最小类库集合,在配置中同时包含Java 虚拟机。简表是针对一系列设备提供的开发包集合。在J2ME 中还有一个

11、重要的概念是可选包(Optional Package) ,它是针对特定设备提供的类库,比如某些设备是支持蓝牙的,针对此功能J2ME 中制定了JSR82 (BluetoothAPI) 提供了对蓝牙的支持。目前,J2ME 中有2 个最主要的配置, 分别是Connected Limited Devices Configuration (CLDC) 和Con2nected Devices Configuration (CDC) 。CLDC 是两个配置中较小的一个,为具有间断性联网能力、较慢的处理器和有限内存的设备设计的。这些设备包括移动电话、双工呼叫器和入门级的PDA ,它们通常具有16 位或32 位

12、的CPU、128KB512KB 可用于Java 平台实现和相关应用程序的内存。CDC 是为处理能力较强、内存空间更大、联网能力更出色的设备设计的。这些设备包括电视机顶盒、车载娱乐系统、高端PDA 等。CDC 包含一个具有完备特性的Java 虚拟机,比CLDC 更大的Java SE的子集。CDC 的目标设备通常具有32 位或64 位的处理器,2MB 以上的可用于Java 平台实现和相关应用程序的内存空间。2.3 手机游戏特点一个手机游戏应该具有以下特征:易于学习:既然手机游戏面向的是普通消费者而不是计算机专家,那么他们不可能深入的学习游戏技巧。消费者不会花几个小时去研究一个3 元的手动操作的游戏

13、。保持游戏的简单是最基本的要求。可中断性: 多任务处理是手机生活方式的基本特征。手机用户常常在任务(如等一个电子邮件或者等车) 之间有一小段时间。而游戏、日历管理、通讯和工作数据访问使用的是同一个设备。所以一个好的手机游戏应该提供短时间的娱乐功能,并且允许用户在游戏和工作模式之间顺利切换。基于订阅:手机游戏的盈利成功取决于他们巨大的使用量。一开始开发和设计每个游戏都是昂贵的。如果一个手机游戏开发者要赢利的话,重要的是:同一个游戏引擎,多个标题,基本的故事情节类似。基于订阅的游戏是不断产生收入的最好方法。丰富的社会交互:不管一个游戏设计得多好,只要玩家找到了它的根本模式或者玩完了所有的游戏路径很

14、快就会厌烦这个游戏。对于一个基于订阅的游戏,重要的是与别的玩家合作以增强所玩游戏的智力和随机性。在今天纷繁复杂的多玩家游戏中具有丰富社会交互的游戏证明是成功的。3.棋类游戏的相关探讨3.1 逻辑层和表现层的分离棋类游戏是移动设置比较擅长表现的游戏,相对于动作类游戏的快节奏,棋类游戏的特点就是玩起来速度慢,比较优雅,主要来培养玩家在某方面的思考和判断能力。棋类游戏的开发常常带有人工智能算法,因此,需要注重逻辑层和表现层的分离。逻辑层处理所有的判断、推算,可采用各种比较复杂的算法,而表现层则只管与玩家交互。3.2 自适应尺寸和可移植性MIDP设备可能有不同的屏幕尺寸、不同的键盘布局以及不同的可用A

15、PI。在设计游戏时必须考虑这些不同点,以便获得移值性最好的游戏软件。游戏中所使用的棋盘大小是用户设定的,尺寸也并非固定,而是应用程序从系统获得屏幕的尺寸,并进行计算得出,这些可以避免在屏幕上绘画时对坐标使用的硬代码。使用Canvas类的getHeight和getWidth方法能够完成上述任务。此外,一个良好的做法是让游戏既支持键盘操作也支持指针操作,这通常不需要增加太多的代码,但可以提高游戏的可移值性。4.五子棋游戏的架构五子棋游戏的架构涉及游戏驱动、类结构和流程的初步设计,由于人机对战五子棋采用了人工智能算法,因此,还对获胜棋型和攻守策略进行了探讨。4.1 事件驱动游戏棋类游戏通常具备两个重

16、要特性,首先是对战双方轮流落子,其次是落子间隔通常是不确定的,尤其是对战后期,可能每一步棋都需要经过深思熟虑,无论是人方或是计算机方,都无法对间隔时间有实现的预期。基于以上两个特性,本游戏摒弃了大多数游戏采用的线程或定时器驱动游戏的方法,而采用事件驱动的方法,即玩家的键盘或触摸笔触发游戏的下一步动作。事件驱动大大减少了不必要的工作量,只有玩家发出消息时,计算机才启动运算,而在玩家思考期间,计算机不做任何运算和重绘操作。事件驱动的游戏循环如图3.1:4.2 游戏的类结构整个游戏共由六个类组成,如图3.2所示。游戏的FIRMIDlet类负责保持display对象,并且提供各屏幕之间的切换。整个程序

17、包含四个屏幕:游戏主屏幕表单,实际玩家进行游戏的FIRCanvas,提供某些关于游戏选项的Option表单,以及一个用来显示相关信息的About表单。此外,Dot和FIRLogic类是分别用来构造游戏棋子和算法逻辑的。图4.1 事件驱动游戏循环图4.2 类结构4.3 游戏的流程游戏启动时,FIRMIDlet对象先显示游戏主屏,在屏幕下方一侧是退出软键,另一侧是用软键构成的菜单,菜单元素主要有“设置”和“关于”选项。当玩家选择“设置”软键时,则显示游戏参数设置表单;当玩家选择“开局”软键时,则显示游戏对战主屏;当玩家选择“关于”软键时,则显示游戏介绍表单。玩家进入游戏参数设置表单,当玩家按下“确

18、定”软键时,则确认当前游戏参数,返回游戏主屏;当玩家按下“取消”软键时,则放弃此次对游戏的修改,直接返回游戏主屏幕。玩家进入游戏对战画布,对战中画布有两个软键,当玩家按下“退出”软键时,则退出游戏;当玩家按下“悔棋”软键时,则进行悔棋操作;当游戏结束时,“悔棋”软键被换成“重玩”软键。整个游戏的界面切换流程图如图3.3所示。图4.3 游戏的界面切换游戏图4.4 五子棋的人工智能人工智能也就是所谓的AI(Artificial Intelligence),它是一门很抽象的技术(或者也可以称之为艺术),游戏中的AI可以在遵循一定规则的情况下,依程序设计者本身的思考逻辑制作。可以这样认为,人工智能的核

19、心是使计算机具有自动处理事件的能力,而设计者的所有研究也应该围绕着这一方向进行。最常见的AI游戏就是棋盘式游戏。在这类游戏中,通常的策略类AI程序都是使计算机根据目前状况计算所有可走的棋与可能的获胜状况,并计算当前计算机可走棋步的获胜分数或者玩家可走棋步的获胜分数,然后再决定出一个最佳法。下面介绍一下五子棋的AI构想。4.4.1 五子棋的获胜组合在一场五子棋的游戏中,计算机必须要知道有哪些获胜组合,因此我们必须求得获胜组合的总数。现在假定当前的棋盘为15x15:1) 计算水平方向的获胜组合数,每一列的获胜组合是11,共15列,所以水平方向的获胜组合数为:11x15=165。2) 计算垂直方向的

20、获胜组合数,每一行的获胜组合是11,共15列,所以垂直方向的获胜组合数为:11x15=165。3) 计算正对角线方向的获胜组合数,正对角线上的获胜组合总数为11+(10+9+8+7+6+5+4+3+2+1)x2=121。 4) 计算反对角线方向的获胜组合数,反对角线上的获胜组合总数为11+(10+9+8+7+6+5+4+3+2+1)x2=121。 这样所有的获胜组合数为:165+165+121+121=572。4.4.2 设计获胜棋型我们已经计算出了一个15x15的五子棋盘会有572种获胜方式,这样我们可以利用数组建立一些常规棋型,棋型主要作用是:判断是否有任何一方获胜;根据当前格局判断最可能

21、的落子方式。然而在现实中,人们总结了很多能够构成获胜棋型的“前奏” ,它们是通向胜利的捷径,如“冲四” 、“活三” 、“双三”等等。5.游戏设计与实现5.1 MIDlet简介 MIDlet是用J2ME APIs开发的程序,用于移动计算环境中。MIDlet需要一个特殊的运行环境,这个环境主要包含一个应用程序管理器,它为在移动设备上选择和运行MIDlet提供方便。 5.1.1 MIDlet生命周期所有MIDlet都继承自java.microedition.midlet.MIDlet,该类包含了MIDP平台控制应用程序执行过程的方法。当MIDlet被初始化后就进入它的生命周期,该生命周期包含三种状态

22、:激活态(Active)、暂停态(Paused)和销毁态(Destroyed),这三种状态的控制完全由JAM来完成。当出现状态迁移时,JAM会自动调用相应的方法,MIDlet状态迁移图如4.1.1所示。图5.1.1 MIDlet状态迁移触发的方法调用JAM加载MIDlet后,首先进行初始化的工作,然后将状态设置暂停态,如果在初始化过程中没有出现异常,那么将MIDlet的状态设置为激活状态,否则将MIDlet的状态设置为销毁状态。在每次状态转换的时候都要高用相应的方法。5.1.2 主类FIRMIDlet类的实现FIRMIDlet类继承了MIDlet类,负责程序的启动和屏幕切换,该类用高级界面中的

23、软键来实现游戏菜单,在不同的手机上,软键可能有不同的分布。FIRMIDlet类的UML图如图4.1.2(1)所示,主界面如图4.1.2(2)与4.1.2(3)所示。图5.1.2 FIRMIDlet类的UML图 图5.1.2 (2) 初屏 图5.1.2 (3) 按下菜单后的屏幕5.1.3 FIRMIDlet类代码片断/构建主屏表单public FIRMIDlet() display=Display.getDisplay(this); form=new Form(null); try imgSplash=Image.createImage(/theme.png);/加载屏幕图片 catch(IOE

24、xception e) imgSplash=Image.createImage(1, 1); form.append(imgSplash); CMD_EXIT=new Command(退出,7,1); /创建退出软键 CMD_GO=new Command(开局,4,2); /创建开局软键 CMD_OPTION=new Command(设置,1,3);/创建设置软键 CMD_ABOUT=new Command(关于,5,3);/创建关于软键 form.addCommand(CMD_EXIT); /将退出软键添加到主表单 form.addCommand(CMD_GO); /将开局软键添加到主表单

25、form.addCommand(CMD_OPTION); /将设置软键添加到主表单 form.addCommand(CMD_ABOUT); /将关于软键添加到主表单 form.setCommandListener(this); /监听主表单软键事件 myCanvas=new FIRCanvas(this); /创建画布 options=new Options(this); /创建设置表单 about=new About(this); /创建关于表单5.2 游戏介绍表单的实现 About是游戏介绍表单类,主要是向玩家阐述五子棋的一些信息。其UML图如4.2(1)所示,游戏截图如4.2(2)所示。

26、图5.2(1) About类的UML图图5.2(2) 关于表单界面5.3 游戏设置表单的实现游戏设置表单Option类用来对游戏的参数进行设置,包括棋盘大小,游戏难度,是否先手,过程中使用了Gauge和ChoiceGroup两种高级用户界面组件。5.3.1 Gauge与ChoiceGroup组件介绍Gauge组件实现了一个图形标尺,通常被用来表示一个过程的进展情况或者一些系列数字的选择情况。Gauge的构造方法根据指定的标签、交互模式、最大值、初始值生成一个新的Gauge对象,原型如下:Gauge(String label,Boolean interactive,int maxValue,in

27、t initialValue)l Gauge构造方法有4个参数:label、interactive、maxValue、initialValuel 参数label用作label对象的标签,设置为null表示标签为空l 参数interactive是一个boolean变量,表示这个Gauge对象的交互模式,设置为true表示交互模式,即用户可以改变Gauge对象的值:如果设置为flase,则表示非交互模式,即用户不可以改变Gauge的值。l 参数maxValue是一个大于0的整数,表示Gauge对象的最大值(Gauge值的范围为0,maxValue)。这个值必须大于0,否则会抛出IllegaArgu

28、mentException。l 参数initialValue是一个整数值,表示Gauge对象的初始值,它的范围是0,maxValue。如果initialValue小于0,则Gauge对象的初始值被设置为0;如果initialValue大于maxValue,则被设置为maxValue。ChoiceGroup组件用来构造选择框,棋构造方法如下:ChoiceGroup(String label,int choiceType)该构造方法有两个参数,其中参数label用来设置此选项组的标签。Label可以设置为null,表示此Item对象的标签为空白。构造完成后,还可以使用setLabel方法和getL

29、abel方法来分别设置和获取对象的标签。参数choiceType用来设置ChoiceGroup的类型,ChoiceGroup类继承了Choise接口的三种类型:l EXCLUSIVE,值为1,一次只有一个元素被选择。l MULTIPLE,值为2,一次可以有多个元素被选择。l IMPLICIT,值为3,类似软键菜单或者按钮,当被选择时,立即触发Command事件。l POPUP,值为4,弹出式菜单,当被选择时,弹出选项。5.3.2 Option类设计该类实现游戏参数的设置,其UML图如图4.3.2(1)所示,游戏截图如4.3.2(2)所示。图5.3.2 (1) Option类的UML图图5.3.

30、2 (2) 设置表单界面5.3.3 Option类代码片断/保存记录的方法public void saveOptions() try RecordStore rs=RecordStore.openRecordStore(Options, true);/打开记录,如果没有则创建 byte bs=new byte3; bs0=(byte)boardSize; /棋盘大小 bs1=(byte)(isComputerFirst?1:0); /先手 bs2=(byte)degree; /难度 if(rs.getNumRecords()0) /如果有记录则ID为1的记录内容为当前参数 rs.setReco

31、rd(1,bs,0,3); else rs.addRecord(bs,0,3); /如果不存在记录,则添加新记录,内容为当前的参数 rs.closeRecordStore(); /关闭记录 catch(RecordStoreException e) 5.4 棋子Dot类的实现Dot类代表了现实中的棋子,该类主要和于记录棋子的位置和检查落子的合法性(是否越界)。五子棋是一个二维棋类游戏,所以首先想到的是定义一个Dot类来表示棋子。考虑到移动设备的资源有限,以及尽可能减少系统资源占用,程序不在下每一步棋时生成一个对象,而是在游戏进行时,玩家或者计算机每下一步棋,在数组相应位置生成该棋子的对象,而将

32、已经下过的棋子保存到数组中随时检索,这样可以避免过多的棋子对象占用系统内存。Dot类的UML图如4.4所示。图5.4 Dot类的UML图5.5 对战逻辑FIRlogic类的实现FIRLogic类是整个游戏的逻辑类,包含了人工智能算法,这些算法主要体现在对各种棋型的检测并计算一个最佳的落子点。除此之外,该类还处理双方落子功能和悔棋功能,判断是否游戏结束,谁是胜利者。5.5.1 落子与悔棋当对战某一方在棋盘上落子时,就将棋盘数组的相应位置设置为该方代码(计算机方为1,玩家方为2)。双方落子后,程序人使用一个Dot类棋子对象来记录最后一步棋的位置,当玩家下了一步棋后需要将上一步重新绘制,以消除棋子上

33、的引导框。此外,还使用堆栈来存储最近的10步棋,以便玩家悔棋。为了实现悔棋功能,该程序采用了堆栈来存储最近的棋子,当玩家取用悔棋功能时,程序就会将堆栈里的头两步棋的对象移出,这时本来位于第三的棋子对象就变成了栈顶,然后将栈顶的棋子设置为最后一步,并重新绘制棋盘。5.5.2 棋型检测的实现connectedIn1D方法用于检测棋盘上任意一点在指定方向上的同类棋子相连个数,传入落子方标志(区分计算机还是玩家)、检测位置的行列坐标和检测方向,返回在该方向上相连棋子的个数,若检测到对方棋子或者空白棋面则停止检测。connectedIn8D方法是基于connectedIn1D方法的一个升级方法,是对8个

34、方向都进行检测,最终返回一个整型的数组,后面用cdi表示。expandedIn1D方法跟connectedIn1D方法相似,不同的是expandedIn1D方法是检测自己棋子以及空白棋子(最多连续四空白点)的个数,当遇上敌方棋子,棋子边缘或连续5点空白棋子,则停止检测。expandedIn8D方法是基于expandedIn1D方法的一个升级方法,是对8个方向都进行检测,最终返回一个整型的数组,后面用edi表示。设计好connectedIn8D和expandedIn8D方法后,即可轻松地检测棋型。当执行connectedIn8D方法得到一个等于5的值时,则检测到五子连株的棋型,这时游戏结束,通过

35、连株的落子代码可以判断出谁是赢家。“活四”是五子棋中常见的棋型,在下棋的过程中经常遇到,有两个点能形成“连五”的四就是活四。观察“活四”的棋型,可以发现,如果在某点落子能形成该棋型,那么加上自身落子,同类棋子的连续数目将大于等于4(事实上,大于4的情况已经被“连五”运算检测出),并且两端留有空白区域,即(edicdi&edi+4cdi+4)。只有一个点可以形成“连五”的四叫做“冲四”,也叫做“单四” 。已方再落一子便能成为“活四”的三叫做“活三” ,分为“连活三”和“跳活三”两种情况。“双四” 、“四三”与“双三” ,其检测原理为:在某一空白点,如果落下已方的棋子,并且在不同方向分别检测出“冲

36、四”或者“活三” ,那么判断为存在“双四” 、“四三”或“双三”情况。该程序是通过棋型检测来作出最佳的落子点,棋型检测顺序为:已方是否存在“五连” ,敌方是否存在“五连” ,已方是否存在“活四” ,敌方是否存在“活四” ,已方是否存在“双四” ,敌方是否存在“双四” ,已方是否存在“四三” ,敌方是否存在“四三” ,已方是否存“双三” ,敌方是否存在“双三” ,已方是否存在“活三” ,敌方是否存在“活三” 。按上述顺序对局势进行检测,若检测出相应的棋型就在该点落子。如果不存在任何棋型,就遵从评分的方式来落子。棋规则是:计算指定位置在某个方向上的得分,从指定位置向某个方向逐步移动,在移动过程中发

37、现已方棋了,得分权重为5;若发现敌方棋子,得分权重为3;若发现空白点,得分权重为1。该位置的得分还与移动的步长有关,离出发位置越远其影响力越小,步长的计算公式为:gain=(boardSize-step)/2,其中boardSize为棋盘的大小,step为步长值。最后得分最高的点为最佳点,则在该点落子。 下面是FIRlogic类的UML图。图5.5.1FIRlogic类的UML图5.5.3 FIRlogic类代码片断/检测连续棋子数目的方法private int connectedIn1D(int player,int row,int col,int direction) int n=0; D

38、ot d=new Dot(row,col); /在当前位置创建棋子 do d.copyFrom(moveOneStep(d,direction); /返回在指定方向上移动后的棋子 if(d.isInBoard(boardSize) & tabled.rowd.col=player) /移动后依然在棋盘上有同类的棋子 n+; /计数器加1 else return n; while(true);/检测连续棋子与空白点(最多连续4点)数目的方法private int expandedIn1D(int player,int row,int col,int direction) int n=0; /检测

39、计数器 int c=0; /循环记数器 Dot d=new Dot(row,col); /在当前位置创建棋子 while(c4) d.copyFrom(moveOneStep(d,direction); /返回在指定方向上移动后的棋子 if(!d.isInBoard(boardSize) /如果超出棋盘则终止检测 break; int p=tabled.rowd.col; /获取棋盘在该位置的状态 if(p=0) /如果移动后的位置是空白 c+; /循环记数器就加1 if(p!=player&p!=0) /如果遇见对手棋子,则停止检测 break; n+; return n; 5.6 游戏画布

40、游戏画布是人机对战的交互界面。5.6.1 Canvas类介绍Canvas类的主要功能在于对低层用户事件的处理,包括按键事件和指针事件,它负责监听这些事件,并做出相应的处理。除此之外,Canvas类还定义了屏幕属性、全屏的运行模式以及后台运行的功能,其主要方法如表4.6.1。表5.6.1 Canvas类主要方法方法名称返回值类型参数类型含义说明getGameActionintint获得与游戏键相关的键码getKeyCodeintint获得键码keyPressedvoidint按键被按下所触发的方法keyReleassedvoidint按键被释放时所触发的方法keyRepeatedvoidint按

41、键被重复按下时所触发的方法painvoidGraphics绘制屏幕的方法Canvas类是Displayable类的子类,使用setCurrent方法,将Canvas类的实例设置为当前的屏幕。因为Canvas类本身并不提供具体绘制屏幕的过程,它需要依靠一个抽象的方法向系统提供一个绘制屏幕的过程,这个方法就是pain,它具体定义了图形绘制的过程。由此可以Canvas类只是屏幕绘制的一个中介,Graphic类完成了绘制的过程。5.6.2 FIRCanvas类实现FIRCanvas类继承了Canvas类,负责游戏界面的绘制,包括棋盘、棋子和状态提示。该类主要负责获取用户输入,根据屏幕大小计算棋盘,绘制

42、屏幕等。绘制方法:首先是绘制棋盘,在绘制区域用底色填充,然后逐条绘制行和列线条。根据是否计算机先行设置计算机和玩家的颜色,确保先手的棋子为黑色。根据getTable返回的数组绘制棋盘的棋子,并在最后一步棋的位置绘制引导框。其UML图和游戏截图如下:图5.6.2 (1)FIRCanvas类的UML图 图5.6.2 (2) 游戏截图5.6.3 用户输入游戏支持键盘输入和指针输入。当游戏并未结束且计算机方不在思考当中时,玩家可以选择空白处落子。落子后,首先将上一步棋子重新绘制,消除引导框。引导框将跟随玩家的方向移动,当按下确认键后,则调用落子方法,进行玩家落子。按键输入表如下:表5.6.3用户输入表

43、按键作用LEFT或按键4左移RIGHT或按键6右移UP或按键2上移DOWN或按键8下移FIRE或按键5确认用户输入代码:protected void keyPressed(int keyCode) if(!logic.isGameOver&!logic.isThinking) int bs=boardSize; Dot lastDot=logic.lastDot(); int r=lastDot.row; int c=lastDot.col; repaintAt(r,c); int input=getGameAction(keyCode); /将键盘码转化为游戏动作 if(input=Canv

44、as.LEFT|keyCode=52) /用户按下左键 if(-cbs-1) /列加1 c=0; lastDot.setRowCol(r, c); repaintAt(r,c); else if(input=Canvas.UP|keyCode=50) /用户按下上键 if(-rbs-1) /行加1 r=0; lastDot.setRowCol(r, c); repaintAt(r,c); else if(input=Canvas.FIRE|keyCode=53) /用户按下确定键 logic.manGo(r, c); /玩家落子 6. 结束语基于J2ME 技术,设计并开发了一款嵌入式棋牌类手机

45、游戏,最终整套游戏以人机对战方式完成,先达到五子连株者为赢家。游戏上能设置棋盘大小,范围是10x10至20x20,内设“初阶” 、“中阶” 、“高阶”三个难度,提供先手选择。较为强大的人工智能,游戏具有一定的可玩性。- 26 -参考文献1 Klimmt Christoph, Hefner Dorothe, Vorderer Peter. The Video Game Experience as “True” Identification: A Theory of Enjoyable Alterations of Players Self-Perception J. Communication

46、Theory, 2009, 19(4): 351-373.2 Kuan-Ta Chen, Polly Huang, Chin-Laung Lei. Effect of Network Quality on Player Departure Behavior in Online GamesJ. IEEE Transactions on Parallel and Distributed Systems. 2009, 20(5): 593-606.3 Patrick TullmannJanos. A Java-oriented OS for Active Network M .University

47、of Utah, 2001.4 王昊, 邓达平. 手机游戏的可视化开发环境Djomeg的设计与实现J. 计算机与现代化.2009(11). 96-99.5 庞国明. 智能设备基于J2ME平台的3D开发技术J. 电脑编程技巧与维护.2009(21). 68-72.6 宋敦波,卢如海. VoIP体系在移动设备上的Java实现J. 实验科学与技术.2009(5). 63-65.7 杨冬武. 基于J2ME的移动话费查询系统的研究与开发J. 邮电设计技术.2009(9). 29-32.8 王昌龙,纪全艳. 基于J2ME记录管理器的索引与缓存技术J. 计算机时代.2009(10). 42-43.9 范财友

48、,李治洪. 基于J2MEMobileSVG的移动地理信息服务客户端技术研究J. 计算机应用与软件.2009, 26(9). 146-148,152.10 李明江. 基于J2ME的手机游戏优化探讨J. 科学咨询.2009(21). 59-59.11 臧海峰. 基于多平台的移动终端网络应用研究J. 科技信息.2009(24). 357-357.12 邓珍荣,张敬伟. 基于J2ME手机游戏设计及实现J. 计算机与现代化.2009(9). 122-124.13 康晓宇,罗元兵. J2ME游戏设计框架改进模型J. 民营科技.2009(9). 20-20,93.14 杨丽萍,王薇. 基于手机平台的教学信息

49、系统的研发J. 长春大学学报.2009,19(8). 15-17.15 李静, 许建. 浅析J2EE应用的快速原型开发J. 开封大学学报.2009,(3). 79-81.16 施铮. J2ME无线移动游戏开发M. 人民邮电出版社. 2006(5). 14-15.17 詹建飞. J2ME 应用程序开发- 手机、PDA 程序开发捷径M . 中国铁道出版社. 2002(6). 22-24.18 郝玉龙,李向前. J2ME 移动应用开发M . 清华大学出版社. 2006(7).3-4.19 卢军. J2ME 应用程序开发- 手机、PDA 程序开发捷径M . 中国铁道出版社. 2002(11). 23-25.

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!