基于J2ME的MOTO手机的五子棋游戏开发_第1页
基于J2ME的MOTO手机的五子棋游戏开发_第2页
基于J2ME的MOTO手机的五子棋游戏开发_第3页
基于J2ME的MOTO手机的五子棋游戏开发_第4页
基于J2ME的MOTO手机的五子棋游戏开发_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、西安文理学院计算机科学系本科毕业设计 ( 论文) (2009 届) 设计题目基于 motorola手机的五子棋游戏开发 the development of five son chess based on motorola cellular phone 系别计算机科学与技术专业软件工程班级软工( 2)学号 05413425 作者姓名 xxx 指导老师xxx完稿时间 2009-3-25成绩i 摘要j2me(java 2 micro edition) 是近年来随着各种不同设备,尤其是移动通信设备的飞速发展而诞生的一项新的开发技术。它定位在消费性电子产品的应用上,对设备的智能化、多样化,提供了革命性

2、的解决方案,并因其“write once, run anywhere”的 java特性而提高开发的效率。随着手机的日益普及、 java功能在移动设备上的实现,java 应用程序产生的手机增值服务逐渐体现出其影响力,对丰富人们的生活内容、提供快捷的资讯起着不可忽视的作用。特别是手机性能的逐渐增强,手机作为一个游戏平台越来越成熟了。本论文着眼于j2me 技术的应用,开发一款可用的手机游戏程序五子棋。本论文介绍了 j2me 的相关技术及本程序的结构分析和具体功能的实现。关键词: j2me;手机游戏;五子棋ii abstract j2me is a kind of fast developing te

3、chnology implemented on various devices especially mobile communication equipments. it focuses on application for consumptive electronic products, providing revolutionary solution to the intelligence and diversification of the equipment. it improves the efficiency of the development process thanks t

4、o 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 ha

5、nd. 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 gobang. this dissertation introduces j2me and its relative technology as well as this program s

6、 structure and analysis of implementation in details. keywords: j2me; mobile game; gobang iii 目 录第一章背景与意义 . - 1 - 1.1 手机业的情况. - 1 - 1.2 java 手机的优点 . - 1 - 1.3 java 手机发展现状. - 2 - 1.4 论文组织 . - 4 - 第二章 j2me综述 . - 5 - 2.1 j2me 简介 . - 5 - 2.2 j2me 的相关特性 . - 5 - 第三章需求分析 . - 7 - 3.1 基本需求分析. - 7 - 3.2 游戏玩法及

7、规则. - 7 - 第四章游戏设计分析. - 8 - 4.1 软件总体框架图. - 8 - 4.2 单机挑战版 . - 10 - 4.3 双人对战版 . - 20 - 4.4 蓝牙终极版 . - 22 - 4.5 游戏主类介绍及实现. - 23 - 第五章总结与展望 . - 29 - 参考资料 . - 30 - 致谢 . - 31 - - 1 - 第一章背景与意义1.1 手机业的情况2007年全球共销售了大约11.5亿部手机, 手机市场主要靠非洲和亚洲手机销量上升拉动,欧洲的手机销量保持稳定。2007 年中国的手机年销售量达到1.9 亿部,手机的普及率是39%,拥有 5.25亿用户。中国在手机

8、生产制造领域的优势不断加强,手机在中国自身的信息技术市场扮演的角色也越来越重要。经过五年的规模化发展,中国手机市场已进入成熟期,2007年销量将达 1.5亿部,同比增长 23.1%;销售额将达 1661 亿元,受低端手机份额扩大的影响,销售额同比下降 0.3%。2007 年,诺基亚生产了4 亿 3710万手机,三星生产了1 亿6120 万部手机, 摩托罗拉生产了 1 亿 5900万,紧挨着的是索尼爱立信, 生产了 1亿 340万部手机, 而且 lg 生产了 8050万。其他公司生产了1 亿 8430万部手机,所有的公司将总共出售12亿 4 千万部手机。2007 年,各大手机厂商采用不同策略推动

