首页 手机博弈游戏五子棋

手机博弈游戏五子棋

举报
开通vip

手机博弈游戏五子棋手机博弈游戏五子棋 本科毕业论文(设计) 题目: 手机博弈游戏五子棋 (小组开发) 姓 名: 学号: 院(系): 信息工程学院 专业: 软件工程 指导教师: 职称: 评 阅 人: 职称: 月 摘 要 J2ME(Java 2 Micro Edition) 是近年来随着各种不同设备,尤其是移动通信设备的飞速发展而 诞生的一项新的开发技术。它定位在消费性电子产品的应用上,对设备的智能化、多样化, 提供了革命性的解决方案,并因其“Write Once, run anywhere”的Java特性而提高开发的...

手机博弈游戏五子棋
手机博弈游戏五子棋 本科毕业论文(设计) 题目: 手机博弈游戏五子棋 (小组开发) 姓 名: 学号: 院(系): 信息 工程 路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理 学院 专业: 软件工程 指导教师: 职称: 评 阅 人: 职称: 月 摘 要 J2ME(Java 2 Micro Edition) 是近年来随着各种不同设备,尤其是移动通信设备的飞速发展而 诞生的一项新的开发技术。它定位在消费性电子产品的应用上,对设备的智能化、多样化, 提供了革命性的解决方案,并因其“Write Once, run anywhere”的Java特性而提高开发的效率。 随着手机的日益普及、Java功能在移动设备上的实现,Java应用程序产生的手机增值服 务逐渐体现出其影响力,对丰富人们的生活 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 、提供快捷的资讯起着不可忽视的作用。特 别是手机性能的逐渐增强,手机作为一个游戏平台越来越成熟了。本论文着眼于J2ME技术 的应用,开发一款可用的手机游戏程序——五子棋。 本论文介绍了J2ME的相关技术及本程序的结构分析和具体功能的实现。 关键词:J2ME;手机游戏;五子棋 Abstract J2ME is a kind of fast developing technology implemented on various devices especially mobile communication equipments. It focuses on application for consumptive electronic products, providing revolutionary solution to the intelligentization and diversification of the equipment. It improve the efficiency of the development process thanks to its “Write Once, run anywhere” nature. When mobile phone is getting ever more popular nowadays, with the implementation of Java technology on mobile equipment, increment of capital on communication service exhibits its force on people’s everyday life, providing them ever fast information just in hand. Mobile phone whose capability is greater is more and more mature for game. This dissertation focuses on implementation of J2ME technology and has developed a commercial game suite run on mobile phones—Goba ng. This dissertation introduces J2ME and its relative technology as well as this program’s structure a nd analysis of implementation in details. Keywords: J2ME; mobile game; Gobang 目 录 第一章 背景 ................................................................................................. 错误~未定义书签。1 ?1.1 手机业发展情况 ......................................................................... 错误~未定义书签。1 ?1.2 JAVA手机的优点 ........................................................................ 错误~未定义书签。1 ?1.3 手机游戏技术…………………………………………………………………………. 第二章 J2ME综述 ........................................................................................ 错误~未定义书签。2 ?2.1 J2ME简介 .................................................................................... 错误~未定义书签。2 ?2.2 J2ME的相关特性 ........................................................................ 错误~未定义书签。2 2.2.1 Configuration简介 ........................................................ 错误~未定义书签。2 2.2.2 Profile简介……………………………………………………………………. 第三章 需求分析 ......................................................................................... 错误~未定义书签。3 ?3.1 基本需求分析 ............................................................................. 错误~未定义书签。3 ?3.2 游戏玩法及规则 ......................................................................... 错误~未定义书签。3 ?3.3 游戏设计分析 ............................................................................. 错误~未定义书签。3 第四章 程序分析和具体实现 ..................................................................... 错误~未定义书签。4 ?4.1 软件总体框架图 ......................................................................... 错误~未定义书签。4 ?4.2 进入游戏前的选项 ..................................................................... 错误~未定义书签。4 ?4.3 游戏的核心类及其逻辑的实现 ................................................. 错误~未定义书签。4 ?4.4 游戏画布类FIRCanvas类的实现……………………………………………………. 致 谢 ............................................................................................................................................ 24 参考文献......................................................................................................................................... 24 第一章 背景 ?1.1手机业的情况 2007年全球共销售了大约11.5亿部手机,手机市场主要靠非洲和亚洲手机销量上升拉动,欧洲的手机销量保持稳定。2007年中国的手机年销售量达到1.9亿部,手机的普及率是39%,拥有5.25亿用户。中国在手机生产制造领域的优势不断加强,手机在中国自身的信息技术市场扮演的角色也越来越重要。 经过五年的规模化发展,中国手机市场已进入成熟期, 2007年销量将达1.5亿部,同比增长23.1%;销售额将达1661亿元,受低端手机份额扩大的影响,销售额同比下降0.3%。2007年,诺基亚生产了4亿3710万手机,三星生产了1亿6120万部手机,摩托罗拉生产了1亿5900万,紧挨着的是索尼爱立信,生产了1亿340万部手机,而且LG生产了8050万。其他公司生产了1亿8430万部手机,所有的公司将总共出售12亿4千万部手机。 2007年,各大手机厂商采用不同策略推动市场发展,导致品牌竞争激烈。诺基亚推动娱乐市场战略并涉足互联网服务领域;索尼爱立信弥补智能手机软肋;三星放下架子攻低端;摩托罗拉发展受阻,其他国外品牌如LG、飞利浦等表现不佳。多普达锋芒毕露,其他国产品牌在生死线上挣扎。手机市场再现黑马,苹果高调入市,魅族、纽曼先后进入手机市场。 预计到2011年,全球市场售出的手机中有四分之一的产品将是超低价手机。未来五年,印度将是超低价手机的最大市场,其超低价手机年销量将从2006年的900万部增加到2011年的1.16亿部。 ?1.2 JAVA手机的优点 Java手机软件平台采用的基本Java平台是CLDC (Connected Limited Device Configuration) 和MIDP (Mobile Information Device Profile),是J2ME (Java 2 Micro Edition)的一部分,在中国一般称为“无线Java”技术。此前,有人把它叫做“K-Java”;其实,K-Java的叫法只是Sun公司在开发KVM Java虚拟机时的项目代号,在该技术被正式命名为KVM后,就不再用K-Java了。 KJava即J2ME(Java 2 Micro Edition),是Sun公司专门用于嵌入式设备的Java软件。以KJava编程语言为手机开发应用程序,可以为手机用户提供游戏、个人信息处理、电子地图、股票等服务程序。J2ME(Java 2 Micro Edition)是致力于消费产品和嵌入式设备的最佳解决方案。J2ME在设计其规格的时候,遵循着“对于各种不同的装置而造出一个单一的开发系统是没有意义的事”这个基本原则。于是J2ME先将所有的嵌入式装置大体上区分为两种:一种是运算功能有限、电力供应也有限的嵌入式装置(比方说PDA、手机);另外一种是运算能力相对较佳、并且在电力供应上相对比较充足的嵌入式装置(比方说冷气机、电冰箱)。因为这两种区分,所以Java引入了一个叫做Configuration的概念,然后把上述运算功能有限、电力有限的嵌入式装置定义在Connected Limited Device Configuration(CLDC)规格之中;而 另外一种装置则规范为Connected Device Configuration(CDC)规格。也就是说,J2ME先把所有的嵌入式装置利用Configuration的概念区隔成两种抽象的型态。 Java技术的开放性、安全性和庞大的社会已有资源,以及其跨平台性,即“编写一次,到处运行”的特点,使Java技术成为智能手机软件平台的事实 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 。采用Java技术后,编写应用程序和提供服务的人就不必关心接受其服务的手机采用的是什么操作系统和芯片,只要按照Java的要求去写程序就好了;同样,生产手机的厂商也不必顾虑将来谁来提供增值服务。可以看出,采用Java技术,可以建立完整、高效的无线数据增值服务产业链,从而为用户提供灵活、个性化、内容方式多样的服务。 ?1.3Java手机发展现状 到今年6月,全世界已经有大约1亿部Java手机在使用,除中国大陆外共有53个移动运行商正式推出了基于Java技术的无线数据增值服务。中国移动通信集团已经建立了无线Java增值服务体系,并推出了“百宝箱”等服务品牌,包括游戏百宝箱、娱乐百宝箱、商务百宝箱、生活百宝箱等,已经于2003年7月10日开始正式商用。 手机游戏技术 手机游戏开发一般都是开放式的开发平台,例如流行的开发平台,如J2ME。开发人员 能够从网络方便的得到相应的开发资料,不论你的资金实力如何,只要你有兴趣,就能够迈 入这个新兴的行业。 而相关的厂商,例如通信设备厂家对于手机游戏开发秉承一种开发的态度,鼓励开发者 在手机设备上开发游戏,通常都在网络中提供了自己手机的技术资料。 下文对目前市面上流行的手机游戏平台做一个简单的介绍。 ?嵌入/内置式游戏 早期的手机功能简单、屏幕也仅仅是单色,手机厂商能做的,就是在手机内置一些简单的游戏。这些游戏都是厂商以自己的专属平台所开发的,这些发售时就内置的游戏在手机预存了多少就是多少,用户无法自己新增或删除。 ?In-Fusio ExEn娱乐平台 即使是手机屏幕变成了彩色,内置游戏如何好玩,但总而也有玩腻的时候。因此用户们也希望能够玩新的游戏或者象下载图片、铃声那样通过无线网络下载新的游戏。法国In-Fusio公司看中了这个市场,在2001年推出了ExEn(Execution Engine)游戏平台。通过把专属的ExEn芯片加入手机内,赋予手机彩色画面与流畅的执行速度,让手机也有掌上游戏机那样的效果 ?J2ME平台 J2ME(Java 2 Micro Edition)平台是目前最火暴的手机游戏平台,尽管它还可以下载和安装一些小的应用程序。J2ME简单的可以理解为Java的移动版本,其MIDP(Mobile Information Device Profile,移动信息装置简表)架构就是专门为手机与PDA而设计。 目前MIDP有1.0和2.0之分,后者在兼容性以及游戏的多媒体表现力如音效和振动方面有更好的效果,此外通过测试软件显示,支持MIDP2.0的JAVA游戏在图形运行能力对比1.0版本也有更优秀的表现。 由于J2ME的技术先进,而且又能跨平台运行,因此受到了众多手机厂家的支持,甚至成为现在用户购买手机的一项比较重要的技术指标。所以到目前为止,手机的游戏应用平台中,以支持J2ME的最多,而且J2ME软件开发商也有越来越多的趋势,J2ME已成为2002年下半年之后的行动游戏平台主流。 ?Synergenix Mophun平台 Mophun是瑞典Synergenix公司于2002年开发出的全新移动游戏娱乐平台。Mophun的发音类似More Fun,主要就是针对游戏平台而设计的游戏语言,采用C程序代码来开发游戏,运行起来最稳定,速度上也比Java VM快许多倍(厂商宣称快100倍),可发挥出手机硬件的极限。同时,mophun 游戏平台能在极其有限的硬件资源上运作,其最低硬件需求是以12MHz运行的8位处理器,因而适用于现有的2G手机。 由于Mophun的API功能齐全,加上是采用本地代码,运行速度快的优势显而易见,这点对于支持Mophun和Java双游戏平台的索爱手机尤其明显。通常情况下排除其他因素,索爱手机在运行Mophun游戏时速度远远超过手机的Java游戏运行时的速度。另外,Mophun游戏在一次下载后就不须再付费(这点跟ExEn的理念一样),同时 Mophun还具备安全机制(防盗版),主游戏程序无法从手机中拷出,只提供游戏存盘转存到电脑中。 Mophun 游戏平台因为具备在极其有限的硬件资源上运行高效性能,可说是目前手机最佳的游戏平台之一。 ?BREW游戏平台 BREW是无线二进制运行环境(Binary Runtime Environment for Wireless)的缩写。是高通公司2001年推出的基于CDMA网络的一个增值业务开发运行的基本平台。相对Java,BREW是一个更底层的技术。严格的说游戏仅仅是BREW的一部分内容而已。 BREW提供的功能环境就好像PC机上的操作系统一样,可以通过服务提供商下载指定类型的应用程序或游戏来使用。对于支持BREW的手机终端,在手机出厂时已经预安装了两个应用。分别为应用管理器(Application Manager)和移动商店(MobileShop)。 ?未来手机游戏趋势 未来的手机游戏平台因为ATI和nVIDIA两大PC显示芯片厂商专业级水准的加入而更为热闹。在ATI推出手机和PDA手机3D多媒体芯片(包含专用的媒体处理器Media Processor及3D加速器3D Accelerator)后,老对头NVIDA也毫不示弱,公布了他们的3D多媒体芯片,并且应用于三菱和神达MiTAC的智能手机上。这些芯片在植入手机后能够有效的提升图形显示性能,使手机在进行多媒体演示和游戏时更够有出色显示效果。 不过这些厂家提供的都是硬件芯片,要完全发挥其在3D图形的表现能力还需要相应支持的API才能相辅相成,而目前主要的API包括2003年7月发表的OpenGL ES(OpenGL for Embedded Systems),就是OpenGL的嵌入式版本,是为嵌入系统而开发的小型标准三维(3D)图形应用编程接口(API),并受到那些意图将3D游戏引入移动设备的游戏开发商、手机厂商、 游戏引擎供应商和3D图形芯片公司的热烈追捧。目前已知NVIDIA AR10与ATI Imageon 23xx 3D芯片,已符合OpenGL ES 1.0的标准。而最新Symbian OS 8.0版本也将支援OpenGL ES API。相信不久后,手机上也能玩像是CS、DOOM、Quake的FPS游戏了。 第二章J2ME综述 ?2.1J2ME简介 J2ME即JAVA 2 Micro Edition,它是Java 2的组成部分,与J2SE、J2EE并称。J2ME是一种高度优化的Java运行环境,应用于大量的消费类电子设备,如Cellular Phones(蜂窝电话)、Screen Phones(可视电话)、Digital Set-top Boxes(数字机顶盒)、Car Navigation Systems(汽车导向系统)等,同时也广泛被移动通信设备所采用,如移动电话、双向寻呼机、智能卡、个人电脑记事本(Personal Organizer)和掌上电脑(Palmtop)等。J2ME技术将Java语言的与平台无关的特性移植到小型电子设备上,允许移动无线设备之间共享应用程序。J2ME 使用配置和简表定制 Java 运行时环境 (JRE)。作为一个完整的 JRE,J2ME 由配置和简表组成,配置决定了使用的 JVM,而简表通过添加特定于域的类来定义应用程序。 与以前 Sun 公司推出的J2EE (Java 2 Enterprise Edition,Java 2企业版)、J2SE (Java 2 Standard Edition,Java 2标准版)规范相比,J2ME 不是一个单独的技术规范,而是一系列技术规范总称。这些规范定义了 Java 技术在资源限制的设备中的表现形式。J2ME 主要适用于小型嵌入式设备,这些设备与PC或是服务器设备相比没有统一的硬件标准、外观与操作方式,其功用也是千差万别。但是J2ME 在适用于这些设备的同时也保留了 Java 的传统特性,即任何时间和任何地点的代码具有可移植性、部署灵活性、安全的网络传输性,以及代码稳定性。正是因为如此,开发人员才可以借助J2ME 力量让编写的程序能够运行在其他型号或厂商的设备上。 ?2.2 J2ME的相关特性 2.2.1 Configuration简介 J2ME 在设计其规格的时候,遵循着「对于各种不同的装置而造出一个单一的开发系统是没有意义的事」这个基本原则。于是 J2ME 先将所有的嵌入式装置大体上区分为两种 :一种是运算功能有限、电力供应也有限的嵌入式装置(比方说PDA 、手机);另外一种则是运算能力相对较佳、并请在电力供应上相对比较充足的嵌入式装置 (比方说冷气机、电冰箱、电视机上盒 (set-top box))。因为这两种型态的嵌入式装置,所以Java 引入了一个叫做Configuration 的概念,然后把上述运算功能有限、电力有限的嵌入式装置定义在Connected Limited Device Configuration(CLDC)规格之中;而另外一种装置则规范为 Connected Device Configuration(CDC)规格。也就是说, J2ME 先把所有的嵌入式装置利用Configuration 的 概念区隔成两种抽象的型态。 其实在这里大家可以把Configuration 当作是J2ME 对於两种类型嵌入式装置的规格,而这些规格之中定义了这些装置至少要符合的运算能力、供电能力、记忆体大小等规范,同时也定了一组在这些装置上执行的 Java 程序所能使用的类别函式库、这些规范之中所定义的类别函式库为 Java 标准核心类别函式库的子集合以及与该型态装置特性相符的扩充类别函式库。比方就CLDC 的规范来说,可以支援的核心类别函式库为java.lang.* 、java.io.*、java.util.*,而支援的扩充类别函式库为java.microedition.io.*。区分出两种主要的Configuration 之後,J2ME 接著在定义出Profile的概念。Profile 是架构在Configuration 之上的规格。之所以有Profile的概念,是为了要更明确地区分出各种嵌入式装置上Java 程序该如何开发以及它们应该具有哪些功能。因此Profile 之中定义了与特定嵌入式装置非常相关的扩充类别函式库,而 Java 程序在各种嵌入式装置上的使用者介面该如何呈现就是定义在Profile 里头。Profile 之中所定义的扩充类别函式库是根据底层Configuration 内所定义 。 的核心类别函式库所建立 2.2.2 Profile简介 Profile是建立在某个configuration之上的特定API集合。一个configuration只定义虚拟机和基本的API集合,不定义建立应用程序的细节。因此Profiles往往包括应用程序生命周期的API,用户界面API以及存储API。一个Profile既可直接建立在Configuration上,也可建立在另一个Profile之上。 为了在不改动Profile的前提下增加设备的功能,在Profile之外又提出了可选包,可将它们看成Profile的扩展,每个可选包对某个或某些profiles增加特定的功能。当对某个profile需要增加一个新的API时首先将它定义为可选包。如果随着时间的推移该可选包被广泛采用,它则可能成为某个或某些profiles的一部分。某些厂家特定的API与可选包起相似功能。 J2ME的这种结构很好的适应了嵌入设备的巨大多样性。从低到高,您可根据设备的情况可采用不同的configuration,在同一configuration中您又可根据设备的用途选用不同的Profile,在您的设备中您还可采用多个Profile,如果您还嫌功能不够,尚有可选包可用。 J2ME中第一个正式发布的Profile是MIDP,而且随后比较长的时间内未有其它Profile发布,以至有人把MIDP等同于J2ME了,有人把WTK等同于J2ME SDK(由于J2ME包含的范围很广,所以不太可能有厂商推出能支持各种Profile的开发工具)。MIDP只是J2ME中的一员,我们来看看到写本文为止有哪些Profile。由于每个Profile是建立在特定的Configuration之上的,所以我们在Profile后注明其基于的Configuration。目前已有的基于CLDC的Profile有MIDP,基于CDC的Profile有FP、PBP。 第三章 需求分析 ?3.1 基本需求分析 手机屏幕尺寸分为物理尺寸和显示分辨率两个概念。物理尺寸是指屏幕的实际大小。大的屏幕同时,要配备高分辨率,也就是在这个尺寸下可以显示多少个像素,显示的像素越多,可以表现的余地自然越大。现在手机行业发展迅速,不同大小屏幕的手机迅速发展,鉴于不同手机屏幕尺寸不同,我们在设计游戏的时候有一下一些要求: 一 软件的界面简洁明了,操作简单容易。受手机屏幕大小和显示的影响,我们设计的软件界面必须是简洁的;手机键盘的不方便,游戏需要设计得易操作。 二 软件具有人工智能算法原理要简单,并且运行快速。游戏是需要快速反应的。手机处理器的频率直接要求我们需要使用简单实用的智能算法。 三 游戏要设置几个难度,便于不同玩家选择.玩家的游戏水平不一样,我们设置不同难度供各个水平的玩家选择。 四 游戏棋盘的大小要灵活,根据不同手机屏幕可以调节。 ?3.2 游戏玩法及规则 现代五子棋专用棋盘为十五路(15X15),共225个交叉点。棋盘正中一点为天元。 对局开始时,先由执黑棋一方将一枚棋子落在天元点上,然后由执白棋一方在黑棋 周围的交叉点上落子。但是,为了尊重对方和礼貌起见,持白棋的一方通常将盘面的第 二着棋布在自己河界的一侧,即直止或斜止。此后黑白双方轮流落子,直到某一方首先 在棋盘的横线、纵线或斜线上形成连续五子或五子以上〔仅对白棋而言〕,则该方就算 获胜 。连珠五子棋的一个特点是先行的一方优势很大,因此在职业比赛中对黑方做了种种 限制,以利公平竞争。五子棋的比赛规则如下: 〖1〗 黑先、白后,从天元开始相互顺序落子; 〖2〗 最先在棋盘横向、纵向或斜向形成连续的同色五个棋子的一方为胜; 〖3〗 黑棋禁手判负、白棋无禁手。黑棋禁手有“三、三”、“四、四”和“长连”, 包括“四、三、三”和“四、四、三”。黑棋只能以“四、三”取胜; 〖4〗 如分不出胜负,则到为平局; 〖5〗 五连与禁手同时形成,判胜; 〖6〗 黑方禁手形成时,白方应立即指出。若白方未发现或发现后不立即指出,反而 继续落子,则禁手失效,不再判黑方负。 在本游戏中,没有采用职业比赛的规则,直接采用明间规则,一人一手棋,先成5为胜。另外,我们把游戏棋盘设置为可以调节大小,设置游戏难度以便适用不同手机。 第四章 游戏设计分析 ?4.1软键总体框架图 4.1.1 驱动循环及类图 时间驱动的游戏循环: 开始 玩家落子 判断落子等待用户输入 合法性 判断游戏结束 是否结束 计算机落子 判断游戏是否结束 棋类游戏通常具备两个重要特性,首先是对战双方轮流落子,其次是落子间隔通常是不确定的,尤其是对战后期,可能每一步都需要经过深思熟虑,无论是人方还是计算机方,都无法对间隔时间有事先的预期。 基于以上两个特性,本游戏摒弃了大多游戏采用的线程或者定时器驱动游戏的方法,而采用了事件驱动方法,即玩家的键盘或触摸笔出发游戏的下一步动作。 事件驱动大大减少了不必要的工作量。 软件的类结构: Canvas MIDlet FIRCanvas FIRMIDlet About Options FIRLogic Dot 整个游戏由6个类组成。游戏的FIRMIDlet类负责保持display对象,并且提供各屏幕之间的切换。整个程序包含4个屏幕:游戏主屏幕表单,实际玩家经行游戏的FIRCanvas。提供某些关于游戏选项的Options表单,以及一个用来显示相关信息的About表单。此外,Dot类和FIRLogic类是分别用来构造游戏棋子和算法逻辑的。 4.1.1程序的分析与具体实现 进入游戏前的选择画面 游戏前我们要选择游戏棋盘的大小以及游戏难度, 游戏的流程: 游戏启动时,FIRMIDlet对象先显示游戏主屏幕,在屏幕下方一侧是退出软键,另一侧是软键构成的菜单,菜单元素主要由“设置”,“开局”和“关于”选项。当玩家选择“设置”软键时,则是游戏参数设置表单;当玩家选择“开局”软键时,则是游戏队长主对面;当玩家选择“关于”软键时,则是游戏介绍表单。 玩家进入游戏参数设置表单,挡玩家按下“确定”软键时,在卧室确认当前游戏参数,返回游戏主屏幕;挡玩家按下“取消”软键时,则是此次对游戏的修改,直接返回主屏幕。 玩家进入游戏对战画布,对战画布中有两个软键,当玩家按下“退出”软键时,则是退出游戏;当玩家按下“悔棋”软键时,则是进行悔棋操作;当游戏结束后,“悔棋”软键被换成“重玩”软键。 主要的用户界面如下: 启动 游戏介参数设置 绍表单 表单 取消 确定 设置 开局 关于 退出 退出 游戏画布 退出 ?4.2游戏的核心类及起逻辑的实现 五子棋总共由6个类组成,其中主类为:FIRMIDlet类负责程序的启动和屏幕切换;FIRCanvas类为玩家对战平台,它继承于Canvas类;Options类用于创建设置参数表单;About用于创建关于表单;FIRLogic类是游戏的逻辑类;Dot是棋子类,包含了棋子的位置信息。4.2.1 主类FIRMIDlet FIRMIDlet类用高级界面中的软键来实现游戏菜单,在不同的手机上,软键可能有不同的分布。 这些软键包括退出,开局,设置,关于等命令。“退出”软键用于退出程序,“开局”软键用于显示画布进行人机对战,“设置”软键用于显示选项表单,包括棋盘大小,难以程度和先手方的设置,“关于”软键用于显示一些简单的帮助信息。见如下代码: private Command CMD_EXIT; //退出软键 private Command CMD_GO; //开局软键 private Command CMD_OPTION; //设置软键 private Command CMD_ABOUT; //关于软键 form.addCommand(CMD_GO); //将开局软键添加到主表单 form.addCommand(CMD_OPTION); //讲选项软键添加主表单 form.addCommand(CMD_ABOUT); //将关于软键添加主表单 form.addCommand(CMD_EXIT); //讲退出软键添加主表单 form.setCommandListener(this); //监听主表单的软键事件 commandAction()方法处理各种软键事件,包括开局,显示帮助和退出。该方法我们 可以在如下代码中理解: public void commandAction(Command c, Displayable s) //响应软键事件 { if(c == CMD_EXIT) //退出程序 { destroyApp(false); notifyDestroyed(); } else if(c == CMD_GO) //开局 { display.setCurrent(myCanvas); //显示游戏画布 myCanvas.setOptions(options.getBoardSize(), options.isComputerFirst(), options.getDegree()); myCanvas.newStage(); //新开局 } else if(c == CMD_OPTION) //设置游戏参数 display.setCurrent(options.getForm()); //显示设置表单 else if(c == CMD_ABOUT) //显示关于表单 display.setCurrent(about.getForm()); } FIRMIDlet类是负责程序的启动和屏幕切换,因此要提供方法来改变当前的状态。在 FIRMIDlet类中,提供改变当前程序状态的方法有:启动,停止,退出,以及从其他界面返 回主表单的方法。 在FIRMIDlet类中,是运用几个函数来实现这些功能的。如下: public void startApp() { display.setCurrent(form); //显示主表单 } public void pauseApp() { } public void destroyApp(boolean arg0) { } MIDlet类提供了3种抽象方法供设备应用程序管理器与其运行的应用程序通讯。只要应用程序被激活、构造器执行完毕之后就会立即调用startApp方法,而不是在应用程序最初启动时就这样做。管理器指示应用程序关闭之后就会调用destroyApp方法。和startApp方法不一样的是该方法只在应用程序生存期内调用一次,所以在这个方法内编写清除代码是很安全的。最后的抽象方法就是pauseApp了。该方法主要作用是发出这样的通知。因为用户转换到其他应用或者采用了设备的某项功能促使应用程序不能继续运行而暂时停止应用程序的运行。 另外程序创建一个函数comeBack()用来让程序从其他见面返回到主表单。 public void comeBack() { display.setCurrent(form); //返回主表单 } 4.2.2游戏实现和介绍表单实现 游戏设置表单用来对游戏参数进行设置,包括棋盘大小,是否对方先手和难易程度。表单中使用了Gauge和ChoiceGroup两种高级用户界面组件。 4.2.2.1 棋盘尺寸选择 Gauge组件实现了一个图形标尺,通常被用来表示一个过程的进展情况或者一些系列数字的选择情况。Gauge的构造函数根据制定的标签,交互模式,最大值,初始值生成一个新的Gauge对象,圆形如下: Gauge(String label,boolen interactive,int maxValue,int initialValue) ?Gauge的构造函数有4和参数:label,interactive,maxValue,initialValue。 ?参数label用作Gauge对象的标签,设置为null表示标签为空。 ?参数interactive是一个boolen变量,表示这个Gauge对象的交互模式,设置为ture表示交互模式,即用户不可以改变Gauge对象的值。 ?参数maxValue是一个大于0的数,否则会出现异常IllegaArgumentException。 ?参数initialValue是一个整数值,表示Gauge对象的初始值,它的范围应该是[0,maxValue]。如果initialValue小于0,则Gauge对象的初始值被设置为0;如果iniltialValue大于maxValue,则被设置为maxValue。 标准的五子棋棋盘大小为15*15,但是为了满足不同玩家需要,这里提供了10*10到20*20大小的棋盘,用户可以用Gauge组件发生变化的最小值为10,而Gauge组件的最小值为0,所以当前的Gauge需要加上10才是当前的棋盘大小。 在Gauge交互模式是下可以为Gauge对象所在的表单对象绑定一个ItemStateListener事件监听器,并在监听器中捕捉Gauge对象的事件,当Gauge的值发生变化时就会触发事件。这里将根据Gauge的当前值改变标签,以显示当前棋盘的大小。 4.2.3先手与难度选择 选择先手和难度等级用ChoiceGroup组件来实现。ChoiceGroup组件用来构造选择框,其构造函数如下: ChoiceGroup(String label,int choiceType) 该构造函数用两个参数,其中参数label用来设置此选项组的标签。Label可以设置为null,表示此Item对象标签为空白。构造完毕后,还可以使用setLabel方法和getLabel方法来分别设置和获取对象的标签。参数choiceType用来设置ChoiceGroup的类型,ChoiceGroup类继承了Choice接口的三种类型: ?EXCLUSIVE,值为1,一次只有一个元素被选择。 ?MULTIPLE ,值为2,一次可以有多个元素被选择。 ?IMPLICIT ,值为3,类似软键菜单或者按键,当被选择时,立即触发Command事件。 ?POPUP,值为4,弹出式菜单,当被选择时,弹出选项。 在MIDP 1.0中,ChoiceGroup的类型只能是EXECLUSIVE或者MULTIPLE中的一个,如果不是这两个中的一个,就会出现异常。由于ChoiceGroup不能设置IMPLICIT类型,因此在ChoiceGroup中不能通过某个选项而触发事件。在MIDP 2.0中,还有一种新的ChoiceGroup类型,那就是POPUP,它能够在被选中时弹出一个小上拉菜单,只有被选中的选项才能在屏幕上显示出来。 选中先手的选项框为选择组件,属性为复选框,标签名为空。创建的选项为选择组中的最后一个元素,选择组的大小为1. 对于多选类型的ChoiceGroup,还可以设置个别选项的选择状态。设置初始选择状态的方法如下: void setSelectedIndex( int elementNum,boolen selected) 这里创建一个只有一个选项元素的多选项框用于玩家设置是否家算计先行,在默认情况下为ture,创建完成后多选项框后将其添加到主表单中,代码如下: isComputerFirst = true; //默认情况下为计算机先行 choiceFirst = new ChoiceGroup(null, 2); //创建复选框 choiceFirst.append("对方先行", null); //添加选项元素 choiceFirst.setSelectedIndex(0, isComputerFirst); //设置多选项的默认状态 form.append(choiceFirst); //将多选项框添加到主表单 难度等级用单选框实现,创建方法及添加选项的方法和复选框一样,所不用的是,创建ChoiceGroup对象时,类型设置为1(单选)。对于单选框,setSelectedIndex只能用来指定某个选型被选定,因此布尔值selected的值必然为true,否则无意思。 degree = 1; choiceDegree = new ChoiceGroup("电脑智能级别:", 1); choiceDegree.append("拜师学艺", null); choiceDegree.append("初出茅庐", null); choiceDegree.append("闯荡江湖", null); choiceDegree.append("谁与争锋", null); choiceDegree.setSelectedIndex(degree-1 , true); form.append(choiceDegree); 游戏设置选项表单中还有连个Command对象,分别用于玩家确认和取消,因此表单需要进听软键事件和组件事件: public class Options implements CommandListener, ItemStateListener 4.2.4存储和加载默认选项 在创建表单界面之前调用了loadOptions方法加载选项数据,其中使用了RecordStore类的openRecordStorez方法,该方法原型如下: static RecordStore openRecordStore(string recordStoreName,boolen createIF Necessary); 其中,字符串recordStoreName为记录存储名,由1到32个Unicode字符组成;布尔变量Necessary值为ture时,如果记录不逊在在则创建记录,否则返回记录;值为false时,如果记录不存在则抛出RecordStoreNotFindException异常,存在时返回记录。 打开记录存储后,还使用下面两个方法来查询记录的存储数量,以及读取存储内容: int getNumRecords() //根据当前记录条目数目 byte[] getRecord( int recorded) //根据制定ID获得存储内容 loadOptions方法加载记录存储文件,如果加载成功,则读取棋盘大小,先手情况和难以程度等游戏设置选项,并且更新相应的数量。 获取表单参数 游戏设置表单的主要功能是设置选项参数,因此在设置好后还需要把这些参数传递给外界,因此提供了以下几个方法来查询参数,并且提供了getForm方法返回设置表单,以便主类讲表单设置为可见。 public int getBoardSize() { return boardSize; //返回棋盘大小 } Public boolean isComputerFirst() { return isComputerFirst; //是否计算机先手 } public int getDegree() { return degree; //返回难度级别 } public Form getForm() { return form; //返回表单,用于显示 } 4.2.5 棋子DOT类的实现 Dot类代表了现实中的棋子,该类主要用于记录棋子的位置。棋子的行列位置: 五子棋是一个二维棋类游戏,所以首先想到的是定义一 个Dot类来表示棋子。考虑到移动设备的资源有限,以及尽可能少的减少系统资源占用,程序不在下每一步棋时生成一个对象,而是在游戏时,玩家或者计算机每下一步棋,在数组相应的生成该棋子的对象,而将已经下过的棋子保持到数组中随时检索,这样可以避免过多的棋子占用系统内存。 Dot类主要有两个变量row和col,分别代表行和列。 初始化棋子位置的的三种方式: public Dot() //初始化位置,行和类均为0 { row = 0; col = 0; } public Dot(int r, int c) // 自定义初始化位置 { row = r; col = c; } public Dot(int boardSize) //初始化位置为棋盘中央,boardSize为棋盘大小 { row = boardSize / 2; col = boardSize / 2; } 棋子的位置并非是任意的,玩家和计算机每走一步棋之前都要检查该位置的合法性,即棋子是否在棋盘上,否则为非法落子,检查方法如下: public boolean isInBoard(int boardSize) { return row >= 0 && row < boardSize && col >= 0 && col < boardSize; } ?4.3对战逻辑FIRlogic类的实现 FIRlogiv类是整个游戏的逻辑类,包含了人工好智能算法,这些算法主要体现在对各种棋型的检测并计算一个最佳的落子点。 4.3.1建立数据结构 本程序以数组保存当前棋盘的情况,每个位置可能有三种状态:“空”,“计算机落子”,“玩家落子”,分别用0,1,2表示。程序如下: public static int PLAYER_NONE = 0; public static int PLAYER_COMPUTER = 1; public static int PLAYER_MAN = 2; private int table[][]; //棋盘情况 游戏为落子前,需要对棋盘进行初始化,全部为空。 table = new int[boardSize][boardSize]; //创建棋盘 for(int r = 0; r < boardSize; r++) { for(int c = 0; c < boardSize; c++) table[r][c] = 0; } 4.3.2落子和悔棋 当对战谋一方在棋盘上落子时,就讲棋盘数组的相应位置设置为该方代码(1或者2)。这里用一个Dot类棋子对象来记录最后一步棋的位置,当玩家下了一步棋后需要讲上一步棋重新绘制,以消除棋子上的引导框。此外还使用了堆栈来存储最近的几步落子,以便与玩 家悔棋。 public Dot lastDot() //棋子对象,存储最后一步落子 private Stack steps //堆栈,内容为棋子对象 最后一步棋子和棋子堆栈在FIRlogic类的构造函数中进行初始化: lastDot = new Dot (boardSize); //创建棋子对象用来存储最后一步棋,初始化位置为棋盘中央 steps = newStack(); //堆栈对象,用来存储最近的几步棋 悔棋的程序见下: public boolean undo() { if(steps.size() >= 3) { Dot d = new Dot(); //创建对象 d.copyFrom((Dot)steps.pop()); //复制棋子行列位置坐标 table[d.row][d.col] = 0; //将该位置设置为空 myCanvas.repaintAt(d.row, d.col); //重新绘制棋盘 d.copyFrom((Dot)steps.pop()); //复制棋子行列位置坐标 table[d.row][d.col] = 0; //将该位置设置为空 myCanvas.repaintAt(d.row, d.col); //重新绘制棋盘 d.copyFrom((Dot)steps.peek()); //获取堆栈对象,作为最后一步棋存储 lastDot.copyFrom(d); //重新绘制最后一步 myCanvas.repaintAt(d.row, d.col); //悔棋成功 return true; } else { return false; } } 4.3.3五子棋的逻辑算法 对于五子棋游戏,无论人机对战,还是双人对战,都需要判断棋盘上是否存在五子连珠情况,这既是游戏名字的由来,也是游戏结束的标志。判断五子连珠的原理是从横,竖,左斜线,右斜线4条线上判断是否存在5个相连的同类棋子。 对战一方落子后,在该处向8个方向检测连续的同类棋子,如果检测到直线方向上存在5个连续的同类棋子(包含本位置棋子),则判断为“连五”并结束检测循环。基于检测 结果,可以判断游戏是否结束,并根据获胜方的落子代码判断获胜方是谁。 由于不考虑禁手问题,在实现“连五”过程中,我们可以考虑完成“双四”,“四三”,“双三”,“冲四”,“活三”,“活四”来实现目的。 活四:有两个点能形成“连五”的四就是活四; 冲四:只有一个点能形成“连五”的四叫做“冲四”,或者叫做“单四”; 活三:己方在落一子就能形成“活四”的三叫做“活三”。“活三”分为“连活三”和“跳活三”。连活三:在棋盘某一条阳线或阴线上有同色三子相连,且在此三子两端延长线上有一端至少有一个,另一端至少有两个无子的交叉点与此三子紧密相连。跳活三:中间仅间隔一个无子交叉点的连三,但两端延长线均至少有一个无子的交叉点与此三子相连。 双三:由于黑方走一着在无子交叉点上同时形成二个或二个以上黑方 " 活 " 的局面。 双四:由于黑方走一着在无子交叉点上同时形成二个或二个以上黑方 " 四 " 的局面。 四三:指某一方同时具备两个先手,其中一个是 " 四 " ,一个是 " 活三 " 。 在实现上面这些高级算法的时候,我们需要一个基础,就是对制定位置周围情况进行检测。在棋盘上面,棋子存在8个移动方向,检测时需要对每个方向进行检测。为了简单直观,这里将每步棋子的移动生成一个新的棋子。 我们还用一个connectedIn1D来检测棋盘上任意一点在制定方向上的tonglei棋子的相连个数,传入落子方标志,检测位置的行列坐标和检测方向,返回在该方向上相连的棋子的个数,代码如下: private int expandedIn1D(int player, int row, int col, int direction) { int n = 0; int cn = 0; Dot d = new Dot(row, col); //当前位置创建棋子 while(cn < 4) { d.copyFrom(moveOneStep(d, direction)); //返回指定方向上移动的棋子 if(!d.isInBoard(boardSize)) break; int p = table[d.row][d.col]; if(p == 0) cn++; if(p != player && p != 0) break; n++; } return n; } 在connectedIn1D的基础上面,我们用connectedIn8D来对8个方向都进行检测并记录,运用一个循环来实现这个对8个方向检测的功能。 ?4.4游戏画布FIRCanvas类的实现 游戏画布负责游戏对战界面的绘制,包括棋盘,棋子和汉族昂太提示。该类主要负责获取用户输入,根据屏幕大小计算棋盘,绘制屏幕等。 4.4.1 屏幕绘制 在绘制屏幕之前,将首先计算屏幕中各个部分的位置和大小。如果屏幕的宽小于高,则提示字符串位于屏幕上方;如果屏幕的宽大于搞、搞,则提示字符串位于屏幕上方。 提示字符串中采用Font类实现,Font类所定义的字体有三个属性:字型,外观和字号,用作属性的值必须使用字符常量或其他代表的整数指定。 Font类中使用了以下3个常量来表示外观属性: ?FACE-SYSTEM 值为0,表示“系统字体” ?FACE-MONOSPACE 值为32,表示“等宽字体” ?FACE-PROPORTIONAL 值为64 ,表示“均衡字体” Font类中使用以下3个常量来表示字号属性: ?SIZE-MEDIUM 值为0,表示“中号字体” ?SIZE-SMALL 值为8,表示“小号字体” ?SIZE-LARGE 值为16,表示“大号字体” Font类中用以下4个常量来表示字型属性: ?STYLE-PLAIN 值为0,表示“普通” ?STYLE-BOLD 值为1,表示“粗体” ?STYLE-ITALIC 值为2,表示“斜体” ?STYLE-UNDERLINED 值为4,表示“下斜线” 4.4.2用户输入 游戏支持键盘输入和指针输入。当游戏并未结束且计算机方不在思考当中时,玩家可以选择空白处落子。落子后,首先将上一步棋子重新绘制,消除引导框。引导框将跟随玩家的方向键移动,当按下确认键后,则调用logic.manGo方法,进行玩家落子。 对于触摸屏而言,指针可以是接触屏的任何物体,通常是一只输入笔。有三种类型的是指针事件:指针接触事件,指针释放事件和指针拖放事件。相应的,也有三种类型的指针处理方法,如下: ?Protected void pointerDragged(int x int y),当指针拖动时调用 ?Protected void pointerPressed (int x int y),当指针按下时调用 ?Protected void pointerReleased (int x int y),当指针释放时调用 其中,参数x和参数y分别是和Canvas相对应的指针的位置。 致谢 本文是在孙斌老师精心指导和大力支持下完成的。孙斌老师虽然人在美国,但他仍然给我提供一些好的资料及一些好的意见。本次毕业设计是我从学习新的知识到完成最后的设计,在过程中我和小组成员遇见了一些问题,感谢本班在外面公司实习的同学提供解决方法,让我们的项目得以顺利结束。 另外,我还要特别感谢师兄对我论文写作的指导,他为我完成这篇论文提供了巨大的帮助。 最后,再次对关心、帮助我的老师和同学表示衷心地感谢,在你们不厌其烦的帮助和指导下,我们小组才能完成毕业设计。 参考资料 【1】 龚剑 J2ME手机游戏开发详解 电子工业出版社 2008.1 【2】 周竞涛 Eclipse完全手册——基础?进阶?高级 电子工业出版社 2006.8 【3】 肖玉 计算机专业毕业设计指导书 化学工业出版社 2007.8.1 【4】 潘颖 王磊译 J2ME开发大全 清华大学出版社 2004.2 【5】 JAVA2核心技术 机械工业出版社 2006
本文档为【手机博弈游戏五子棋】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_633423
暂无简介~
格式:doc
大小:102KB
软件:Word
页数:0
分类:互联网
上传时间:2018-08-03
浏览量:10