中国象棋入门跟同学下,对手很弱,老是赢打击对方自信,有没有在线的象棋平台可以让子的,不用下载软件网页的

基于Android的中国象棋游戏的设计_冰点文库
当前位置: >>
上海电力学院 本科毕业设计(论文)题 院目: 系:基于 Android 的中国象棋游戏的设计 计算机与信息工程学院 2008 电子科学与技术 丁晓亮 学号: 金一鸣 专业年级: 学生姓名: 指导教师:2012 年 06 月 14 日 基于 Android 的中国象棋游戏的设计摘要随着智能手机的快速普及, 智能手机操作系统市场风生水起。 为了让智能手机用户能够 随时随地查询互联网所提供的服务, 一种高效的办法就是将应用系统的功能拓展到手机终端 上,让手机能够通过移动网以及互联网访问 Web 网站并处理各种各样的业务。因此,智能手 机的应用软件及其需要的服务将有广阔的发展前景。 Android 是开放性体系架构, 而 不仅具 有非常好的开发、调试环境,而且还支持各种可扩展的用户体验,包括丰富的图形组件、多 媒体支持功能以及强大的浏览器。因此,对于软件从业人员来说,Android 平台具有无限的 吸引力。 本文就在分析讨论 Android 手机软件开发技术原理的基础上,为用户开发出基于 Android 平台的中国象棋游戏的软件。 通过对 Android 系统架构和应用开发进行初步研究, 设计一款中国象棋游戏。在对系统进行详细需求分析的基础上,确定了系统的功能和性 能要求,对游戏的菜单界面、屏幕绘制、时间控制、布局算法、音效和动画等进行了设 计,并最终实现了一个界面友好、高效稳定和富有娱乐性的手机益智游戏。关键字:android;中国象棋;智能手机平台I THE DESIGN OF CHINESE CHESS GAME BASED ON ANDROIDAbstractWith the rapid proliferation of smart phones, smart phone operating system market, wind and water. In order for smart phone users to check the Internet anytime, anywhere services provided an efficient way to expand the function of the system will be applied to the mobile phone terminal, the mobile phone to Internet access via mobile networks, and variety of Web sites and process business. Therefore, the smart phone applications and the need for the service will have broad prospects for development. Android's biggest feature is its open architecture, not only has a very good development and debugging environment, but also supports a variety of scalable user experience, including rich graphical components, multimedia support, and powerful browser. Therefore, for software professionals is, Android platform has unlimited appeal. In this paper, the analysis and discussion Android mobile phone software development technology on the basis of the principle, developed to provide users with better platform to the Chinese chess based on Android meteorological software. Through to the Android system structure and application development for preliminary research, designed a Chinese chess game. In the system based on the analysis of the detailed requirements, made sure the system function and performance requirements, to the game menu interface, and the screen rendering, time control, layout algorithm, sound effects and animation, design, and finally achieved a friendly interface, high efficiency and stability and entertaining mobile phone puzzles.Keywords:Android;Chinese chess;Smartphone platformII 目录1 引言 ....................................................................... 1 1.1 研究背景 ............................................................... 1 1.2 研究目的和意义 ......................................................... 2 1.3 论文结构安排 ........................................................... 3 2 ANDROID 操作系统简介 ....................................................... 3 2.1 智能手机系统现状 ....................................................... 3 2.2 ANDROID 的功能特征....................................................... 5 2.3 ANDROID 系统的特点 ...................................................... 7 2.4 ANDROID 的体系结构....................................................... 8 3 ANDROID 开发环境 ........................................................... 9 3.1 操作系统及所需软件 .................................................... 10 3.2 ANDROID 开发环境及变量配置.............................................. 10 3.2.1 安装配置 JDK6 ..................................................... 10 3.2.2 安装配置 SDK ...................................................... 12 3.3 ECLIPSE 的设置 ......................................................... 12 3.4 ANDROID 版本配置 ....................................................... 13 4 应用程序的总体设计 ........................................................ 13 4.1 详细规则 .............................................................. 13 4.2 胜负判定方法 .......................................................... 14 4.3 棋子行走规则 .......................................................... 15 5 功能的设计与实现 .......................................................... 18 5.1 各种相关类的介绍 ...................................................... 19 5.2 过程中的逻辑处理 ...................................................... 21 5.3 棋子走法流程图 ........................................................ 23 5.4 游戏模拟运行 .......................................................... 26 5.5 改进和优化 ............................................................ 29 6 结论 ..................................................................... 30 谢辞 ....................................................................... 31 参考文献.................................................................... 32 附录 ....................................................................... 33 1 引言Android 是 Google 于 2007 年 11 月 05 日宣布的基于 Linux 平台的开源移动操作系统 的名称, 该平台由操作系统、 中间件、 用户界面和应用软件组成。 它采用软件堆层 (Software Stack, 又名软件叠层) 的架构, 主要分为三部分。 底层以 Linux 内核工作为基础, android 系统效果图由 C 语言开发,只提供基本功能;中间层包括函数库 Library 和虚拟机 Virtual Machine,由 C++开发。最上层是各种应用软件,包括通话程序,短信程序等,应用软件则 由各公司自行开发,以 Java 作为编写程序的一部分。不存在任何以往阻碍移动产业创新的 专有权障碍, 号称是首个为移动终端打造的真正开放和完整的移动软件。 Google 通过与软、 硬件开发商、设备制造商、电信运营商等其他有关各方结成深层次的合作伙伴关系,希望能 借助其来建立标准化、 开放式的移动电话软件平台, 在移动产业内形成一个开放式的生态系 统 。[1]1.1 研究背景随着移动通信的发展以及互联网向移动终端的普及, 网络和用户对移动终端的要求越来 越高,而 Symbian,windows Mobile,Palm OS 等手机平台过于封闭,不能很好的满足用户 的需求,因此市场迫切需要一个开放性很强的平台 。 Android 是一个基于 Linux 核心(kernel)的开放手机平台系统。 Windows Mobile、 与 Symbian 等手机系统处在同一级别。对于设备制造商来说,Android 是一个免费的平台。 Android 系统让设备制造商免除每出一台手机,就得被手机系统厂商赚一些钱的情况。 对硬体开发厂商来说,Android 也是个开放的平台 。只要厂商有能力,可以在这个平台 上自由加入特有的装置或功能,不受手机系统厂商的限制。对于手持装置的开发者来说, Android 是个先进的平台。平台上的应用程式可相容于各种型号的 Android 手机,免去 为各种不同手机机型开发的困扰。Android 平台支援各种先进的网路、绘图、3D 处理能 力,可以用来提供更好的使用者体验。对于使用者来说,Android 是一个用于手机的系 统。使用者只要先申请一个免费的 Google 帐户,当使用者想换一台手机时,就可以在 不同厂牌,同样使用 Android 系统平台的手机之间选择,并且很容易地将如联络簿等个 人资料转换到新手机上 。 Android 在 Linux 核心的基础上,提供了各种合用的函数库,和一个完整的应用程1[4] [3] [2] 式框架。 并采用较符合商用限制的 Apache 版权。 Linux 核心的基础上提供 Google 自 在 制的应用程式运行环境(称作 Dalvik, Sun 的 J2ME 不同), 与 并提供基于 Eclipse 整合 开发环境(IDE)的免费、跨平台(Windows、Mac OS X、Linux) 开发工具(SDK),便于应用 程式开发者学习、使用。免费、熟悉的跨平台开发工具,让具备一些物件导向观念,或 视窗程式开发经验的开发者,能在一定时间内上手 。从不同角度来说,Android 代表 着一个崭新的开放原始码系统平台、一个友善的免费应用程式开发环境、一个与世界各 地的程式开发者,站在相同起跑点上的公平竞争机会。而中国象棋作为一款经典的益智 游戏,一直以来都被众多的游戏爱好者喜欢,这个游戏,男女老少皆宜。游戏的吸引力 主要在于,它在让玩家打发时间的同时,可以让人的思维逻辑能力得到锻炼 。[6] [5]1.2 研究目的和意义Android 这个平台对于 Google 对于大众的意义不在于手机本身, Android 存在的目的也 不在于挑起手机操作系统之间的混战,而在于推动移动互联网产业链的迅速成型。 具有开源特性的 Android 平台打破了之前 Symbian、 windows mobile 等操作系统收取高 额的授权费用的模式,使得只能手机成本大大的降低;而正是由于它开发源代码,使得手机 产生更多个性化的应用。同时,合作方能够在这里得到利润或者创造价值,手机软件行业得 到维护协调发展。 以 Google、苹果和诺基亚为中心各自形成的生态链将以原来数倍的速度推动移动互联 网的发展,这正是 Google 推出 Android 平台的意义,也是 Android 平台存在的使命。而作 为 Android 平台成员之一的中国移动也投资成立了一家通讯公司,专门从事 Google 手机软 件的应用以及本地化的软件的开发,比如将在 Google 手机平台上添加飞信、输入法等一系 列符合国内用户使用特色的功能。 国内众多企业也将眼光投入到 Android 上面, 并启动了相 关的计划来深入的理解并发展 Android。更多的手机软件开发企业已经或者筹备着将公司进 行转型,从其方向的开发转向到 Android 的开发 。 综上所述, 无论是在国内还是在国外, Android 平台对手机软件行业和移动手机平台将 发挥极大地推动作用,而在未来的几年或者一段时间内,Android 将越发的凸显自己的重要 性。基于此,我们有必要通过进行相关的研究来了解 Android 平台,来了解开发 Android 的那一大批人的先进的理念和思想, 并通过这些来了解手机软件行业, 进而了解未来无移动 互联网的发展趋势,从而更好的适应时代的需要 。 本课题的目的在于掌握 Java 手机应用开发技术和移动软件平台开发技术。在以 Java2[8] [7] 语言为基础,结合 Android 移动开发平台,并利用 Android 提供的 SDK,完成在 Android 平 台上运行的中国象棋软件。 本课题的意义在于通过开发一款简易中国象棋手机应用软件,可以熟练应用 Android 平台提供的应用程序接口,掌握 Android 平台上的各种应用。1.3 论文结构安排整篇论文共分为六个部分,其主要内容安排如下: 第 1 章 引言。介绍论文的研究背景、目的和意义。包括课题的背景资料简介、国 内外研究现状和发展趋势、深入地介绍了课题研究的价值以及对未来的影响。 第 2 章 Android 操作系统简介。这部分主要是介绍了智能手机系统现状、Android 的 功能特征、Android 系统的特点以及 Android 的体系结构。 第 3 章 Android 开发环境。 这部分主要介绍了 Eclipse 和 android 开发环境的搭建。 第 4 章 应用程序的总体设计。 这部分主要介绍了中国象棋的详细规则及胜负判定方 法和棋子的行走规则。 第 5 章 功能的设计与实现。这部分主要介绍了游戏的界面、游戏中的逻辑处理以及 该游戏今后的改进和优化。 第 6 章 结论。对整篇论文加以总结与回顾以及对未来的展望。2 Android 操作系统简介Android是基于Linux内核的操作系统,早期由Google开发,后由开放手机联盟开发。它 采用了软件堆层的架构,主要分为三部分。底层以Linux内核工作为基础,只提供基本功能; 其他的应用软件则由各公司自行开发,以Java作为编写程序的一部分。另外,为了推广此技 术,Google和其它几十个手机公司建立了开放手机联盟。目前最新版本为Android4.0 。[9]2.1智能手机系统现状手机操作系统是时下最火热的话题之一, 大家都在追随不断新出的操作系统。 虽然它的 火热程度在持续高涨,但是手机操作系统的发展并不是那么长久。在 2002 年之前,并没有 严格意义上的手机操作系统, 因为能完成通话功能的手机都是由厂家自己做芯片, 然后配上 相应的软件就可以完成。不过此后,手机的品种越来越多,发展也越来越快,随着人们对手3 机的需求也越来越大,智能手机和手机操作系统就应运而生了 目前热门的手机操作系统主要有 5 种: (1)塞班(Symbian)[10]。昔日的行业大哥,这个日渐落寞的操作系统,曾经红遍天下。但是随着近些年苹果和谷 歌的发力,一直在走下坡路,塞班的市场份额已经降到了谷底。有统计显示,到去年年底, 塞班系统的全球市场占有量仅有 22.1%。虽然基本的常用软件非常的丰富,但是塞班系统弊 病不断,在更激烈的竞争中败下阵来。随着塞班的沦陷,诺基亚也沦落了。曾经,诺基亚在 芬兰几乎是国家的象征。现在,为了改变颓势,又需要寻求突围了。 代表手机:诺基亚,索尼爱立信、LG (2)安卓(Android) 2008 年,谷歌发布了 Android 操作系统,从此智能手机操作系统界不再安静。2009 年, 原来引用塞班平台的厂商,比如 LG、索尼爱立信等纷纷退出塞班平台,投入 Android 领域。 不久,Android 系统就取代了塞班成为智能手机操作系统的霸主。在 2011 年的第一季度, Android 在全球的市场份额就已经超过了塞班,位居世界第一。到了 2011 年底,Android 占据了全球 52.5%的份额。Android 手机的软件非常的丰富,而且基本都是免费的,可以通 过多个应用商店下载。另外,Android 的本地化也做得很好,刷机非常方便[11]。代表手机:三星,HTC,小米,索尼爱立信、魅族、摩托罗拉,中兴,华为等。 (3)iOS 这么多操作系统中,可以说苹果的使用体验是最好的。Android 虽然是霸主地位,但是 系统却没有 iOS 完美。iOS 不是开放的系统,它的很多应用多需要付费才能使用。 (4)Windows Phone Windows Phone 发布于 2010 年 10 月,作为微软移动的筹码,正式与 Android 和 iOS 竞 争。 2011 年 2 月, 诺基亚与微软合作, 试图挽回失去的大局。 现在已经更新至 Windows Phone 7.6 了,大家十分期待的 Windows Phone 8 也将在今年第四季度发布。尽管如此,Windows Phone 可以说是不够成熟的,在中国,行货手机非常少,而且本地化做得也不是特别好。如 果有一天,Windows Phone 大面积在中国开卖,相信市场一定会有的,毕竟现在苹果和安卓 已经满大街都是了,再加上诺基亚的“砸核桃”功能,一定会引来一阵高潮。 代表手机:三星,HTC, LG,中兴等 (5)黑莓(Black Berry) 黑莓在欧美市场是第一商务智能手机,引入中国后,主要面向政企集团客户,苏宁是独 家的销售渠道,不过,国内市场有很多渠道可以买到水货。从市场来看,黑莓在中国并没有4 那么受欢迎,软件资源也不是那么丰富。 总结: 移动互联网在一轮又一轮的掀起高潮, 这中间智能手机操作系统起到了至关重要 的作用。从目前市场来看,主要的竞争还是在于微软、苹果和谷歌之间,三大操作系统可谓 是三足鼎立。过不了多久,Windows Phone 8 就要出来了,相信到时候市场又会有很大的不 同,坐观其变。 手机应用开发中的 Java 技术有如下特点: 在信息社会中手机及其他无线设备越来越多的走进普通百姓的工作和生活随着信息网 络化的不断进展手机及其他无线设备上网络势在必行。但是传统手机存在以下弊端: 首先传统手机出厂时均由硬件厂商固化程序, 程序不能增加、 删除有了错误也不能更新、 修改若要增加新功能必须另换一部手机。 其次传统手机访问互联网是通过 WAPWireless Application Protocal 所有网络资源必 须接通网络才能在线访问非常耗时、 费用亦很高。 而 Java 技术在无线应用方面的优势非常 明显: (1) 应用程序可按需下载而不是购买由硬件商提供的套件可升级空间大。 (2) Java 技术提供了一个类库它使的应用,开发商可以创建更为直觉、丰富的用户界 面。 (3) Java 技术使网络带宽的应用更为有效因为应用程序可以下载到器件上并在本地运 行仅仅是在连接到服务器时才会占用网络带宽[12]。基于以上分析 Java 手机将是未来手机的发展方向是业界的热点。本次设计正是基于当 前热门的 android 手机应用开发,也就是采用 Java 语言编程开发。2.2 Android 的功能特征(l)应用程序架构:在应用程序架构内已经具备多种不同的基础组件,在开发应用程序 时,就可以直接调用这些组件来使用,可以节省开发应用程序的心力及时间。 (2)Dalvik 虚拟机器:在 Android 平台上所使用 Java 虚拟机, 不是 Sim 公司的标准 Java 虚拟机, 而是使用 Google 自主开发的代号为 Dalvik 的虚拟机, 它在保证 API 方面的兼容的 同时,针对移动手机进行了大幅优化,占用资源更小,运行效率更高。 (3)集成的浏览器:集成的浏览器是 Android 内建的浏览器,是以 WebKit 的浏览引擎为 基础所开发成的。WedKit 是一个开源浏览器网页排版引擎,目前使用 WebKit 引擎的浏览器 主要有:Safari,Midori,Epiphany 等。配合 Android 手机的功能,可以在浏览网页时,达 到更好的效果,例如:局部性的缩放网页上的资讯、触控式的操作等效果。5 (4)优化的绘图能力:在程序里可以用到的绘图功能分为 2D 与 3D 两个方面。 2D 方面, 在 Android 提供了一套特有的类库(SGL;而在 3D 方面则是使用 OpenGLES1.0(openGL for Embedded systems)规范的类库。它们是一种非常快的图形引擎,并且支持硬件加速。 (5)SQLite 数据库:SQLite 提供结构化的数据存取。SQLite 是一款轻型的数据库,它的 设计目标是嵌入式的,目前已经在很多嵌入式产品中使用了它,它占用的资源非常低。它能 够支持 Windows/Linux/U nix 等主流的操作系统,同时能够跟很多程序语言相结合,比如 php,Java 等,还有 ODBC 接口,同样比起 Mysql,PostgreSQL 来讲,它的处理速度比它们 都快。它无需安装和管理配置,它是一个储存在单一磁盘文件中的完整数据库,体积小只有 250KB 但支持数据库大小至 2TB。它虽然很小巧,但是支持的 SQL 语句毫不逊色于其它开源 数据库。同时它还支持事务功能和并发处理等等。SQLite 也是一套开放性的关联式资料库, 其特点在于轻量性方面的设计结构,更适合在手机上使用。 (6)多媒体的支持能力:主要用于播放媒体文件。这同时包括对音频(如播放 MP3 或其他 音乐文件等)和视频(如播放从网上下载的视频)的支持,并支持“播放 URI 地址”(Note:URI 即是统一资源识别地址)模式—在网络上直接播放的流媒体。另外支持各种通用的静态图像 格式,例如:JPG、PNG、GIF 等格式。 (7)GSM 技术:Global System for Mobile Communications,即全球移动通讯系统,俗 称”全球通” ,是一种起源于欧洲的移动通信技术标准,是第二代移动通信技术,其开发目 的是让全球各地可以共同使用一个移动电话网络标准,让用户使用一部手机就能行遍全球。 GSM 技术是属于手机硬件方面的展现, 也是在开发 Android 应用程序时可以突出的特点之一。 (8)蓝牙、EDGE、3G 及 Wi-Fi:蓝牙是一种新型、 开放、 低成本、短距离的无线连接技术, 可取代短距离的电缆,实现话音和数据的无线传输。EDGE(Enhanced Data Rate for GSM, Evolution),即增强型数据速率 GSM 演进技术。EDGE 是一种从 GSM 到 3G 的过渡技术,它主 要是在 GSM 系统中采用了一种新的调制方法,即最先进的多时隙操作和 SPSK 调制技术。由 于 8PSK 可将现有 GSM 网络采用的 GMSK 调制技术的信号空间从 2 扩展到 8, 从而使每个符号 所包含的信息是原来的 4 倍。Wi-Fi(WirelessFidelity),即无线保真技术,与蓝牙技术一 样, 同属于在办公室和家庭中使用的短距离无线技术。 该技术使用的是 2.4GHz 附近的频段, 该频段目前尚属没用许可的无线频段。其目前可使用的标准有两个,分别是 IEEE802.lla 和 IEEE802.11b。这些通讯能力也是属于手机硬件方面的展现,也是在开发 Android 应用程 序时可以突出的特点之一。 (9)GPS: Global Positioning System,即全球定位系统,它是一个由覆盖全球的 246 颗卫星组成的卫星系统。 这个系统可以保证在任意时刻和任何地点都可以同时观测到 4 颗卫 星,以保证卫星可以采集到该观测点的经纬度和高度,以便实现导航、定位、授时等功能。 这项技术可以用来引导飞机、 船舶、 车辆以及个人。 这个同样也是属于手机硬体方面的体现, 也是在开发 Android 应用程序是可以突出的特点之一[13]。2.3 Android 系统的特点Android 系统具有如下 5 个特点: 1.开放性。Google 与开放手机联盟合作开发了 Android,Google 通过与运营商、设 备制造商、开发商和其他有关各方结成深层次的合作伙伴关系,希望通过建立标准化、 开放式的移动电话软件平台,在移动产业内形成一个开放式的生态系统。 2. 应 用 程 序 无 界 限 。 Android 上 的 应 用 程 序 可 以 通 过 标 准 API ( Application Programming Interface,应用程序编程接口)访问核心移动设备功能。通过互联网,应 用程序可以声明它们的功能可供其他应用程序使用。 3.应用程序是在平等的条件下创建的。移动设备上的应用程序可以被替换或扩展, 即使是拨号程序或主屏幕这样的核心组件。 4.应用程序可以轻松地嵌入网络。应用程序可以轻松地嵌入 HTML、JavaScript 和 样式表,还可以通过 WebView 显示网络内容。 5.应用程序可以并行运行。Android 是一种完整的多任务环境,应用程序可以在其 中并行运行。在后台运行时,应用程序可以生成通知以引动注意[14]。每个 Android 应用程序都存在于它自己的世界之中:默认情况下,每个应用程序均 运行于它自己的 Linux 进程中。当应用程序中的任意代码开始执行时,Android 启动一 个进程,而当不再需要此进程而其它应用程序又需要系统资源时,则关闭这个进程。 每 个进程都运行于自己的 Java 虚拟机(VM)中。所以应用程序代码实际上与其它应用程序 的代码是隔绝的。 默认情况下,每个应用程序均被赋予一个唯一的 Linux 用户 ID,并 加以权限设置,使得应用程序的文件仅对这个用户、这个应用程序可见。当然,也有其 它的方法使得这些文件同样能为别的应用程序所访问。 使两个应用程序共有同一个用户 ID 是可行的,这种情况下他们可以看到彼此的文 件。从系统资源维护的角度来看,拥有同一个 ID 的应用程序也将在运行时使用同一个 Linux 进程,以及同一个虚拟机[15]。7 2.4 Android 的体系结构Android平台是一组面向移动设备的软件包,它包含了一个操作系统、中间件和关键应 用程序。开发人员可以使用Android SDK(软件开发工具包)为这个平台创造应用程序。应用 程序使用Java语言编写并在Dalvik之内运行。 Dalvik是一款量身定制的虚拟机, 它专为嵌入 式应用设计,运行在Linux内核上层[16]。(1)Android架构如下图 2.1 显示了 Android 操作系统的主要组件。图 2.1 Android 操作系统的主要组件(2)Linux 内核Android依赖Linux 2.6版,提供核心系统服务:安全、内存管理、进程管理、网络 组、驱动模型。内核部分还相当于一个介于硬件层和系统中其他软件组之间的一个抽象层 次。 (3)应用框架 Android的核心应用程序就是依赖框架层次API开发的, 程序员们可以充分使用这些API。 应用架构设计的初衷是:简化组件复用机制;任何应用都能发布自己的功能,这些功能又可 以被任何其他应用使用(当然要受来自框架的强制安全规范的约束) 。和复用机制相同,框8 架允许组件的更换[17]。(4)C/C++库Android包含一套C/C++库,Android系统的各式组件都在使用。这些功能通过Android 应用框架暴露给开发人员。Android的核心类库提供Java类库所提供的绝大部分功能。每个 Android应用都运行在自己的进程上,享有Dalvik虚拟机为它分配的专有实例。为了支持多 个虚拟机在同一个设备上高效运行,Dalvik被改写过。 Dalvik虚拟机执行的是Dalvik格式 的可执行文件(.dex)该格式经过优化,以降低内存耗用到最低。Java编译器将Java源文件 转为class文件,class文件又被内置的dx工具转化为dex格式文件,这种文件在Dalvik虚拟 机上注册并运行。在一些底层功能——比如线程和低内存管理方面,Dalvik虚拟机是依赖 Linux内核的。(5) 应用的构成对于一个 Android 应用程序来说,是由 Activity、IntentReceiver、Service、Content Provider 四部分组成,但并不是每一个 Android 应用程序都必须由这四部分组成。在应用 程序中使用时,需要在配置文件 AndroidManifest.xml 中进行配置。这个配置文件是每个 Android 应用程序所必需的,用于定义应用程序的组件、组件的功能以及必要条件等 Android 应用的构成和工作流程如图 2-2:[18]。Internet 通过 Internet 实现 活动之间的转换 ActivityContent Provider 通过 Content Provider 进行数据存储 存储设备 ActivityInternet Receiver通过 Internet Receiver 对外部事件进行响应 外部事件通过 Binder 对 Service 进行绑定 ServiceBinder图 2-2 Android 的构成3 Android开发环境9 Eclipse 是替代 IBM Visual Age for Java 的下一代 IDE 开发环境,但它未来的目标 不仅仅是成为专门开发 Java 程序的 IDE 环境,根据 Eclipse 的体系结构,通过开发插件, 它能扩展到任何语言的开发,甚至能成为图片绘制的工具。目前,Eclipse 可以提供 C 语言 开发的功能插件。更可贵的是,Eclipse 是一个开放源代码的项目,任何人都可以下载 Eclipse 的源代码,并且在此基础上开发自己的功能插件。也就是说未来只要有人需要,就 会有建立在 Eclipse 之上的 COBOL,Perl,Python 等语言的开发插件出现。同时可以通过开 发新的插件扩展现有插件的功能, 比如再现有 Java 开发环境中加入 Tomcat 服务插件。 可以 无限扩展,而且有着统一的外观,操作和系统资源管理,这也正是 Eclipse 的潜力所在[19]。3.1 操作系统及所需软件编写Android的应用程序,需要一套个人电脑系统。至于操作系统的部份,几个主流操 作系统都有支持。支持的操作系统如下:Windows XP 、Vista或Windows 7。 在开始搭建 Android 的开发环境之前,需要准备的软件包如下: (1)JDK6 (jdk-6u21-windows-i586.exe) (2)Eclipse(eclipse-java-galileo-SR2-win32.zip) (3)Android SDK 1.6(android-sdk-windows-1.6_r1.zip) (4)Android SDK Setup(android-sdk_r06-windows.zip) (5)ADT 0.9.7(ADT-0.9.7.zip)3.2 Android 开发环境及变量配置Eclipse 设计的美妙之处,在于所有东西都是外挂,除了底层的核心以外。这种外挂设 计让 Eclipse 具备强大扩充性,但更重要的是,此平台提供一个定义明确的机制,让各种外 挂程序共通合作(透过延伸点 extension points)与贡献(contributions),因此新功 能可以轻易且无缝地加入平台[20]。3.2.1 安装配置 JDK6下载后安装是下的解压包那就解压到某目录,例如解压到是 C:\Java\jdk1.6.0_20;右 键点击我的电脑 -& 属性 -& 高级, 点击下面的环境变量, 在下面的“系统变量”处选择新 建在变量名处输入 JAVA_HOME 变量值中输入刚才的目录,比如我的是在目录10 C:\Java\jdk1.6.0_20 下;效果如图 3-1 所示:图 3-1 进入环境变量 确定后再新建一个变量名为 CLASSPATH,变量值 为 %JAVA_HOME%/lib/rt.%JAVA_HOME%/lib/tools.jar , 确定后找到 Path 的变量, 双 击或点击编辑,在变量值最前面加上%JAVA_HOME%/ 注意里面的是,确定、确定、确 定后即可。具体如下图 3-2 所示:11 图 3-2 环境变量的设置 接着在 “开始-&运行” ,输入cmd,然后在命令行提示符中输入:java -version,如果 能够看到java version “1.6.0_20″信息;就表示JDK安装成功。 3.2.2 安装配置SDK 将下载 android-sdk-windows-1.6_r1.zip 解压缩到 C:\android-sdk-windows-1.6_r1 目录中。新建一个“系统变量” ,在“变量名”中填 Android_Home,在“变量值”加填 C:\android-sdk-windows-1.6_r1 。“ 编 辑 ” PATH 变 量 , 在 “ 变 量 值 ” 后 面 加 上;%Android_Home%\tools。这样,Android SDK 1.6 就安装好了。 “开始-&运行” ,输入 cmd, 然后在命令行提示符中输入:android -help,应该能够看到帮助信息;Android SDK 1.6 安装成功。3.3 Eclipse 的设置将下载到的 Eclipse 解压缩到 C:\eclipse,然后进入这个文件夹,双击 eclipse.exe, 启动 Eclipse。关联 Adnroid SDK:菜单“Windows-&Preferences” ,打开 Preferences 对话 框, 点击 Android, 在右侧的 Android Reference 中, SDK Location 文本框右侧的 Browse? 点 按钮,找到 C:\android-sdk-windows-1.6_r1, “确定” 。安装 ADT:菜单“Help -& Install New Software?” ,打开 Install 对话框,点击 Add?按钮,添加站点(Add Site) ,在 Name12 中填 ADT,在 Location 中填 https://dl-/android/eclipse/。然后,下载 安装 ADT。第四步,解压 Android SDK Setup,下载更新 Android SDK 2.0 和 2.1 将下载到 的 android-sdk_r04-windows.zip 解压缩到 C:\android-sdk-windows,然后进入这个文件 夹,双击 SDK Setup.exe,启动 Android SDK and AVD Manager,选中左侧 Settings 项,然 后在右侧面板选中 Force https://? sources to be fetched using http://,然后选择 Save & Apply。3.4 Android 版本配置在 Eclipse 中,Window & Android SDK and AVD Manager,选择左侧 Available Package, 在右侧 Sites,Packages and Archives 列表中勾选出 SDK Platform Android 2.1, API 7 revision 2 和 SDK Platform Android 2.2, API 8 revision 2,点击界面右下方&Install Selected&, 开始升级至 Android SDK 2.1 和 Android SDK 2.2。 到此, Windows 下的 Android 在 2.2 开发环境就搭建成功了[21]。4 应用程序的总体设计4.1 详细规则1.认识棋盘和棋子(1)棋盘 棋子活动的场所,叫做&棋盘&,在长方形的平面上,绘有九条平行的竖线和十条平行 的横线相交组成,共九十个交叉点,棋子就摆在这些交叉点上。中间第五、第六两横线之间 未画竖线的空白地带, 称为&河界&, 整个棋盘就以&河界&分为相等的两部分; 两方将帅坐镇、 画有&米&字方格的地方,叫做&九宫&。 (2)棋子 象棋的棋子共三十二个,分为红黑两组,各十六个,由对弈双方各执一组,每组兵种是 一样的,各分为七种: 红方:帅(1)、仕(2)、相(2)、车(2)、马(2)、炮(2)、兵(5) 黑方:将(1)、士(2)、象(2)、车(2)、马(2)、炮(2)、卒(5)2.走棋和吃子对局时,由执红棋的一方先走,双方轮流各走一着,直至分出胜、负、和,对局即终 了。轮到走棋的一方,将某个棋子从一个交叉点走到另一个交叉点,或者吃掉对方的棋子而13 占领其交叉点,都算走一着。双方各走一着,称为一个回合。 各种棋子的走法: (1)帅 (将) 帅和将是棋中的首脑, : 是双方竭力争夺的目标。 它只能在&九宫&之内活动, 可上可下,可左可右,每次走动只能按竖线或横线走动一格。帅与将不能在同一直线上直接 对面,否则走方判负。 (2)仕(士) :仕(士)是帅(将)的贴身保镖,它也只能在九宫内走动。它的行棋路径 只能是九宫内的斜线。 (3)相(象) :相(象)的主要作用是防守,保护自己的帅(将) 。它的走法是每次循对 角线走两格,俗称&象走田&。相(象)的活动范围限于&河界&以内的本方阵地,不能过河, 且如果它走的&田&字中央有一个棋子,就不能走,俗称&塞象眼&。 (4)车:车在象棋中威力最大,无论横线、竖线均可行走,只要无子阻拦,步数不受限 制。因此,一车可以控制十七个点,故有&一车十子寒&之称。 (5)炮:炮在不吃子的时候,走动与车完全相同。 (6)马:马走动的方法是一直一斜,即先横着或直着走一格,然后再斜着走一个对角线, 俗称&马走日&。马一次可走的选择点可以达到四周的八个点,故有&八面威风&之说。如果在 要去的方向有别的棋子挡住,马就无法走过去,俗称&蹩马腿&。 (7)兵(卒) :兵(卒)在未过河前,只能向前一步步走,过河以后,除不能后退外,允 许左右移动,但也只能一次一步。3.吃子任何棋子走动时,如果目标位置上有对方的棋子,就可以把对方的棋子拿出棋盘,再换 上自己的棋子(即&吃子&) 。只有炮的吃子方式与其他子不同:炮与被吃子之间必须隔一个 棋子,进行跳吃,俗称&架炮&或&炮打隔子&。4.将军、应将、将死、困毙一方的棋子攻击对方的帅(将) ,并在下一着要把它吃掉,称为&将军&,或简称&将&。 被&将军&的一方必须立即&应将&,即用自卫的着法去化解被&将&的状态。 如果被&将军&而 无法&应将&,就算被&将死&。轮到走棋的一方,帅(将)虽没被对方&军&,却被禁在一个位 置上无路可走,同时己方其它棋子也都不能走动,就算被&困毙&。4.2 胜负判定方法胜、负、和对局时,一方出现下列情况之一,为输棋(负) ,对方取胜: (1) 帅(将)被对方&将死&,即被对方将军却无法应将; (2)被&困毙&,即虽未被对方将军,本方却已无棋可走动;14 (3)自己宣布认输。 (4)一方长将不变,长将一方算输。 出现以下情况,算和局: (1) 一方轮走时,提议作和,对方同意; (2)双方长将不变,符合&棋例&中&不变作和&的规定,双方又不愿变着时。4.3 棋子行走规则中国象棋的&士&是宫廷卫士,司&九宫&安全,不离&帅(将)&左右; &象&是臣相,只 能于本土飞来飞去。 如此宠大的护卫部队削弱了攻击的 力量, 另一方面却增强了防御体系, 即使前线战士全部马革裹尸还, 也可能杀和敌军的骚扰, 这些反映出中国君王传统的求稳怕 乱的心理和习惯。国际象棋没有后勤人员的设置,它的&象&是指教士,分黑的格象,能满盘 飞舞,黑格角的格象各司职互不相交,暗示着东正教、天主教对中世纪欧洲的影响。 中国象棋的&兵(卒)&只能一步步向前走,不能后退,虽有&过河小卒当小车&之说,但 它终究是&卒&,到头无非一&老卒&而矣,隐喻着&生死有命、富贵在天&的愚民信条。国际象 棋的&兵&虽然也只能前进, 但它走到对方底线可开格为&王&之外的任何一子, 这展现了西方 进取、升迁的欲望和机会。象棋有法度森严的精神,中国象棋对棋子的限制尤为突出,区区 十六个子有五个不能过河,&士、象&有法定的路线,&马&有拐脚之制约, 纵是千里马一旦 受制也难以纵横驰骋,表现着压抑个性的封建体制。国际象棋没有对棋子的过多约束,反射 着西方豪迈不羁、自由奔放的个人发展。(1)车行走规则图 4-1 车行走规则图 如上图 4-1 是车行走规则图,首先车的位置在棋盘四角,车走直线分为横向和纵向,如 果走横向,先判断终点有没有落子,如果没有,就可走,如果有落子,再判断是敌方还是自 己的棋子, 如果是敌方的棋子可以落到对方位置并且吃了对方的棋子, 如果是自己的棋子就 不可走。15 (2)马行走规则图 4-2 马行走规则图 如上图 4-2 是马行走规则图,首先判断马在棋盘上的位置,再判断马行走的规则,马行 日,就是行走日的对角线,当然这个日子也可以是横着的,当然还要注意马别腿的走法,如 果别腿就不可走, 判断别腿是看马走的日子中间一条横线上紧挨着马的位置是否有棋子, 如 果有棋子,就是马别腿,不可走,如果没有棋子就是可以走了。(3)士行走规则图 4-3 士行走规则图 如上图 4-3 是士的行走规则图, 士位于九宫格中, 起始位置在帅或将的旁边与相的旁边, 士的走法首先不能出九宫格,还有只能走斜线,实际上可走的位置只在五个地方,九宫格的 四角和中心,并且判断不能有自己一方的棋子才可走。中国象棋的&士&是宫廷卫士,司&九 宫&安全,不离&帅(将)&左右。(4)炮行走规则图16 图 4-4 炮行走规则图 如上图 4-4 是炮行走规则图。炮的走法和车的走法类似,也是可以横向走和纵向走,当 终点没有棋子时,可以走到终点位置,但是炮的吃子和车不同,车是横向纵向遇到敌方棋子 直接吃,但是炮不同,炮要隔一颗子吃后面的棋子,当然必须在一条直线上才可以,隔的子 可以是对方的也可以是自己的。(5)象行走规则图图 4-5 象行走规则图 如上图 4-5 是象行走规则图。 象走田, 象行走必须以田的对角线行走, 还有象不能过河, 只能在自己一方行走,象行走也要注意别腿地方,象走田。如果田的中心也就是象心有棋子 的话,象就别腿了,就不能到达终点。根据象的起始位置还有不能过河,象能走位置只有七 个地方。(6)兵行走规则图17 图 4-6 兵(卒)行走规则图 如上图 4-6 为兵行走规则图。兵的行规则是未过河只能往前走,不能后退或者左右走, 过河之后能左右行走还是不能后退,无论过不过河,都只能每次行走一步。(7)将或帅行走规则图图 4-7 将(帅)行走规则图 如上图 4-7 是将(帅)行走规则图。将(帅)作为双方的指挥者,首位置在两个士的正 中心,将的行走范围也是不能出九宫格,而且在九宫格内只能走直线,并且每次只能行走一 步。将(帅)是象棋游戏的关键,一旦将(帅)这颗子被对方吃了,整个游戏就代表输了。5 功能的设计与实现在程序开发阶段, 首先确定 “基于 android 的中国象棋游戏的设计” 的工程名为 chess, 据程序模块设计的内容,建立 chess 工程。Chess 工程源代码的结构如图 5-1 所示。18 图 5-1 项目结构图5.1 各种相关类的介绍图 5-2 游戏框架图 1. 共有类是整个游戏的控制器,主要负责游戏切屏操作,在游戏的开发过程中,需要 先对该类进行开发。 2. 辅助界面相关类的介绍 通过图 5-2 能形象显示出该游戏的框架。19 欢迎界面 WelcomeView 欢迎界面通过 WelcomeViewThread 类改变坐标实现动画效果 欢迎界面动画生成类 WelcomeViewThread 菜单界面 MenuView 帮助界面 HelpView 介绍游戏的玩法 3.游戏界面相关类的介绍图 5-3 游戏界面的框架图 如图 5-3 显示游戏界面的框架。 (1)游戏界面 GameView 该类是整个程序最主要的类,是主游戏的界面 该界面继承自 SurfaceView 并实现了 SurfaceHolder.Callback 接口 其中包含了一个刷帧的线程类 (2)走法类 ChessMove 该类为棋子的一个走法 包含是什么棋子 起始点的位置 目标点的位置 以及估值时所用到的 score (3)思考时间线程 TimeThread 该类为计算思考时间的线程类 谁正在思考,该类便将谁的总思考时间加一 (4)规则类 Guize 该类是象棋的规则类,其他类通过调用 canMove 方法给出起始位置与结束位置20 其他类通过调用 searchAGoodMove 方法得到最当然棋局最好的走法 而其中的 allPossibleMoves 方法得到的是当前棋局的所有的走法5.2 过程中的逻辑处理当点击棋盘时,先行判断当前玩家是否有已经选中的棋子,如果没有则选中。如果之前 有选中的棋子,再判断点击位置是否为空,是对方棋子还是自己棋子。 第一步:当点击棋盘时,先行判断是否玩家走棋。 第二步:然后再判断当前玩家是否有选中的棋子,如果没有则选中。 第三步:如果之前有选中的棋子,再判断点击的位置是否为空地,对方的棋子还是自己 的棋子。 第四步:是空地则判断是否可走。 第五步:是对方的棋子同样判断是否可走,能走自然能吃子。 该步骤的部分程序: else if(status == 0){//游戏中时 if(event.getX()&10&&event.getX()&310 && event.getY()&10 && event.getY()&360){//点击的位置在棋盘内时 if(caiPan == true){//如果是该玩家走棋 int i = -1, j = -1; int[] pos = getPos(event);//根据坐标换算成所在的行和列 i = pos[0]; j = pos[1]; if(focus == false){//之前没有选中的棋子 if(qizi[i][j] != 0){//点击的位置有棋子 if(qizi[i][j] & 7){//点击的是自己的棋子。即下面黑子 selectqizi = qizi[i][j];//将该棋子设为选中的棋子 focus =//标记当前有选中的棋子 startI = startJ = } } } else{//之前选中过棋子 if(qizi[i][j] != 0){//点击的位置有棋子 if(qizi[i][j] & 7){//如果是自己的棋子. selectqizi = qizi[i][j];//将该棋子设为选中的棋子 startI = startJ = } else{//如果是对方的棋子 endI =21 endJ =//保存该点 boolean canMove = guiZe.canMove(qizi, startI, startJ, endI, endJ); if(canMove){//如果可以移动过去 caiPan =//不让玩家走了 if(qizi[endI][endJ] == 1 || qizi[endI][endJ] == 8){//如果是“帅”或“将” this.success();//胜利了 } else{ if(activity.isSound){ go.start();//播放下棋声音 } qizi[endI][endJ] = qizi[startI][startJ];// 移动棋子 qizi[startI][startJ] = 0;//将原来处设空 startI = -1; startJ = -1; endI = -1; endJ = -1;//还原保存点 focus =//标记当前没有选中棋子 ChessMove cm = guiZe.searchAGoodMove(qizi);//根据当前局势查询一个最好的走 法 if(activity.isSound){ go.start();//播放下棋声音 } qizi[cm.toX][cm.toY] = qizi[cm.fromX][cm.fromY];//移动棋子 qizi[cm.fromX][cm.fromY] = 0; caiPan =//恢复玩家响应 } } } }//end点击的位置有棋子 else{//如果点击的位置没有棋子 endI = endJ = boolean canMove = guiZe.canMove(qizi, startI, startJ, endI, endJ);//查看是否可走 if(canMove){//如果可以移动 caiPan =//不让玩家走了 if(activity.isSound){ go.start();//播放下棋声音22 } qizi[endI][endJ] = qizi[startI][startJ];//移动棋子 qizi[startI][startJ] = 0;//将原来处置空 startI = -1; startJ = -1; endI = -1; endJ = -1;//还原保存点 focus =//标志位设false ChessMove cm = guiZe.searchAGoodMove(qizi);//得到一步走法 if(qizi[cm.toX][cm.toY] == 8){//电脑吃了您的将 status = 2;//切换游戏状态为失败 } if(activity.isSound){//需要播放声音时 go.start();//播放下棋声音 } qizi[cm.toX][cm.toY] = qizi[cm.fromX][cm.fromY];//移动棋子 qizi[cm.fromX][cm.fromY] = 0; caiPan =//恢复玩家响应 } } }//end 之前选中过棋子 } }//end点击的位置在棋盘内时 }//end游戏中时 } return super.onTouchEvent(event); } Guize 类是对这些规则进行封装,当玩家要走某步棋的时候需要通过该类判断是否可 走。 该类是象棋的规则类, 其他类通过调用 canMove 方法给出起始位置与结束置, 其他类通 过调用 searchAGoodMove 方法得到最当然棋局最好的走法,而其中的 allPossibleMoves 方 法得到的是当前棋局的所有的走法。 游戏的策划是游戏开发过和中的最重要的一个开发环节, 只有写好了游戏策划才能继续 游戏开发, 游戏策划是游戏开发的一个流程, 把策划写好了就可以近照策划一步步进行开发, 可见策划的重要性。 到此本游戏的功能已经基本开发完成, 但是仍有很多方面需要改进和优 化。5.3 棋子走法流程图23 图 5-4 棋盘位置流程图 如图 5-4 是棋盘形状图,通过经 X,Y 轴坐标的判断棋盘的大小,棋盘的落子位置先画 出棋盘横线,再计算棋盘的竖线,横线和竖线交叉的位置就是棋子的落点。这样整个棋盘形 状大小就出来了。棋盘的位置就是通过这种坐标实现的。 游戏开始时各个棋子(车、 马、炮、 象、士,将、帅、兵、卒)它们的开始的位置都确定了,通过坐标,机器可以准确的将棋子 移到指定的位置,人机对弈时,人点击棋子进行移动时,机器通过坐标计算同时进行移动到 人指定的位置, 通过坐标可以计算出棋盘每个落子点的位置, 再根据规则类计算棋子落点是 否符合象棋规则,如果不符合,就不能进行移动,还要注意特别的捌腿事件。符合象棋走法 规则也不一定能下,还要注意象、马捌腿,象心等关键地方。没有违反这些规则才能下到指 定的地点。24 图 5-5 棋子移动流程图 如图 5-5 为人行走时棋子移动流程图, 本游戏为人机对弈的象棋游戏, 本图是人走的流 程图,人行走是用鼠键点击的方式,先用鼠标点击要走的棋子获取棋子对象,按下鼠标拖到 终点位置,由机器检测通坐标确定终点位置,再把棋子由起点位置移动到终点位置。下一步 由机器行走。25 图 5-6 获取棋子流程图 如图 5-6 是人或者机器移动棋子时,获取棋子对象,使棋盘释放棋子对象,再将释放传 给棋盘,释放响应事件。图 5-7 规则流程图 如图 5-7 是象棋规则图, ,第一步检查覆盖区域是否包含棋点,没有放回原处,如果有 再判断该点上否有棋子, 如果没有棋子并且符合象棋规则就放在棋点上, 不符合规则放回原 点,如果该棋点有棋子的话,再判断两棋子是否同一方,是同一方,该棋子放回原处,如果 不同,符合规则就放到棋点上并吃掉对方的棋子,如果不符合规则放回原处。5.4 游戏模拟运行如图 5-8 运行程序进入开机动画界面,也就是游戏欢迎页面左上角是国际象棋的标志, 右边是“中国象棋之博弈的艺术” ,还有两张图片和一个菜单按纽,点击菜单进入菜单栏。 这是一个登陆界面,介绍这是一个象棋游戏,便让人知道这是一个象棋游戏,挑战自己,集 中你的智慧,来享受博弈的乐趣,会勾起人们想下棋的欲望,被象棋游戏吸引,而且可以单 人下,在火车上休闲时都可以,特别一个人也可以下,避免传统象棋游戏非要两个人下的弊 端。可以让人在任何时间任何地点都可以下棋放松、休闲。26 图 5-8 开机动画界面 如图 5-9 菜单页面如图所示有四个按钮开始游戏、关闭声音、帮助、退出游戏点击开始 游戏会进入游戏主界面,就可以实现人机对弈了。关闭声音是控制声音的播放,由关闭声音 可以切换到开机音乐,点击帮助按钮可以进入帮助页面,退出游戏按钮就是退出游戏。图 5-9菜单页面如图 5-10 是开始游戏界面,就可以开始人机对弈了,黑方是机器一方,红方是自己 这一方, 用鼠标点击方式进下棋, 然后电脑自己反应走下一步。 左下角和右下角有一个指针, 当指向黑方走时,机器走一步棋,当指向红方的时候,人走一步棋。还有左右下角分别记录 了黑方红方总共下棋的时间,声音按钮控制声音的播放,退出按钮退出游戏 。27 图 5-10游戏界面如图 5-11 是游戏胜利界面,显示的是红方胜利界面,黑方胜利界面同样如此,只不过将 红将改为黑帅。图 5-44 胜利界面 帮助页面介绍玩法如图 5-12:28 图 5-12 帮助界面 帮助界面如图所示,介绍中国象棋游戏的玩法,还有一过“返回”按钮,点击它返回菜 单页面。5.5 改进和优化阵营选择: 一种更人性化的设计是正式进入游戏之前, 让玩家选择此次游戏阵营的选择, 即选择红方或者黑方棋子。 成绩的储存与排行:该游戏中如果能够加上游戏的排行与储存将更人性化。 估值算法的优化: 因为本游戏侧重点是 Android 技术的开发应用并非算法的介绍,所 以规则中的最优走法的方法只是从所有合法的走法中任意抽取的一个移动棋子, 在正式的人 机对弈中需要对所有的走法进行估值计算, 取出对自己最有利的走法, 可以对自行开发估计 算法中的规则类的 SearchAGoodMove 方法进行改进。 作为结合了最具活力的 Linux 一与 Java 两大开发语言优点于一身的 Android,虽然中 长期拥有光明的前景,但短期内依然存在诸多开发的挑战,特别是与传统的 Linux 与 Java 开发的兼容性还很欠缺, 并且在程序安全性和多任务处理方面还存在不足, 这对从业者来说 需要引起足够的重视,力争先评估自己的开发应用需求,再衡量 Android 的优势和不足,然 后根据自己的实际需要扬长避短。 不管如何,Android 作为一款开放性嵌入式操作系统,具有较强的自主开发延伸性,无 论是硬件厂商还是软件厂商或是系统集成商,都可以根据自身需要进行特色鲜明的产品开 发, 并确保自己开发结果的唯一性, 这恰恰适合正在不断从中国制造向中国创造转型中的中 国电子产业, 因此, 如何学好并利用好 Android 这样一款面向庞大终端消费市场的操作系统 就显得极为重要。29 6 结论本程序设计实现了手机上以 Android 为平台的棋牌类游戏的开发, 人机对弈运行的方式 由程序进行控制, 具有一定的可玩性和趣味性。 经过了细心的调试和排错解决了绝大部分的 问题。 这款游戏作为我的毕业设计, 是本人目前做过的最有意义的程序。 大学四年做过很多课 程设计,大多规模很小。在数据库、各种应用软件和游戏中,我仍觉得对游戏的设计有极大 的热情。因为其各个模块间的联系十分紧密,代码重复执行率高,当经过无数次的调试、修 改后,能最终看到成品,感到无比自豪。 学习 Android 的困难远远超出了预期的想象, 在设计初期, 为了解决人机对弈问题花费 了数天的时间。很多相关的技术,如需要使用到的线程、Game 包的新功能、高级、低级图 形界面的使用、 贴图等, 每一项都需要花一定的时间去掌握和熟悉。 更为困难的是, Android 作为一种刚出现仅几年的新技术, 国内的参考资料非常少, 仅有的几本也停留在简单的介绍 阶段。幸运的是,互联网上有那么多无私的人给了我很大的帮助。 通过本游戏的开发,达到了学习 Java 技术和熟悉软件开发流程,熟悉 Android 应用 程序开发流程的目的。Android 系统手机在中国已经火热流行开来,设计本课题时通过 查阅相关资料让自己了解到了更多 Android 手机的前沿信息,理清软件开发流程,进一 步加固了对 Java 知识的运用。30 谢辞值此论文完成之际,首先,我要对我的导师金一鸣老师表示衷心的感谢。在我的大学学 习生活中和本次毕业设计中, 金老师给予我的鼓励和耐心指导, 为我顺利完成课题奠定了坚 实的基础,并且给了我面对困难和解决困难的勇气。在金老师这里,我不但获得了丰富的专 业知识和研究方法, 还从他身上学到了严谨的治学态度和精益求精的处事风格, 使我终生受 益。 感谢我的辅导员陈雯老师,四年来一直默默的为的班级导航,将对未来充满懵懂的,慢 慢引入各自的发展领域中,无论从生活上还是学习上都给了无微不至的关心和指导。 感谢所有教过我的大学老师,他们给我的关怀和帮助,我将永远铭记于心。钦佩他们不 仅是渊博的知识,还有高尚的道德情操,祝我所有的老师永远平安健康快乐。 感谢我的同学,他们给予我的帮助和情谊是我一生的宝藏。 感谢我的母校,给了我一个浓厚的学习氛围,同时给了丰富的实验资源和图书资源。31 参考文献[1] 刘中兵 . 《Java 高手真经 》.出版社: 电子工业出版社,. [2] (美国)Savitch .《Java 程序设计现解决(基础篇) 译者: 陈涓 赵振平.出版社: 》. 人民邮电出版社,. [3] 白广元.Java Web 整合开发完全自学手册[M].北京:机械工业出版社,2009-1. [4] 孙卫琴,李洪成.Tomcat 与 Java Web 开发技术详解[M].北京:电子工业 [5] 刘斌.Java Web 整合开发[M].北京:电子工业出版社,2008-5. [6] 王克宏.Java 技术教程(基础篇)[M],北京:清华大学出版社,2006-2. [7](美)Marco Pistoia,Nataraj Nagaratnam 等著.企业级 Java 安全性:构建安全的 J2EE 应用[M],北京:清华大学出版社,2007-3. [8]张孝祥著.Java 就业培训教程[M]. 北京:清华大学出版社,2007. [9]余志龙编著.Google Android SDK 开发范例大全[M].北京:人民邮电出版社,. [10]E2ECloud 工作室著.深入浅出 Google Android[M]. 北京:人民邮电出版社,. [11]Eoe.android 开发社区. /,. [12]杨丰盛.《android 应用开发揭秘》.北京:机械工业出版社,2010-01. [13](美)威尔顿,麦克匹克.JavaScript 入门经典(第 3 版).施宏斌译.北京:清华大学出 版社,2009. [14]GONG LEI,ZHOU Cong.Development and Research of Mobile Termination Application Based on Android[J].Computer And Modernization.]Shane Conder . Android Wireless Application Development[M].Addison-Wesley.2010. [16]Sayed Hanshimi.Pro Android 3[M].APRESS;NEW,2010. [17]郑建,贺超. Android 和 Chrome 的发展与未来[J].移动通信,2010-3. [18]张鹏. 中国企业为什么青睐 android[J]. 通信世界,2010-3. [19]郭宏志.Android 应用开发详解[M].北京:电子工业出版社,2010. [20]李宁等.Android/OPhone 开发完全讲义[M].北京:水利水电出版社,2010. [21]吴亚峰,苏亚光.Android 应用案例开发大全[M].北京:人民邮电出版社,2011.32 附录部分重要程序(1)ChessActivity.javapublic void onCreate(Bundle savedInstanceState) {//重写的onCreate super.onCreate(savedInstanceState); //全屏 requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN , WindowManager.LayoutParams.FLAG_FULLSCREEN); startSound = MediaPlayer.create(this, R.raw.startsound);//加载欢迎声 音 startSound.setLooping(true);//设置游戏声音循环播放 gamesound 景声音 gamesound.setLooping(true);//设置游戏声音循环播放 this.initWelcomeView();//初始化欢迎界面 } = MediaPlayer.create(this, R.raw.gamesound);//游戏过程的背(2)GuiZe.java/** * 该类是象棋的规则类,其他类通过调用canMove方法给出起始位置与结束位置 * 其他类通过调用searchAGoodMove方法得到最当然棋局最好的走法 * 而其中的allPossibleMoves方法得到的是当前棋局的所有的走法 */ public class GuiZe { boolean isRedGo =//是不是红方走棋 public boolean canMove(int[][] qizi, int fromY, int fromX, int toY, int toX){ int i = 0; int j = 0; int moveChessID;//起始位置是什么棋子 int targetID;//目的地是什么棋子或空地 if(toX&0){//当左边出界时 } if(toX&8){//当右边出界时 } if(toY&0){//当上边出界时 } if(toY&9){//当下边出界时33
} if(fromX==toX && fromY==toY){//目的地与出发点相同, } moveChessID = qizi[fromY][fromX];//得到起始棋子 targetID = qizi[toY][toX];//得带终点棋子 if(isSameSide(moveChessID,targetID)){//如果是同一阵营的 } switch(moveChessID){ case 1://黑帅 if(toY&2||toX&3||toX&5){//出了九宫格 } if((Math.abs(fromY-toY)+Math.abs(toX-fromX))&1){//只能走一步 } case 5://黑士 if(toY&2||toX&3||toX&5){//出了九宫格 } if(Math.abs(fromY-toY) != 1 || Math.abs(toX-fromX) != 1){//走斜线 } case 6://黑象 if(toY&4){//不能过河 } if(Math.abs(fromX-toX) != 2 || Math.abs(fromY-toY) != 2){//相走“田”字 } if(qizi[(fromY+toY)/2][(fromX+toX)/2] != 0){//相眼处有棋子 } case 7://黑兵 if(toY & fromY){//不能回头 } if(fromY&5 && fromY == toY){//过河前只能直走34 } if(toY - fromY + Math.abs(toX-fromX) & 1){//只能走一步,并且是直线 } case 8://红将 if(toY&7||toX&5||toX&3){//出了九宫格 } if((Math.abs(fromY-toY)+Math.abs(toX-fromX))&1){//只能走一步 } case 2://黑车 case 9://红车 if(fromY != toY && fromX != toX){//只能走直线 } if(fromY == toY){//走横线 if(fromX & toX){//向右走 for(i = fromX + 1; i & toX; i++){//循环 if(qizi[fromY][i] != 0){//返回false } } } else{//向左走 for(i = toX + 1; i & fromX; i++){//循环 if(qizi[fromY][i] != 0){//返回false } } } } else{//走的是竖线 if(fromY & toY){//向右走 for(j = fromY + 1; j & toY; j++){ if(qizi[j][fromX] != 0)//返回false } } else{//想左走 for(j= toY + 1; j & fromY; j++){ if(qizi[j][fromX] != 0)35 //返回false } } } case 10://红马 case 3://黑马 if(!((Math.abs(toX-fromX)==1 && Math.abs(toY-fromY)==2) || (Math.abs(toX-fromX)==2 && Math.abs(toY-fromY)==1))){//马走的不是日字时 } if(toX-fromX==2){//向右走 i=fromX+1;//移动 j=fromY; } else if(fromX-toX==2){//向左走 i=fromX-1;//移动 j=fromY; } else if(toY-fromY==2){//向下走 i=fromX;//移动 j=fromY+1; } else if(fromY-toY==2){//向上走 i=fromX;//移动 j=fromY-1; } if(qizi[j][i] != 0)//绊马腿 case 11://红砲 case 4://黑炮 if(fromY!=toY && fromX!=toX){//炮走直线//返回false } if(qizi[toY][toX] == 0){//不吃子时 if(fromY == toY){//横线 if(fromX & toX){//想右走 for(i = fromX + 1; i & toX; i++){ if(qizi[fromY][i] != 0){//返回false } }36 } else{//向走走 for(i = toX + 1; i & fromX; i++){ if(qizi[fromY][i]!=0){//返回false } } } } else{//竖线 if(fromY & toY){//向下走 for(j = fromY + 1; j & toY; j++){ if(qizi[j][fromX] != 0){//返回false } } } else{//向上走 for(j = toY + 1; j & fromY; j++){ if(qizi[j][fromX] != 0){//返回false } } } } } else{//吃子时 int count=0; if(fromY == toY){//走的是横线 if(fromX & toX){//向右走 for(i=fromX+1;i&toX;i++){ if(qizi[fromY][i]!=0){ count++; } } if(count != 1){//返回false } } else{//向左走 for(i=toX+1;i&fromX;i++){ if(qizi[fromY][i] != 0){ count++; }37 } if(count!=1){//返回false } } } else{//走的是竖线 if(fromY&toY){//向下走 for(j=fromY+1;j&toY;j++){ if(qizi[j][fromX]!=0){ count++;//返回false } } if(count!=1){//返回false } } else{//向上走 for(j=toY+1;j&fromY;j++){ if(qizi[j][fromX] != 0){ count++;//返回false } } if(count!=1){//返回false } } } } case 12://红仕 if(toY&7||toX&5||toX&3){//出了九宫格 } if(Math.abs(fromY-toY) != 1 || Math.abs(toX-fromX) != 1){// 走斜线 } case 13://红相 if(toY&5){//不能过河//返回false } if(Math.abs(fromX-toX) != 2 || Math.abs(fromY-toY) != 2){//38 相走“田”字//返回false } if(qizi[(fromY+toY)/2][(fromX+toX)/2] != 0){//相眼处有棋子 } case 14://红卒 if(toY & fromY){//不能回头 } if(fromY & 4 && fromY == toY){//不让走 } if(fromY - toY + Math.abs(toX - fromX) & 1){//只能走一步,并且 是直线//返回false不让走 } default: } }(3) TimeThread.javapublic void run(){//重写的run方法 while(flag){//循环 if(gameView.caiPan == false){//当前为黑方走棋、思考 gameView.heiTime++;//黑方时间自加 } else if(gameView.caiPan == true){//当前为红方走棋、思考 gameView.hongTime++;//红方时间自加 } try{ Thread.sleep(1000);//睡眠一秒种 } catch(Exception e){//捕获异常 e.printStackTrace();//打印异常信息 } } (4) MenuView.java public void surfaceDestroyed(SurfaceHolder holder) {//摧毁时释放刷帧线程 boolean retry =//循环标志位39 thread.setFlag(false);//设置循环标志位 while (retry) {//循环 try { thread.join();//等待线程结束 retry =//停止循环 }catch (InterruptedException e){}//不断地循环,直到刷帧线程结束 } } (5) HelpView.java class TutorialThread extends Thread{//刷帧线程 private int span = 1000;//睡眠的毫秒数 private SurfaceHolder surfaceH//SurfaceHolder的引用 private HelpView helpV//父类的引用 private boolean flag =//循环标记位 public TutorialThread(SurfaceHolder surfaceHolder, HelpView helpView) {//构造器 this.surfaceHolder = surfaceH//得到surfaceHolder引用 this.helpView = helpV//得到helpView引用 } public void setFlag(boolean flag) {//设置循环标记位 this.flag = } public void run() {//重写的run方法 C//画布 while (this.flag) {//循环 c = try { c = this.surfaceHolder.lockCanvas(null); synchronized (this.surfaceHolder) {//同步 helpView.onDraw(c);//调用绘制方法 } } finally {//用finally语句保证下面的代码一定会被执行 if (c != null) {//更新屏幕显示内容 this.surfaceHolder.unlockCanvasAndPost(c); } } try{ Thread.sleep(span);//睡眠指定毫秒数 }catch(Exception e){//捕获异常 e.printStackTrace();//打印异常堆栈信息 }40}

我要回帖

更多关于 中国象棋 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信