9、市场发展,导致品牌竞争激烈。诺基亚推动娱乐市场战略并涉足互联网服务领域;索尼爱立信弥补智能手机软肋;三星放下架子攻低端;摩托罗拉发展受阻,其他国外品牌如lg、飞利浦等表现不佳。多普达锋芒毕露,其他国产品牌在生死线上挣扎。手机市场再现黑马,苹果高调入市,魅族、纽曼先后进入手机市场。预计到 2011年,全球市场售出的手机中有四分之一的产品将是超低价手机。未来五年,印度将是超低价手机的最大市场,其超低价手机年销量将从2006年的900 万部增加到 2011年的 1.16 亿部。1.2 java 手机的优点java 手机软件平台采用的基本java 平台是cldc (connected limited

10、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 编程语言为手机开发应用程序,可

11、以为手机用户提供游戏、个人信息处理、 电子地图、股票等服务程序。 j2me(java 2 micro edition)是致力于消费产品和嵌入式设备的最佳解决方案。j2me 在设计其规格的时候,遵循着“ 对于各种不同的装置而造出一个单一的开发系统是没有意义的事” 这个基本原则。于是j2me 先将所有的嵌入式装置大体上区分为两种:一种是运算功能有限、电力供应也有限的嵌入式装置 (比方说 pda、手机 );另外一种是运算能力相对较佳、并且在电力供应上相对比较充足的嵌入式装置(比方说冷气机、电冰箱)。因为这两种区分,所以 java引入了一个叫做 configuration 的概念,然后把上述运算功能有

12、限、电力有限的嵌入式装置定义在connected limited device configuration(cldc)- 2 - 规格之中;而另外一种装置则规范为connected device configuration(cdc)规格。也就是说, j2me 先把所有的嵌入式装置利用configuration 的概念区隔成两种抽象的型态。java技术的开放性、安全性和庞大的社会已有资源,以及其跨平台性,即“ 编写一次,到处运行 ” 的特点,使java 技术成为智能手机软件平台的事实标准。采用 java技术后,编写应用程序和提供服务的人就不必关心接受其服务的手机采用的是什么操作系统和芯片,只要按

13、照java的要求去写程序就好了;同样,生产手机的厂商也不必顾虑将来谁来提供增值服务。可以看出,采用java技术,可以建立完整、高效的无线数据增值服务产业链,从而为用户提供灵活、个性化、内容方式多样的服务。1.3 java手机发展现状到今年 6 月,全世界已经有大约1 亿部 java手机在使用,除中国大陆外共有53 个移动运行商正式推出了基于java技术的无线数据增值服务。 中国移动通信集团已经建立了无线java增值服务体系,并推出了 “ 百宝箱 ” 等服务品牌,包括游戏百宝箱、娱乐百宝箱、商务百宝箱、生活百宝箱等,已经于2003 年 7 月 10 日开始正式商用。手机游戏开发一般都是开放式的开

14、发平台,例如流行的开发平台,如j2me。开发人员能够从网络方便的得到相应的开发资料,不论你的资金实力如何,只要你有兴趣,就能够迈入这个新兴的行业。而相关的厂商,例如通信设备厂家对于手机游戏开发秉承一种开发的态度,鼓励开发者在手机设备上开发游戏,通常都在网络中提供了自己手机的技术资料。下文对目前市面上流行的手机游戏平台做一个简单的介绍。嵌入/内置式游戏早期的手机功能简单、屏幕也仅仅是单色,手机厂商能做的,就是在手机内置一些简单的游戏。这些游戏都是厂商以自己的专属平台所开发的,这些发售时就内置的游戏在手机预存了多少就是多少,用户无法自己新增或删除。in-fusio exen 娱乐平台即使是手机屏幕

15、变成了彩色,内置游戏如何好玩,但总而也有玩腻的时候。因此用户们也希望能够玩新的游戏或者象下载图片、铃声那样通过无线网络下载新的游戏。法国 in-fusio 公司看中了这个市场, 在 2001 年推出了 exen (execution engine)游戏平台。通过把专属的exen 芯片加入手机内,赋予手机彩色画面与流畅的执行速度,让手机也有掌上游戏机那样的效果。j2me 平台j2me(java 2 micro edition )平台是目前最火暴的手机游戏平台,尽管它还可以下载和安装一些小的应用程序。j2me 简单的可以理解为java的移动版本,其 midp(mobile information

16、device profile ,移动信息装置简表)架构就是专门- 3 - 为手机与 pda 而设计。目前 midp 有 1.0 和 2.0 之分, 后者在兼容性以及游戏的多媒体表现力如音效和振动方面有更好的效果,此外通过测试软件显示,支持midp2.0 的 java 游戏在图形运行能力对比1.0 版本也有更优秀的表现。由于 j2me 的技术先进,而且又能跨平台运行, 因此受到了众多手机厂家的支持,甚至成为现在用户购买手机的一项比较重要的技术指标。所以到目前为止,手机的游戏应用平台中,以支持j2me 的最多,而且 j2me 软件开发商也有越来越多的趋势, j2me 已成为 2002 年下半年之后

17、的行动游戏平台主流。synergenix mophun平台mophun 是瑞典 synergenix公司于 2002 年开发出的全新移动游戏娱乐平台。mophun 的发音类似 more fun,主要就是针对游戏平台而设计的游戏语言,采用c 程序代码来开发游戏,运行起来最稳定,速度上也比java vm 快许多倍(厂商宣称快 100倍) ,可发挥出手机硬件的极限。同时,mophun 游戏平台能在极其有限的硬件资源上运作,其最低硬件需求是以12mhz 运行的 8 位处理器,因而适用于现有的 2g 手机。由于 mophun 的 api 功能齐全,加上是采用本地代码,运行速度快的优势显而易见,这点对于支

18、持mophun 和 java双游戏平台的索爱手机尤其明显。通常情况下排除其他因素, 索爱手机在运行 mophun 游戏时速度远远超过手机的java游戏运行时的速度。另外, mophun 游戏在一次下载后就不须再付费(这点跟exen的理念一样),同时 mophun 还具备安全机制(防盗版) ,主游戏程序无法从手机中拷出,只提供游戏存盘转存到电脑中。mophun 游戏平台因为具备在极其有限的硬件资源上运行高效性能,可说是目前手机最佳的游戏平台之一。brew 游戏平台brew 是无线二进制运行环境 (binary runtime environment for wireless) 的缩写。是高通公司

19、2001 年推出的基于 cdma 网络的一个增值业务开发运行的基本平台。相对 java,brew 是一个更底层的技术。严格的说游戏仅仅是brew 的一部分内容而已。brew 提供的功能环境就好像pc 机上的操作系统一样,可以通过服务提供商下载指定类型的应用程序或游戏来使用。对于支持 brew 的手机终端, 在手机出厂时已经预安装了两个应用。分别为应用管理器 (application manager)和移动商店( mobileshop) 。未来手机游戏趋势未来的手机游戏平台因为ati 和 nvidia 两大 pc 显示芯片厂商专业级水准的加入而更为热闹。在ati 推出手机和 pda 手机 3d

20、多媒体芯片 (包含专用的媒体处理器 media processor及 3d 加速器 3d accelerator)后,老对头 nvida 也毫不示弱,公布了他们的 3d 多媒体芯片, 并且应用于三菱和神达mitac 的智能手机上。这些芯片在植入手机后能够有效的提升图形显示性能,使手机在进行多媒体演示和游戏时更够有出色显示效果。不过这些厂家提供的都是硬件芯片,要完全发挥其在3d 图形的表现能力还- 4 - 需要相应支持的api 才能相辅相成,而目前主要的api 包括 2003 年 7 月发表的opengl es (opengl for embedded systems ) ,就是 opengl

21、的嵌入式版本,是为嵌入系统而开发的小型标准三维(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游戏了。1.4 论文组织本论文的组织如下:第一章 介绍了课题的开发背景和意义,以及国内外状况。第二章 j2me综述。第三章 需求分析。第四章

22、游戏设计分析。第五章 总结与展望。- 5 - 第二章 j2me综述2.1 j2me 简介j2me 即 java 2 micro edition ,它是 java 2的组成部分, 与 j2se、j2ee并称。j2me 是一种高度优化的 java运行环境,应用于大量的消费类电子设备, 如 cellular phones( 蜂窝电话 )、screen phones( 可视电话 )、digital set-top boxes(数字机顶盒 )、car navigation systems( 汽车导向系统 )等,同时也广泛被移动通信设备所采用,如移动电话、双向寻呼机、智能卡、个人电脑记事本(persona

23、l 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 不是一个单独的技术规范,而是一

24、系列技术规范总称。这些规范定义了java 技术在资源限制的设备中的表现形式。 j2me 主要适用于小型嵌入式设备,这些设备与pc 或是服务器设备相比没有统一的硬件标准、 外观与操作方式, 其功用也是千差万别。 但是 j2me 在适用于这些设备的同时也保留了java 的传统特性,即任何时间和任何地点的代码具有可移植性、部署灵活性、安全的网络传输性,以及代码稳定性。正是因为如此,开发人员才可以借助j2me 力量让编写的程序能够运行在其他型号或厂商的设备上。2.2 j2me 的相关特性2.2.1 configuration简介j2me 在设计其规格的时候, 遵循着对于各种不同的装置而造出一个单一的开

25、发系统是没有意义的事 这个基本原则。 于是 j2me 先将所有的嵌入式装置大体上区分为两种:一种是运算功能有限、电力供应也有限的嵌入式装置(比方说pda 、手机 );另外一种则是运算能力相对较佳、并请在电力供应上相对比较充足的嵌入式装置(比方说冷气机、电冰箱、电视机上盒(set-top box)。因为这两种型态的嵌入式装置,所以java 引入了一个叫做configuration 的概念,然后把上述运算功能有限、电力有限的嵌入式装置定义在connected limited device configuration(cldc) 规格之中;而另外一种装置则规范为connected device co

26、nfiguration(cdc) 规 格。 也 就 是说 ,j2me 先 把所 有 的 嵌 入 式 装 置 利 用configuration 的概念区隔成两种抽象的型态。其实在这里大家可以把configuration 当作是 j2me 对於两种类型嵌入式装置的规格,而这些规格之中定义了这些装置至少要符合的运算能力、供电能力、记忆体大小等规范,同时也定了一组在这些装置上执行的java 程序所能使用的- 6 - 类别函式库、这些规范之中所定义的类别函式库为java 标准核心类别函式库的子集合以及与该型态装置特性相符的扩充类别函式库。比方就cldc 的规范来说,可以支援的核心类别函式库为java.l

27、ang.* 、java.io.*、java.util.* ,而支援的扩充类别函式库为java.microedition.io.* 。区分出两种主要的configuration 之後,j2me 接著在定义出 profile 的概念。profile 是架构在 configuration 之上的规格。之所以有 profile 的概念,是为了要更明确地区分出各种嵌入式装置上java 程序该如何开发以及它们应该具有哪些功能。因此 profile 之中定义了与特定嵌入式装置非常相关的扩充类别函式库,而java 程序在各种嵌入式装置上的使用者介面该如何呈现就是定义在profile 里头。 profile 之

28、中所定义的扩充类别函式库是根据底层 configuration 内所定义的核心类别函式库所建立。2.2.2 profile简介profile 是建立在某个 configuration 之上的特定 api 集合。一个 configuration只定义虚拟机和基本的api 集合,不定义建立应用程序的细节。因此profiles 往往包括应用程序生命周期的api,用户界面 api 以及存储 api。一个 profile 既可直接建立在 configuration 上,也可建立在另一个profile 之上。为了在不改动 profile 的前提下增加设备的功能, 在 profile 之外又提出了可选包,可

29、将它们看成profile 的扩展,每个可选包对某个或某些profiles 增加特定的功能。当对某个 profile 需要增加一个新的 api 时首先将它定义为可选包。 如果随着时间的推移该可选包被广泛采用,它则可能成为某个或某些profiles 的一部分。某些厂家特定的api 与可选包起相似功能。j2me 的这种结构很好的适应了嵌入设备的巨大多样性。从低到高,您可根据设备的情况可采用不同的configuration,在同一 configuration中您又可根据设备的用途选用不同的profile ,在您的设备中您还可采用多个profile ,如果您还嫌功能不够,尚有可选包可用。 j2me 中第

30、一个正式发布的profile 是 midp, 而且随后比较长的时间内未有其它 profile 发布, 以至有人把 midp 等同于 j2me 了, 有人把 wtk 等同于 j2me sdk(由于 j2me 包含的范围很广,所以不太可能有厂商推出能支持各种profile 的开发工具) 。midp 只是 j2me 中的一员,我们来看看到写本文为止有哪些profile。由于每个 profile 是建立在特定的configuration 之上的,所以我们在profile 后注明其基于的 configuration。目前已有的基于 cldc 的 profile 有 midp,基于 cdc的 profil

31、e 有 fp、pbp。- 7 - 第三章需求分析3.1 基本需求分析手机屏幕尺寸分为物理尺寸和显示分辨率两个概念。物理尺寸是指屏幕的实际大小。大的屏幕同时,要配备高分辨率,也就是在这个尺寸下可以显示多少个像素,显示的像素越多,可以表现的余地自然越大。现在手机行业发展迅速,不同大小屏幕的手机迅速发展,鉴于不同手机屏幕尺寸不同,我们在设计游戏的时候有一下一些要求:一 软件的界面简洁明了,操作简单容易。受手机屏幕大小和显示的影响,我们设计的软件界面必须是简洁的;手机键盘的不方便,游戏需要设计得易操作。二 软件具有人工智能算法原理要简单,并且运行快速。游戏是需要快速反应的。手机处理器的频率直接要求我们

32、需要使用简单实用的智能算法。三 游戏要设置几个难度, 便于不同玩家选择 . 玩家的游戏水平不一样, 我们设置不同难度供各个水平的玩家选择。四 游戏棋盘的大小要灵活,根据不同手机屏幕可以调节。3.2 游戏玩法及规则现代五子棋专用棋盘为十五路(15x15) ,共 225 个交叉点。棋盘正中一点为天元。对局开始时,先由执黑棋一方将一枚棋子落在天元点上,然后由执白棋一方在黑棋周围的交叉点上落子。但是,为了尊重对方和礼貌起见,持白棋的一方通常将盘面的第二着棋布在自己河界的一侧,即直止或斜止。此后黑白双方轮流落子,直到某一方首先在棋盘的横线、纵线或斜线上形成连续五子或五子以上仅对白棋而言,则该方就算获胜。

33、连珠五子棋的一个特点是先行的一方优势很大,因此在职业比赛中对黑方做了种种限制,以利公平竞争。 五子棋的比赛规则如下:1 黑先、白后,从天元开始相互顺序落子;2 最先在棋盘横向、纵向或斜向形成连续的同色五个棋子的一方为胜;3 黑棋禁手判负、白棋无禁手。黑棋禁手有“ 三、三 ” 、“ 四、四 ” 和“ 长连” ,包括“ 四、三、三 ” 和“ 四、四、三 ” 。黑棋只能以 “ 四、三 ” 取胜;4 如分不出胜负,则到为平局;5 五连与禁手同时形成,判胜;6 黑方禁手形成时,白方应立即指出。若白方未发现或发现后不立即指出,反而继续落子,则禁手失效,不再判黑方负。在本游戏中,没有采用职业比赛的规则,直接

34、采用明间规则,一人一手棋,先成 5 为胜。另外,我们把游戏棋盘设置为可以调节大小,设置游戏难度以便适用不同手机。- 8 - 第四章游戏设计分析4.1 软件总体框架图4.1.1 驱动循环及类图图 1 驱动循环图棋类游戏通常具备两个重要特性,首先是对战双方轮流落子,其次是落子间隔通常是不确定的,尤其是对战后期,可能每一步都需要经过深思熟虑,无论是人方还是计算机方,都无法对间隔时间有事先的预期。开始玩家落子判 断 落 子合法性判 断 游 戏是否结束计算机落子判 断 游 戏是否结束等待用户输入结束- 9 - 基于以上两个特性,本游戏摒弃了大多游戏采用的线程或者定时器驱动游戏的方法,而采用了事件驱动方法

35、, 即玩家的键盘或触摸笔出发游戏的下一步动作。事件驱动大大减少了不必要的工作量。软件的类结构:图 2 软件类结构整个游戏由 11 个类组成。这个游戏共有三个版本: 单机挑战版, 双人对战版,蓝牙终极版。 单机挑战版由 gobang1canvas类和 chesses类组成,gobang1canvas类负责游戏界面的绘制,游戏落棋的控制,游戏规则的控制,游戏算法的控制,游戏胜负的控制。 chesses类是棋子类,提供棋子,每当下一个棋子的话,就生成一个棋子对象。双人对战版由 gobangcanvas类和 chesses类组成。 gobangcanvas类负责游戏界面的绘制,游戏落棋的控制,游戏规则

36、的控制,游戏算法的控制,游戏胜负的控制。chesses类是棋子类,提供棋子,每当下一个棋子的话,就生成一个棋子对象。蓝牙终极版是由 chess类、client 类、connection类、control 类、gameworld类和 server 类组成, chess类提供蓝牙版的棋子,每当下一个棋子的时候,生成一个棋子对象。 client 类和 server 类是建立蓝牙协议的客户端和服务端,当服务canvas midlet gobang1canvas gobangcanvas mycanvas gobang chesses connection control gameworld serve

37、r chess client - 10 - 端启动后,不断地监听来自客户端的请求,如果监听到,则连接协议,准备进行通信,客户端则在启动后向服务器端发送连接请求,如果被服务端监听到,则配合服务器端连接。 connection类是负责连接客户端和服务器端的。control 类负责判断是启动服务器端还是客户端,对应游戏中的正方和反方。gameworld类是负责绘制棋盘,游戏规则的控制,以及游戏胜负的控制,游戏进行的控制。4.2 单机挑战版4.2.1 单机挑战版的程序分析与具体实现进入游戏前的选择画面。游戏前我们要选择游戏的版本,这里有三个版本,单机挑战版,双人对战版,蓝牙终极版,可以操作手机的上下左

38、右键进行选择。图 3 开机选择版本单机挑战版有三个等级的游戏,分别是初级、中级、高级。由于时间的原因,目前只完成了初级的开发,中级和高级留作日后进一步开发。图 4 进行等级的选择进入游戏,开始单机挑战版的游戏。- 11 - 图 5 开始游戏4.2.2 单机挑战版的核心类及逻辑实现gobang1canvas类是主要的实现类。以下是在游戏中需要用到的变量设置:int empty;/游戏界面到屏幕边缘的留空int canvasw,canvash;/画布的长和宽int chesslength;/棋子的直径int chessmaplength,chessmapgrid,chessgridlength;

39、/棋盘的边长,棋盘一边格子数,每格宽度int chessmapx,chessmapy;/棋盘左上角 x,y 坐标int selectedx,selectedy;/选择框在棋盘格局上的 x,y 位置boolean isplayer1;/是否是玩家 1 chesses chesses;/棋子数组boolean newgame;/是否是新的游戏boolean iswin=false;/是否已经胜利?int chessespoint;/存放要走的棋子的位置- 12 - staticintchessesnum = 3;/判断有几个棋子就开始堵了下面这个构造函数对游戏进行初始化,包括棋盘的大小, 界面的绘

40、制, 游戏的加载:主要程序如下:public gobang1canvas(gobang gobang) this.gobang=gobang; newgame=true; empty=10; canvasw=getwidth()-empty;canvash=getheight()-empty; chessmapgrid=15; chesses=new chesseschessmapgrid+1chessmapgrid+1; if(canvaswcanvash) chessmaplength=canvash-canvash%chessmapgrid; chessmapx=(canvasw-che

41、ssmaplength)/2+empty/2; chessmapy=(canvash%chessmapgrid)/2+empty/2; else chessmaplength=canvasw-canvasw%chessmapgrid; chessmapx=(canvasw%chessmapgrid)/2+empty/2; chessmapy=(canvash-chessmaplength)/2+empty/2; chessgridlength=chessmaplength/chessmapgrid; chesslength=chessgridlength-1; selectedx=select

42、edy=chessmapgrid/2; isplayer1=true; restartcmd = new command(重新开始 , command.screen , 0); exitcmd = new command(退出, command.exit , 0); addcommand(restartcmd); addcommand(exitcmd); setcommandlistener(this); 对游戏的胜负进行判断, 每当下一个棋子的时候, 会激活这个方法, 进行判断,在横、纵、正对角线、反对角线上,如果有连续的同色的五棋子,则判断出该色的玩家获胜。privateboolean c

43、heckwin(int x,int y,int chessesvalue) int value = chessesvalue; int xx = x;/循环变量的值int yy = y;/循环变量的值- 13 - int tempx=x,tempy=y;/存储当前传入的值,便于以后从这个点开始进行判断/* * 纵向判断 */ xx=tempx; yy=tempy;/让目前的值与传入的值保持一致int count = 0;/用来计算当前某一方的棋子是否够五个while(yy=0 & chessesyyxx!=null & chessesyyxx.getchessesvalue()

44、=value) count+; yy-; if (yy0)break ; yy=tempy+1; while(yychessmapgrid)break ; if (count = 5) returntrue; /* * 横向判断 */ xx=tempx; yy=tempy;/让目前的值与传入的值保持一致count = 0;/用来计算当前某一方的棋子是否够五个while(xx=0 & chessesyyxx!=null & chessesyyxx.getchessesvalue()=value) - 14 - count+; xx-; if (xx0)break ; xx=tem

45、px+1; while(xxchessmapgrid)break ; if (count = 5) returntrue; /* * 反向对角线 */ xx=tempx; yy=tempy;/让目前的值与传入的值保持一致count = 0;/用来计算当前某一方的棋子是否够五个while(xx=0 & yychessmapgrid & chessesyyxx!=null & chessesyyxx.getchessesvalue()=value) count+; xx-; yy+; if (xxchessmapgrid)break ; xx=tempx+1; yy=tem

46、py-1; while(yy=0 & xxchessmapgrid & chessesyyxx!=null & chessesyyxx.getchessesvalue()=value) count+; xx+; yy-; if (yychessmapgrid)break ; - 15 - if (count = 5) returntrue; /* * 正向对角线 */ xx=tempx; yy=tempy;/让目前的值与传入的值保持一致count = 0;/用来计算当前某一方的棋子是否够五个while(xxchessmapgrid & yychessmapgri

47、d|yychessmapgrid)break ; xx=tempx-1; yy=tempy-1; while(yy=0 & xx=0 & chessesyyxx!=null & chessesyyxx.getchessesvalue()=value) count+; xx-; yy-; if (xx0|yy=0 & chessesyyxx!=null & chessesyyxx.getchessesvalue()=value) count+; yy-; if (yy0)break ; pointy1=yy; yy=tempy+1; while(yyche

48、ssmapgrid)break ; pointy2=yy; if (count = chessesnum& chessespointy1xx=null& - 17 - pointy1=0) temp0=xx; temp1=pointy1; return temp; elseif (count = chessesnum & chessespointy2xx=null & pointy2=0 & chessesyyxx!=null & chessesyyxx.getchessesvalue()=value) count+; xx-; if (xx0)

49、break ; pointx1=xx; xx=tempx+1; while(xxchessmapgrid)break ; pointx2=xx; if (count = chessesnum& chessesyypointx1=null& pointx1=0) temp0=pointx1; - 18 - temp1=yy; return temp; elseif (count = chessesnum & chessesyypointx2=null & pointx2=0 & yychessmapgrid & chessesyyxx!=null

50、& chessesyyxx.getchessesvalue()=value) count+; xx-; yy+; if (xxchessmapgrid)break ; pointx1 = xx; pointy1 = yy; xx=tempx+1; yy=tempy-1; while(yy=0 & xxchessmapgrid & chessesyyxx!=null & chessesyyxx.getchessesvalue()=value) count+; xx+; yy-; if (yychessmapgrid)break ; pointx2 = xx; po

51、inty2 = yy; if (count = chessesnum & chessespointy1pointx1=null & pointx1=0 & pointy1= chessesnum & chessespointy2pointx2=null& pointx2=0) temp0=pointx2; temp1=pointy2; return temp; /* * 正向对角线 */ xx=tempx; yy=tempy;/让目前的值与传入的值保持一致count = 0;/用来计算当前某一方的棋子是否够五个while(xxchessmapgrid &

52、amp; yychessmapgrid|yychessmapgrid)break ; pointx1 = xx; pointy1 = yy; xx=tempx-1; yy=tempy-1; while(yy=0 & xx=0 & chessesyyxx!=null & chessesyyxx.getchessesvalue()=value) count+; xx-; yy-; if (xx0|yy= chessesnum & chessespointy1pointx1=null& pointx1=chessmapgrid & pointy1= c

53、hessesnum & chessespointy2pointx2=null& pointx2=0 & pointy2=0) temp0=pointx2; temp1=pointy2; return temp; temp0=88;/目前没有威胁, 返回一个特殊的值, 让别的方法随机生成一个位置temp1=99; return temp; 另外,还有绘制游戏的主绘制方法paint()方法,绘制棋盘的paintmap() 方法,绘制棋子的paintchesses() 方法,绘制哪方可以下棋的paintselected()方法,绘制玩家的paintplayer()方法,触发键

54、盘的keypressed() 方法,随机产生棋子的 randomchesses()方法。由于篇幅的原因,此处不再累述,详见源码。4.3 双人对战版4.3.1 双人对战版的程序分析与具体实现和上一个版本一样,进入选择菜单里,选择双人挑战版,图 6 双人挑战版- 21 - 同样,双人挑战版也有三个级别,初级、中级、高级三个级别,由于时间的问题,只实现了初级版的,中级版和高级版留作以后扩展开发。具体操作和单机挑战版的操作类似,此处不再累述。进入游戏开始对战。此游戏是两个人用一部手机进行游戏,电脑不再下棋子,而是控制由哪一方来下棋。比如红方在下的时候,白方就不能动键盘。4.3.2 双人对战版的核心类及

55、逻辑实现双人对战版的核心类及逻辑实现基本上和单机挑战版的实现差不多,我把有差异的地方罗列出来。 双人对战版的核心类是gobangcanvas 类,此版本游戏不再由电脑来控制一方玩家了,而是完全由人来玩,所以手机只要控制好玩家的游戏顺序以及游戏的规则即可。红方先下一个棋子的话,进行判断,在横、纵、正对角线、反对角线上是否构成了连续的五个红棋子,如果构成,则结束游戏,得出红方胜利,否则继续游戏,红方下了后,游戏的权限交给白方。白方下一个棋子后,判断如果在横、纵、正对角线、反对角线上有连续的五个白色的棋子的话,同样结束游戏,得出白方胜利。主要的程序如下:protectedsynchronizedvo

56、id keypressed(int keycode) if(!iswin) int action = getgameaction(keycode); if (action = canvas.left ) selectedx=(-selectedx+chessmapgrid+1)%(chessmapgrid+1); elseif (action = canvas.right) selectedx=(+selectedx)%(chessmapgrid+1); elseif (action = canvas.up) selectedy=(-selectedy+chessmapgrid+1)%(che

57、ssmapgrid+1); elseif (action = canvas.down ) selectedy=(+selectedy)%(chessmapgrid+1); elseif (action = canvas.fire ) if(chessesselectedyselectedx=null) chessesselectedyselectedx=newchesses(this.isplayer1); if (chessesselectedyselectedx.isplayer1) chessesselectedyselectedx.setchessesvalue(11); - 22 -

58、 elseif(!(chessesselectedyselectedx.isplayer1) chessesselectedyselectedx.setchessesvalue(10); iswin = checkwin(selectedx,selectedy,chessesselectedyselectedx.getchessesvalue(); this.isplayer1=!this.isplayer1;/切换下棋方 repaint(); 4.4 蓝牙终极版4.4.1 双人对战版的程序分析与具体实现进入游戏菜单,选择蓝牙终极版,然后出现如下界面,选择正方,还是反方。因为蓝牙终极版是基于蓝

59、牙协议,用两部手机,两个人进行游戏的版本。为了让两个玩家不冲突,所以必须要选择一个正方和一个反方,也就是白方和红方。图 7 蓝牙终极版选择了正、反方后,游戏将提示你是否打开蓝牙,你选择是即可。打开了蓝牙后,就可以进行游戏了。因为目前蓝牙还不是官方的标准,是不同厂商所提供的,所以又差异。虽说目前正规的手机厂商基本上统一了蓝牙协议,本游戏是基于 uuid 开发的,但是不同厂商又在此协议上进行自己的定义,所以使得这个版本的游戏不能像上面两个版本一样,只要能支持java 游戏的手机都可以玩。- 23 - 4.4.2 双人对战版的核心类及逻辑实现首先介绍 server类和 client 类,其实蓝牙编程

60、类似于scoket编程,先是服务器端启动,监听来自客户端的信息,如果监听到客户端的连接请求的话,则进行连接,客户端启动后,向服务端发送连接请求,如果被服务器端监听到了后,配合服务器连接。主要代码如下:string connectionurl = btspp:/localhost:f0e0d0c0b0a000908070605040302010; + authenticate=false;encrypt=false;name=rfcomm server; local = localdevice.getlocaldevice(); local.setdiscoverable(discoveryagent.giac); notifier = (streamconnectionnotifier)connector.open (connectionurl); 这是服务器端的关键程序,启动服务器后服务器端的标示地址。privatestaticfinal uuid echo_server_uuid = new uuid( f0e0d0c0b

温馨提示

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

评论

0/150

提交评论