版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
题目基于Android系统的五子棋游戏开发与实现学生姓名学号所在系(院)计算机科学与技术专业名称年级指导教师于桂玲职称讲师2013年6月10日北京邮电大学毕业设计(论文)诚信声明本人声明所呈交的毕业设计(论文),题目《基于Android平台的五子棋游戏开发与实现》是本人在指导教师的指导下,独立进行研究工作所取得的成果,除了文中特别加以标注和致谢中所罗列的内容以外,毕业设计(论文)中不包含其他人已经发表或撰写过的研究成果,也不包含为获得北京邮电大学或其他教育机构的学位或证书而使用过的材料。申请学位论文与资料若有不实之处,本人承担一切相关责任。本人签名:日期:毕业设计(论文)使用权的说明本人完全了解北京邮电大学有关保管、使用论文的规定,其中包括:①学校有权保管、并向有关部门送交学位论文的原件与复印件;②学校可以采用影印、缩印或其它复制手段复制并保存论文;③学校可允许论文被查阅或借阅;④学校可以学术交流为目的,复制赠送和交换学位论文;⑤学校可以公布学位论文的全部或部分内容。本人签名:日期:指导教师签名:日期:北京邮电大学毕业设计(论文)PAGEI目录1前言 11.1课题研究背景 11.2课题研究的意义和目的 41.3可行性研究 51.3.1技术可行性 51.3.2经济可行性 61.3.3操作可行性 61.4本章小结 72需求分析与系统设计 82.1需求分析与创新意义 82.1.1系统的需求分析 82.1.2系统的创新与意义 82.2系统的功能设计 92.2.1人机对战 92.2.2人人对战 92.2.3关于 102.3系统的组成与实现原理 102.3.1系统组成 102.3.2系统实现原理 102.4本章小结 113客户端系统的实现 123.1用户进入游戏 133.2人人对战 153.3人机对战 203.4关于 223.5本章小结 224系统的测试 234.1系统的测试环境 234.1.1系统的开发环境 234.1.2系统运行环境 234.2系统功能测试 234.2.1人人对战测试 244.2.2人机对战测试 244.2.3关于测试 254.3本章小结 255系统存在问题及改进方法 265.1系统存在的问题 265.2系统改进方法 266结论 27致谢 29参考文献 30附录 31前言课题研究背景智能手机,和电脑是一样的,它不依赖于任何系统而操作,玩家可以自行下载并且安装软件或者游戏等应用来不断的扩充手机的功能,其中包括利用运营商通讯网络来接入无线进行网络操作。目前,细数全球范围内多数的手机厂商都在做智能手机,例如具有代表性的苹果、三星、HTC、小米等。我们分析智能手机具备以下五大特点:1.可以通过无线技术接入因特网,即要有GSM网络支持下的GPRS或者是CDMA网络支持下的CDMA1X或3G网络。2.比较人性化,可以根据个人需求自行更改主题界面等。3.具有开放性,可以根据不同用户的需求自行下载安装特别多的应用程序,比如社交软件或者游戏等,从而可以达到无限的扩充智能手机功能的效果。4.具有PDA(掌上电脑)功能,例如有文件的管理、便签、地图搜索、网页浏览、多媒体播放、办公软件、应用程序管理等。5.具有很强大的功能,可以在很多的地方下载并安装别的软件。Android的诞生:准确的来说是在二零零三年,创始人AndyRubin在Android的传奇开始之前就说过:“我们有很大的潜力来开发能够捕捉用户地理位置信息以及状态的不固定的设备。如果这些设计者很有想法的话,那么在很短的时间内这些东西就会被应用到那些产品中。”现在看,估计创始人自己都不会想到他的预言是这么的准确。事实上,我们可以预见未来在移动领域将会有巨大的改变,从而催生出类似于概念机那样新颖、独特、超前的智能机。二零零五年的时候,有很多谣传说Google通过专注于制造可以捕捉位置服务的手机从而进军手机制领域,但是摆在它面前最大难题就是它并没有实现这个愿望的可搭载的平台。Google在二零零五年的七月收购了Android,虽然是一次小规模的收购行动,但大家怀疑这标志着Google进入了移动市场,所以还是立刻就引起了业界的大力关注。尽管是这样,在那个时候,这个发展没有很壮大的做软件的公司正是由AndyRubin、RichMiner、NickSears以及ChrisWhite四个人共同创建的。现在看来,他们的疑虑是对的。差不多就在二零零七年十一月五日的时候,Google对公众开放了Android,这个不仅仅是一个基于Linux的全新的移动操作系统,最重要的是它完全是不保密设计代码的,不用说,这在业内肯定会使人们震惊,做出很大的改变。这是当时新成立的开放手机联盟整合下的成果,诸如Google、HTC、Intel、Sprint-Nextel、T-Mobile以及NVIDIA都是一个组织的成员,这个组织是为了给所有的设备建造一个共同的可使用的标准。第一款搭载Android系统的手机是2008年9月由T-Mobile发布的G1,它拥有GPS功能,3.1M摄像头,以及一系列的Google应用。G1的面市,正式拉开了一场巨大变革的序幕,不仅仅是Google,更是对于整个移动业界。2009年5月发布了第一个主要版本Android1.5“Cupcake”。在对它进行升级之后,用户界面有了很大的改善,新的版本无疑给用户带来了全新的体验,并且它还增加了一些功能。Android1.6“Donut”2009年9月发布。搭载Android1.6的HTCHero获得了意想不到的成功。不仅得到了一些从未有过的关注,让许多客户真正对Android产生兴趣,而且更触动了苹果和微软两家竞争者的敏感神经。Android2.0/2.1:,又有一个很重要的版本在2009年10月26日完成,这次完成的速度可以说是相当快的,无与伦比。这次,大版本升级到了Android2.0/2.1“Eclair”。继2009年12月发布的Android2.0.1SDK后,是在2010年1月发布的2.1版本。会有很多的看客甚至是用户都会奇怪,为什么Android的系统版本代号会被称作甜点,其实是在Android1.5发布出来的时候开始使用的这个命名的方法。按照字母的顺序,依次是小蛋糕,甜甜圈和松饼,所以每更新一个版本就可以被想象成是对它的大小的扩充。Android2.2“FroYo”:NexusOne的用户已经开始接受Android2.2“FroYo”的无线更新,并会在很快速的时间内使所有使用其他手机的玩家能够使用这个新的版本。这个系统版本新的升级,让很多的使用其他手机的人们很是羡慕,因为它有很好的界面,还增加了许多新的功能,玩家使用会有新的感受。有关的消息众口一词声称Android3.0“Gingerbread”,它会让用户有更新颖的更独特的体验,并且Google估计会在今年秋天的时候将它发布出来。纵观Android的发展史,在2003年的时候,出现了特别有远见的Andy,他的预言得到了证实,2005年经历了正式起步以及被Google收购。一路以来,系统一直在进步,并且新的机型也一直在快速的发布。通过这一切,我们有理由相信,Android很有可能会成为手机系统同行业内的最优秀的,这样的势头,不容易被改变。Android平板电脑也在今年的夏天开始发布以及GoogleTV发布以后(也许还有GoogleMusic),Android有很大的可能让我们领会未来手机的发展趋势,让我们具有不一样的体验[10]。Android平台对比其他的平台有很多的有点。首先分析Symbian,主要是在诺基亚手机上运行,虽然说已经发展的很成熟,但是它在理念上与我们平时经常用的系统还是有很大的差别,整个感觉上还是偏向于以前旧一点的设计。重要的是它对互联网并没有连接的特别好,不能够让用户体验到特别满意的联网速度,在这样一个信息化时代就显得没有竞争力。但是Android不同,它最主要最关注的就是对于联网这一块儿,不管是软件还是硬件的设计,都是在主要突出互联网的重要,正好是弥补了Symbian最大的不足。这样,就会让用户更好更舒适的感受信息化时代,所以更容易赢得用户的喜爱,得到广大用户的接受与认可。还有就是现在比较流行的ios,虽然它有很完整的应用,可以给用户带来很多很丰富的体验,但是它只是相对于苹果用户而言,并不可以针对多数的手机用户。但是Android同样不同于ios,它是完全开放的,这样更多的开发者可以为其设计多种多样不同的应用,继而迎来越来越多的开发创意,进而丰富其应用领域。而且,它具有一定的标准,各种不同的平台都可以兼容使用,所以完全可以植于好多的手机品牌上,这样更有利于它的推广,让更多的用户熟知。总的来说,现在流行的系统中,从不同的方面都可以看出Android系统相比其他系统的优势,可以说它拥有很多手机用户的支持者[2]。所以完全可以这样说,随着人们对移动设备的要求变得越来越高,那就必须有能够逐渐满足这样一个高要求的开发平台,那么Android就是在这样的环境下应运而生的。综合的来讲,它完全符合目前的趋势,可以说是真正意义上的一个具有开放性的综合平台,不论是开发软件的公司还是搞研发的个人,都可以用它来作为开发的基础。在技术方面,由于它具有很强的可操作性,人们在编写程序的时候可以根据自己的意向来实现,这样就给开发者进行创新提供了很大的可能。在成本方面,只要拥有编程的技术就可以在Android平台上进行功能的实现,是很节约的,因此它就完全可以降低不少的成本。设计者们可以在此基础上设计出具有个性特色的各类应用,所以,综合用户的需求,并从软件这个很大的市场来说,Android很明显具有很大的发展潜力[4]。课题研究的意义和目的游戏,作为一种娱乐项目,在我们现在这样会面临很多压力的生活中,真的是一类不可或缺的活动。在我们的生活中,游戏的种类有千种万种,不同的游戏也会给人带来不同的放松和娱乐感受,正因为它的必不可少性,带动很大一部分人来研究越来越多的游戏,这不经意间就丰盛了手机游戏行业。随着历史的发展,游戏也有了很大的发展和改变,从之前最简单的到后来在电视上进行的游戏,继而到pc游戏,再到现在的手机游戏,其发展过程也经历了很多样的技术革新。随着我们生活水平的日益发展和新技术的伟大变革,手机逐渐在我们的生活中普及起来,它小巧玲珑,功能强大,并且方便携带,这些特性都让它最终成为我们生活中的必需品。随着3g以至4g的开通及应用,手机必然会迎来一轮更深层次的普及,而可以让用户在手机上玩游戏也就随着手机火爆起来,因此这类游戏的研究还是有很大的发展空间的,必将会迎来手机用户的追捧!五子棋,它可以说是一种棋牌类的游戏,是需要有一定的策略的。棋盘和围棋是通用的,有黑色和白色棋子两种,但规则相对来说就比较简单了,在我国古代,是比较流行的棋术之一。两个人进行游戏,各拿一个颜色的棋子,一人接一人轮流落子,经过主动进攻或者是防守,直到有一方会出现五颗或者五颗以上的棋子连成一条线,就判定这一方获胜,那么游戏将结束。由于落子之后棋子不像象棋那些可以随意的移动位置,有时候也是可以用纸质的棋盘和笔来进行的。该游戏由于规则简单,很容易就可以上手的,而且老少皆宜,玩起来比较有趣,不仅需要很好的策略,也需要随时来处理不同的情况。这样的游戏简单易玩,并且锻炼思维,更对于小孩儿来说,可以开发智力。这些在手机上开发的游戏,更是对方便快捷悠闲的最好体现。五子棋会有很强大的客户群,即使是之前完全没有接触过该游戏的人也可以轻而易举的明白具体的玩儿法,并且会感觉到特别有趣;它是以手机平板平台为主的,只要是装载它的话就可以随时来玩儿,这样在人们感受特别方便的同时,还可以享受现在这样的高科技生活下的悠闲;这个游戏还需要一定的策略,每走一步都会引起思考,但是却不会给人带来压迫感,就是这样略微轻松的思考,锻炼了思维的同时也娱乐了身心。所以,综合上述该游戏的各方面好处,设计在手机上可以进行此游戏的应用就显得很重要了。本课题的目的是基于Android平台,设计出一款基于Android平台的五子棋游戏,该游戏将可以玩人人对战及人机对战两类。可行性研究这个阶段,在对系统的目标进行了初步的调查和分析的基础上,得出了一个可行性方案,并对其进行了论证。本文主要从三个可行性方面进行了分析,分别是技术、经济和操作。技术可行性技术可行性有很多因素要考虑到,比如说目前拥有的技术条件是否可以满足使得游戏可以最终达到计划的要求,软件和硬件的型号级别能否跟上完成的节奏等。本软件用的是Java语言进行的,它的操作相对来说比较简单,现在使用的计算机的硬件方面也完全跟得上研发的节奏。软件方面:在不用联网的模式已经发展的很强大的前提下,软件就有了很好的发展平台,它们具有很多的优势,比如很快的速度、高的可靠性、低的价格和大的容量,系统的需求完全能够得到满足。所以从技术层面上讲是一定可以的。我们经常需要根据不同的客户需求来设计出好多不同的功能,然后把这些功能嵌入整合到一个产品中,整合配置到那种大型的计算机系统中,这就是所谓的嵌入式系统。随着时代一步步的发展,计算机慢慢在和通信技术融合,慢慢的深入到人们生活中的各个层面,信息无处不在,获取的方式越来越网络化,信息化已经成为一个不可避免的大趋势,所有在这样一个大的背景下,嵌入式的发展也得到了不可估量的前景。目前的嵌入式已经深入到我们日常生活中的各个行业,它的使用或许也远远高过了普通的计算机系统,包括通讯网络等,。其中最典型的一个代表就是手机的嵌入式,给我们带来了很大的便利,为我们的生活增添了很多不一样的乐趣。经济可行性我们可以通过去图书馆借阅有关联的图书或者上网搜索等途径来获得开发该应用所需要的有关联的图书资料,并且其中所需的应用相关方面的软件和硬件也是很容易找到的,总之所需的成本是比较低的,所以说从经济层面来看是可以的。操作可行性Eclipse是一个开放源代码的研发平台,它是基于Java的,是可扩展的。Eclipse是利用特殊规范的代码来形成一个可供研发的程序,但是对于它自己而言,只是一个大概的结构和一些可供使用的命令。令人欣慰的是Eclipse附带了一个标准的插件集,包括Java开发工具(JavaDevelopmentTools,JDT)。它主要由Eclipse项目、Eclipse工具项目和Eclipse技术项目三个项目组成,具体包括四个部分组成——EclipsePlatform、JDT、CDT和PDE。JDT支持Java开发、CDT支持C开发、PDE用来支持插件开发,EclipsePlatform则是一个开放的可扩展IDE,它构造并且运行了集成软件开发工具的基础,提供构造块,并且向用户提供了一个通用性的开发平台。EclipsePlatform对任何一个工具可以实现的结果从什么地方开始或者别的从什么地方结束是没有办法区分的,因为它不限制工具的制造者与其他的工具是不需要格式的转换的。EclipseSDK(软件开发者包)是EclipsePlatform、JDT和PDE所生产的组件合并,它们是不必要分开下载的。这些组合合并在一起共同组成了一个超级丰富并完善的可供开发的程序,开发者可以通过它建造一种工具,能够不受限制不用进行转换格式就可以连接到EclipsePlatform。EclipseSDK是由两部分组成的,一个是Eclipse项目生产的工具,另外的来自第三方软件,它们是开放源代码的。这两部分的协议是不一样的,其中第一部分Eclipse自己产生的软件通过GPL发布,而第二部分的第三方软件是具有自己的许可协议的[7]。从以上的论述可以看出,本软件的开发完全具备技术、经济和操作三个方面的可行性。本章小结本章主要是从研究的背景、目的和意义三个方面对五子棋游戏在Android平台上的研发和完成的情况进行了详细的介绍,并分析了该设计是不是可以运行的,分别是技术、经济和操作三个方面。
需求分析与系统设计在Android的系统上来研发五子棋游戏,并让它顺利运行,这样一个游戏的开发确保了用户可以随时随地的进行并且通过它来锻炼自己的大脑。通过本系统,用户只要使用Android手机,并且安装有本软件,就可以再无聊之余一边进行五子棋游戏,一边来感受这样的小游戏带来的清新与悠闲。用户可以通过五子棋游戏来享受愉悦的游戏氛围,娱乐自己,放松身心。需求分析与创新意义下面从在Android上来对五子棋游戏研发和运行的几个方面来展现五子棋游戏包含的乐趣,首先是游戏的简单需求分析,然后是简要的描述该系统的创新点和意义。系统的需求分析本系统的目的就是开发一个在Android上进行研发的五子棋游戏,有人人对战和人机对战两个类别供玩家选择,这两种类别的选择或者切换玩家是可以利用操作不同的按钮来进行的。通过本系统,用户可以选择人人对战与自己的好友一同进行游戏,增进朋友之前的友谊,也可以选择人机对战,与功能强大的电脑一决高下。主要包括的功能有:人人对战,人机对战,关于。该系统功能全面,并且具有良好的界面和易用性,可以给用户带来全新的游戏体验。系统的创新与意义就目前android软件市场上来说,已经有很多类似的五子棋的游戏,但是大多游戏都只是人机对战,没有实现人机对战与人人对战结合,本游戏的目的就是为了整合人机对战与人人对战,将他们结合到一个游戏中。而且如果游戏者想要转换或者改变游戏的属性是可以通过摁游戏设置那个按钮来进行的,游戏设置那个按钮设计在主界面上。在游戏设置中,用户可以修改游戏的难易程度,游戏的趣味洗牌,是否标记行和列,是否为反向等等。系统的功能设计本系统主要分为三大块,分别为人机对战,人人对战,关于。人机对战人机对战就是当用户点击手机上的欢乐五子棋图标时,进入到主界面之后,可以摁那个人机对战按钮来开始。摁那个人机对战的按钮,屏幕会更改所选的界面。人机对战中,默认设置是白色棋子属于电脑,而黑色棋子属于玩家,并且在游戏过程中无论是玩家还是电脑,只要有一方所用的棋子有五颗及以上的棋子连在一起,则系统会判定该方获胜,反之则失败。人人对战人人对战就是当用户进入到游戏最开的那个界面的时候,摁那个人人对战按钮从而开始的游戏。利用将讲监听器与空间button绑定一起通过相应算法实现摁那个人人对战按钮,屏幕将会更改到人人对战棋盘界面,该界面与人机对战界面是一样的,区别只是棋子所执者不一样。在该游戏过程中是没有电脑人工智能计算机算法的。而是游戏玩家可以找一个自己的好朋友一起来玩游戏的。在人人对战那个游戏中两个人分别拥有白色和黑色棋子,应为五子棋游戏规则就是黑子先行,所以默认第一玩家为黑子,第二玩家为白子,并且在棋子的数组中储存两种颜色的点的图样分别是黑子为0白字为1,系统默认第一个落子的玩家为黑子,第二个落子的玩家为白子。当每次落子之后,系统会判断一次是否获胜当黑色或者白色的棋子有五颗及以上连在一起的,则系统会判定该棋子所执者获胜,反之则失败,并且会弹出对话框显示“黑子获胜”或者“白字获胜”。关于当用户对此游戏有疑问时,比如该游戏的作者或者是该作者的信息等,可以点击主界面的关于按钮,这是屏幕上会出现一个对话框,上面详细介绍所要看的内容。系统的组成与实现原理下面从“欢乐五子棋”游戏的组成部分来阐述程序的设计原理。系统组成“欢乐五子棋”游戏主要包括三大功能点,通过三大功能点来完成人人对战,人机对战,关于等功能。(如图2.1所示)图2.1系统组成部分系统实现原理游戏是怎么样运行的,原理有下面几点:玩家用户进入该系统开始游戏后,系统调用的都是同一张棋盘,不管游戏者选择的是人人对战模式还是人机对战模式,其中的区别只是在棋盘中所执行的方法不同。不管游戏者选择的人和人玩还是人和机玩,当白子或者黑子,任意一种颜色的棋子五颗及以上连在一起的时候,系统将判定该颜色棋子所执者赢得了游戏(如图2.2所示)。图2.2系统实现原理本章小结本章内容主要是略微介绍了一下“欢乐五子棋”游戏的需求分析,创新与意义,还有三大功能模块的设计,同时对本系统的组成部分以及系统实现的原理进行了详细的分析说明,从而为接下来在编写程序模块时能够思路清晰。
客户端系统的实现在Eclipse中新建一个命名为MyGobang的Android工程,BuildTarget选择Android2.2 。在本工程中共有5个包10个类(如图3.1所示)。图3.1五子棋游戏系统类全图其中比较重要的类有:在activity包中,MyGobangActivity.java类用来显示该游戏的主界面。OfAllWarActivity.java类用来显示人人对战的界面。TheWarMachineActivity.java类用来显示人机对战的界面。在base包中,BaseComputerAi.java类用来存放人机对战的算法,BasePlayer.java类用来存放人人对战的算法。在entity包中,Chessboard.java类为棋盘类,改类用于棋盘界面的显示。Point.java类为每颗棋子所落的点的实体类。在utils包中,HumanPlayer.java为人类玩家的一个实例。在res/layout中,有两个文件需要被创建:游戏的原始界面的xml文件是main.xml,play.xml文件为显示棋盘的主界面。用户进入游戏第一次启动Android拼图游戏程序会进入到程序的主界面。在游戏的主界面中,用户可以摁不同的功能选项按钮来选择对应功能。例如游戏用户可以综合自己的喜好,通过点击人人对战、人机对战或者是关于按钮来分别进入三类不同模式的界面(如图3.2所示)。图3.2游戏主界面主要代码如下: publicvoidonCreate(BundlesavedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.main); findViews();} privatevoidfindViews() {mHumanBtn=(Button)findViewById(R.id.button1); mComputerBtn=(Button)findViewById(R.id.button2); mAboutBtn=(Button)findViewById(R.id.button3); mHumanBtn.setOnClickListener(this); mComputerBtn.setOnClickListener(this); mAboutBtn.setOnClickListener(this);}依据自己的喜好不同,用户可以选择摁原始面上任何一个功能按钮,即可以摁人和人玩的按钮、人和机玩的按钮或者关于按钮来分别进入人人玩模式、人机玩模式或者关于功能,进而屏幕上将会转换出所选择按钮对应的框框来展示,每个Activity之间的转换是通过Intent来实现的,Intent负责对应中一次操作的动作、动作涉及数据、附加数据进行描述,Andorid则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并且完成组件的调用。在本程序中一共有三个Activity分别是主界面,人人对战以及人机对战界面,通过把事件与Button绑定一起,利用Intent意图功能来实现Activity的相互调用,从而达到我们所预期的玩家可以在主界面上选择相应模式,并且跳转到相应界面功能的效果,其中主体是通过Switch选择语句实现的。主要代码如下: publicvoidonClick(Viewv) { intent=newIntent(); switch(v.getId()) {caseR.id.button1: intent.setClass(this,OfAllWarActivity.class); startActivity(intent); break; caseR.id.button2: intent.setClass(this,TheWarMachineActivity.class); startActivity(intent); break; caseR.id.button3: newAlertDialog.Builder(this).setTitle("作者:麻博超").setMessage("学号:09060118").setPositiveButton("确定", newDialogInterface.OnClickListener() { publicvoidonClick(DialogInterfacedialog,intwhich) { dialog.cancel();} }).show(); break;} }
人人对战当用户玩家想要跳转到人和人玩的界面,可以在主界面摁人人玩的按钮来运行。进入该界面后,玩家自己可以扮演两个角色,或者用户可以邀请一位好友,与好友一同切磋棋艺,(如图3.3所示)。图3.3人人对战界面主要代码如下: protectedvoidonCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.play); gameView=(Chessboard)findViewById(R.id.myBang); gameView.player2=Chessboard.human; }我们在这里可以看到控制界面的Activity的setContentView()方法中的view为play.xml。Play.xml文件的代码如下:<com.mbc.entity.Chessboardandroid:id="@+id/myBang"android:layout_width="fill_parent"android:layout_height="fill_parent"></com.mbc.entity.Chessboard>这里的布局文件中的元素引用的是entity包中的ChessBoard.java类,这个类继承的是view,作用是用于显示棋盘。主要代码如下:(1)这里把代表不同颜色的许多点分别存入数组 Resourcesr=this.getContext().getResources(); fillPointArrays(BLACK,r.getDrawable(R.drawable.black)); fillPointArrays(WHITE,r.getDrawable(R.drawable.white));(2)设置画线时用的颜色 paint.setColor(Color.LTGRAY);}(3)初始化好俩种颜色的点 publicvoidfillPointArrays(intcolor,Drawabledrawable){Bitmapbitmap=Bitmap.createBitmap(pointSize,pointSize, Bitmap.Config.ARGB_8888); Canvascanvas=newCanvas(bitmap); drawable.setBounds(0,0,pointSize,pointSize); drawable.draw(canvas); pointArray[color]=bitmap;}(4)以上代码为初始化棋盘上的可以落子的点,和初始化两种颜色的棋子,但是棋盘上还要有横竖相间的线,主要代码如下: protectedvoidonSizeChanged(intw,inth,intoldw,intoldh) {maxX=(int)Math.floor(w/pointSize); maxY=(int)Math.floor(h/pointSize); xOffset=((w-(pointSize*maxX))/2); yOffset=((h-(pointSize*maxY))/2); createLines(); restart(); }(5)产生棋盘上所有的线 privatevoidcreateLines() {for(inti=0;i<=maxX;i++) {lines.add(newLine(xOffset+i*pointSize-pointSize/2,yOffset,xOffset+i*pointSize-pointSize/2,yOffset+maxY*pointSize));} for(inti=0;i<=maxY;i++) {lines.add(newLine(xOffset,yOffset+i*pointSize-pointSize/2,xOffset+maxX*pointSize,yOffset+i*pointSize-pointSize/2));}}(6)画出棋盘 privateList<Line>lines=newArrayList<Line>(); privatevoiddrawChessboardLines(Canvascanvas) {for(Lineline:lines) {canvas.drawLine(line.xStart,line.yStart,line.xStop,line.yStop,paint);}}(7)当加载完棋盘之后,第一个玩家触摸屏幕中的任意一个点,将获取到触摸点的位置,主要代码如下: privatePointnewPoint(Floatx,Floaty) {Pointp=newPoint(0,0); for(inti=0;i<maxX;i++) {if((i*pointSize+xOffset)<=x &&x<((i+1)*pointSize+xOffset)){p.setX(i);}} for(inti=0;i<maxY;i++) {if((i*pointSize+yOffset)<=y &&y<((i+1)*pointSize+yOffset)) {p.setY(i);}}returnp;}当第一个用户点击某一个点之后,将黑子放到该点上,第二个用户点击其他的点,然后在这个点上放上白色的棋子,依次类推(如图3.4所示)。图3.4人人对战主要代码如下: privatevoidplayer1Run(MotionEventevent) {Pointpoint=newPoint(event.getX(),event.getY()); if(allFreePoints.contains(point)) {setOnProcessing(); player1.run(player2.getMyPoints(),point); refressCanvas(); if(!player1.hasWin()) { if(player2==computer) {refreshHputerRunAfter(10); }else{setPlayer2Run();}}else{setMode(PLAYER_TWO_LOST);}}} privatevoidplayer2Run(MotionEventevent) {Pointpoint=newPoint(event.getX(),event.getY()); if(allFreePoints.contains(point)) { setOnProcessing(); player2.run(player1.getMyPoints(),point); refressCanvas();if(!player2.hasWin()) {setPlayer1Run(); }else{setMode(PLAYER_ONE_LOST);}}}当有任何一种颜色的五颗及以上棋子出现连在一条线的情况,系统会判定该颜色棋子的所执者取得胜利,反之另一方则失败。并且一旦出现胜负的情况,玩家将不可以继续下棋,即游戏结束(如图3.5所示)。图3.5胜利状态判断横向纵向是否有五颗棋子连成一条直线的代码如下: publicfinalbooleanhasWin() {if(myPoints.size()<5) returnfalse; Pointpoint=myPoints.get(myPoints.size()-1); intcount=1;intx=point.getX(),y=point.getY(); temp.setX(x).setY(y);横向:判断在所落子点的X轴负方向与正方向分别存在子数 while(myPoints.contains(temp.setX(temp.getX()-1)) &&temp.getX()>=0&&count<5) {count++;} if(count>=5)returntrue;temp.setX(x).setY(y); while(myPoints.contains(temp.setX(temp.getX()+1)) &&temp.getX()<maxX&&count<5) {count++;} if(count>=5) returntrue;纵向:判断在所落子点的Y轴负方向与正方向分别存在子数 count=1;temp.setX(x).setY(y); while(myPoints.contains(temp.setY(temp.getY()-1)) &&temp.getY()>=0) {count++;}if(count>=5)returntrue; temp.setX(x).setY(y); while(myPoints.contains(temp.setY(temp.getY()+1)) &&temp.getY()<maxY&&count<5) {count++;} if(count>=5)returntrue;判断斜向是否有五颗棋子练成一条直线的代码如下:正斜:判断X轴负方向Y轴正方向以及X轴正方向Y轴负方向落子数。 count=1;temp.setX(x).setY(y); while(myPoints.contains(temp.setX(temp.getX()-1).setY(temp.getY()+1)) &&temp.getX()>=0&&temp.getY()<maxY) {count++;}if(count>=5)returntrue; temp.setX(x).setY(y); while(myPoints.contains(temp.setX(temp.getX()+1).setY(temp.getY()-1)) &&temp.getX()<maxX&&temp.getY()>=0&&count<6) {count++;}if(count>=5)returntrue;反斜:判断X轴负方向Y轴负方向以及X轴正方向Y轴正方向落子数 count=1;temp.setX(x).setY(y); while(myPoints.contains(temp.setX(temp.getX()-1).setY(temp.getY()-1)) &&temp.getX()>=0&&temp.getY()>=0) {count++;}if(count>=5)returntrue; temp.setX(x).setY(y); while(myPoints.contains(temp.setX(temp.getX()+1).setY(temp.getY()+1)) &&temp.getX()<maxX&&temp.getY()<maxY&&count<5) {count++;}if(count>=5)returntrue;returnfalse;}当有五颗棋子无论横向纵向或者斜向练成一条直线之后,将提示改颜色棋子获胜。(如图3.6所示)。
图3.6获胜提示主要代码如下: publicvoidsetMode(intnewMode) {currentMode=newMode; if(currentMode==PLAYER_TWO_LOST) {Toast.makeText(getContext(),"黑子赢了",3000).show(); currentMode=STOP;}elseif(currentMode==PLAYER_ONE_LOST) { Toast.makeText(getContext(),"白子赢了",3000).show(); currentMode=STOP;}}人机对战游戏用户可以在界面上摁那个人机玩按钮从而转换到人和机玩的那个界面(如图3.7所示)。图3.7人机对战界面 主要代码如下: protectedvoidonCreate(BundlesavedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.play); gameView=(Chessboard)findViewById(R.id.myBang); gameView.player2=Cputer;}人机对战的界面样式与人人对战的样式是一样的,对于棋盘的画法也是一样的,两者的区别就是,在人机对战的模式中,程序的设置增添了人机对战的算法。当开始人和机玩的游戏后,系统会默认人这一方第一个落子,即玩家所执的是黑色棋子。当玩家成功落子后,计算机将会根据玩家落子点的位置根据对应的解题步骤处理,然后落第二个子,电脑执黑子。电脑的算法步骤如下:第一步:首先分析当前的棋盘局势,并设想在某个范围内和对方继续游戏,循环设定双方棋子落地之后,分析在这个范围内双方的局势变化,比如说会不会四子连在一起,或者双方会不会出现双3等。第二步:根据第一步的分析,将上述设想的每一步棋子落地后的结果都整合起来,其中有游戏两方接下来会形成的全部的可能性即每个试探点存在的棋子活3半活4活2等情况的个数。第三步:根据五子棋游戏的规则将第二步所有的结果综合排序,并选择最适当的那一种情况落子(有主动形、被动形两种)。人机对战主要代码与讲解请见附录【1】。当在人机对战的过程中,我们不管哪种颜色的棋子五颗及以上连成了一条直线,则程序将判定该方获胜(如图3.8所示)。 图3.8获胜显示该模式的主要代码在判断获胜一方是与人人对战模式一致的。关于当玩家想要查看关于选项里面的信息时,可以在主界面上点击关于按钮,然后会有一个对话框,上面会介绍该游戏的作者的相关信息,如果想让对话框消失,摁那个确定按钮就可以了(如图3.9所示)。图3.9关于主要代码如下:newAlertDialog.Builder(this).setTitle("作者:麻博超").setMessage( "学号:09060118").setPositiveButton("确定", newDialogInterface.OnClickListener() { publicvoidonClick(DialogInterfacedialog,intwhich) { dialog.cancel(); } }).show(); break;本章小结本章节主要就是介绍了“欢乐五子棋”包含的游戏功能,它是一款基于Android平台的游戏,我们要想实现游戏的操作,可以通过点击手机程序图标进入到游戏主界面,然后再根据不同的游戏玩家的兴趣来转换不同的界面,这个可以摁不同的按钮来完成操作。
系统的测试系统的测试环境接下来要对“欢乐五子棋”游戏的系统的几个方面进行简要的说明,包括开发、运行和网络环境。本系统测试时,必须支持以下的环境配置,否则无法保证系统的可运行性。系统的开发环境操作系统:WindowsXP、Android2.3.1开发环境:Eclipse3.5.0开发工具:AndroidSDK开发语言:Java硬件设备:戴尔本电脑华为Android智能手机NetcoreNW336150MUSB无线网卡系统运行环境服务器端程序目前只能运行Windows系列的操作系统,日后也许会支持跨平台的应用。服务端程序是由java语言实现的,因此不需要预装任何软件,可以直接运行。手机客户端方面操作系统必须是Android1.6以上版本,推荐使用Android2.1以上版本。系统功能测试接下来主要进行的是测试“欢乐五子棋”游戏的一些基本功能。人人对战测试功能实现:可以进入人和人玩的方式。测试目的:可以实现人人对战游戏,游戏中的玩家将一人分饰两角,玩家一和玩家二。测试结果:当玩家一或玩家二有一方的五颗棋子连成一条线,将判定该方获胜。(如图4.1所示)图4.1人人对战测试人机对战测试功能实现:可以进入人和电脑玩的方式。测试目的:可以进行人机对战,并且电脑算法准确,难度比较大。测试结果:实现人机对战。(如图4.2所示)图4.2人机对战测试关于测试功能实现:会转化出一个关于的框框来提示。测试目的:是否可以通过摁主界面上的关于按钮来转换出框框提示。测试结果:屏幕上转换出了关于对话框来提示。(如图4.3所示)。图4.3关于测试本章小结本章主要介绍了“欢乐五子棋”游戏的最终功能测试,通过对开人人对战,人机对战,关于等功能进行测试测试,并且最后都测试通过,整个项目功能已经顺利完成。
系统存在问题及改进方法系统存在的问题此系统基本实现了基于Android系统的五子棋游戏,但是由于时间较紧,还有一些没有实现的功能。首先玩家在进行游戏之前应该选择自己喜欢的棋子颜色,如白色或黑色。其次,程序中没有响应的成绩存储功能。再次,游戏再过程中没有音效,这让玩家在玩游戏的过程中感觉有些枯燥乏味。最后,此款游戏的界面,也就是Android客户端的界面,还存在一定的不足,并没有特别好看的视觉感觉。系统改进方法针对提出的一些不足之处,我们分析出有以下几种办法来弥补:阵营选择:如果想要设计的更贴近用户,那么在开始游戏之前加入提示玩家是否要对棋子的颜色来进行选择,或是红色或是黑色,又玩家自己决定。存储成绩与排名:如果要使得该游戏更人性化,可以加入对各个玩家游戏的成绩的储存以及和其他各玩家相比的排名,根据前面介绍的存储技术来对成绩进行存储,这样使得游戏具备的功能全面。背景音乐:该游戏若能加上落子的音效,更加能够提升游戏的可玩性。
结论Android可以说是目前最受欢迎的手机系统了,而对于手机来说多点触控则是属于当前的热点。多点触控系统摒弃了传统的手机按键式操作方式,用户只需用手指轻触手机屏幕就可以方便的完成打开界面、转换画面、信息查询、拖动控制等功能。在Android平台上开发一款功能强大的系统,可以上让用户使用手机更加的方便,灵活。本游戏是在Eclipse上面设计出来的,运用的Java语言,基于JAVA来运行服务功能的,对于手机客户来说,需要使用的操作系统为Android1.6以上的版本,并且主要运行成功了以下几个的功能:人和人玩、人和电脑玩,关于。1.人人对战:人人对战就是当用户进入到主界面之后,摁人人对战按钮从而开始的游戏。如果摁人和人玩的那个按钮,那么屏幕会进入人和人玩的方式,其棋盘界面与人机对战模式的界面是一样的。在该游戏过程中是没有计算机算法的。游戏玩家可以找一个自己的朋友来一起玩这个人和人的方式,或者自己担任两个角色。在该游戏过程中,两种颜色的棋子分别被参与游戏的双方玩家执有,而且游戏规定先落子的一方默认使用的是黑色的棋子,另一方则为白色棋子,系统默认当游戏双方有任意一方出现五颗及以上的棋子连在一起时,则判定该游戏玩家胜利,反之另一方则失败。2.人机对战:用户在使用手机客户端的时候,先打开该游戏的应用程序,然后在主界面上摁人和机玩的那个按钮,这样就可以开始这个方式的游戏,此时,手机屏幕会跳转到人机对战的界面。在此模式中,系统默认游戏玩家执有黑色的棋子,那么白色棋子归电脑所有。玩家或者电脑双方只要有一方棋子有五颗及以上连在一起时,则该方将赢得胜利。3.关于:当用户在主界面摁那个关于按钮时,将转换到关于那个框框,出现的将是次游戏的作者的资料。通过这段时间对Android编程的学习,不仅让我学习到了以前没有深入学到的知识,同时让我对手机开发产生了一定的兴趣。每一次发现问题,解决问题都让我印象深刻,每一次实现一个功能,都会对本系统有更深的理解。以前没有学习到Android中手势识别和方向传感器的知识,通过本次毕业设计的考验,让我学习到了手机经常用到的,比较新意的东西,而对Java语言和Eclipse开发平台也有了进一步的熟悉。虽然如此,我所学到的还是很有限的,需要在今后更一步的深入学习。
致谢本次毕业设计在我的指导老师于桂玲老师的精心指导下,前前后后历经三个多月的忙碌,终于可以说就要完成了。虽然中间有很多的艰辛与不易,但现在终见成效,喜悦的心情难以言表。首先我很感谢我的指导老师,她的平易近人与悉心教导,让我领悟很多,不仅仅是该论文的写作,更是她的人格魅力,让我感悟到做人应有的对学业以及生活的严谨与认真的态度,这对我受益匪浅,也可以说终将会受益终身。在此,我再次向于桂玲老师表示感谢并致以祝福!同时,我还要对我的母校说声感谢,感谢她四年来的照顾,感谢她给我带来的自豪感,以及母校所有的师生们。因为你们无私的奉献与关怀,不仅使我顺利完成了学业,还教会我很多很多。四年的大学生活使我们真正成长为一个有理想,有追求,有知识的当代青年。在此我还想感谢论文中涉及到的参考文献的学者们。你们就像行路上的明灯,有你们的辛苦钻研与考究,才有那么多可以称得上经典的参考文献,给我完成论文带来了很多灵感的启发。我作为一个本科生,对文章中涉及到的知识的掌握还不是特别的深刻,所以难免会存在一些不足之处,在此,也恳请各位老师能够谅解并且指正,让我能够学习的更好!最后,我要感谢陪伴了我生命中很重要的大学时光的同学们,尤其是帮助我在毕业设计中解决问题与难点的师姐。大学四年,与同学们一起互相帮助,共同进步,不断充实自己。我发自心底地感谢你们对我的帮助和支持!
参考文献[1]林城.Android2.3应用开发实战[M].第一版.机械工业出版社,2011:17-321.[2]韩超.Android经典应用程序开发[M].第二版.人力资源出版社,2011:5-18.[3](美)CayS.Horstmann,CornellG.Java核心技术[M].第一版.机械工业出版社,2008:5-18.[4]刘卫国,姚昱禹.Android与J2ME平台间即时通信的研究与实现[J].Android工程师,2008(11):118-120.[5]刘平.Android手机访问服务器的一种数据交互方法[J].西安财经学院网络与现在教育技术,2010(6):96-102.[6]刘玉平.Java输入输出流及在网站开发中的应用探讨[J].科技实况,2009(18):35-49.[7]赵亮,张维.基于Android技术的界面设计与研究[D].徐州:徐州建筑职业技术学院,2001.[8]陈璟,陈平华,李文亮.Android内核分析[J].Android程序员,2009(4):112-115.[9]刘卫国,姚昱禹.Android的架构与应用开发研究[J].Android程序员,2009(7):110-112.[10]FriesenJ.LearnJavaforAndroidDevelopment[M].NewYork:Apress,2010:19-142.[11]AblesonF,CollinsC,SenR.UnlockingAndroid:ADeveloper’sGuide[M].NewYork:ManningPublications,2009:75-186.
附录【1】人机对战主要代码:privatevoidinitRange(List<Point>comuters,List<Point>humans) { currentRange.xStart=humans.get(0).getX()-RANGE_STEP; currentRange.yStart=humans.get(0).getY()-RANGE_STEP; currentRange.xStop=humans.get(0).getX()+RANGE_STEP; currentRange.yStop=humans.get(0).getY()+RANGE_STEP; for(Pointpoint:humans) { if(point.getX()-RANGE_STEP<currentRange.xStart) { currentRange.xStart=point.getX()-RANGE_STEP; }elseif(point.getX()+RANGE_STEP>currentRange.xStop) { currentRange.xStop=point.getX()+RANGE_STEP; } if(point.getY()-RANGE_STEP<currentRange.yStart) { currentRange.yStart=point.getY()-RANGE_STEP; }elseif(point.getY()+RANGE_STEP>currentRange.yStop) {currentRange.yStop=point.getY()+RANGE_STEP;}} for(Pointpoint:comuters) { if(point.getX()-RANGE_STEP<currentRange.xStart) { currentRange.xStart=point.getX()-RANGE_STEP; }elseif(point.getX()+RANGE_STEP>currentRange.xStop) { currentRange.xStop=point.getX()+RANGE_STEP; } if(point.getY()-RANGE_STEP<currentRange.yStart) { currentRange.yStart=point.getY()-RANGE_STEP; }elseif(point.getY()+RANGE_STEP>currentRange.yStop) { currentRange.yStop=point.getY()+RANGE_STEP; }//如果棋盘被扩充之后多于之前的,那么选之前的棋盘大小 } currentRange.xStart=currentRange.xStart<0?0:currentRange.xStart; currentRange.yStart=currentRange.yStart<0?0:currentRange.yStart; currentRange.xStop=currentRange.xStop>=maxX?maxX-1 :currentRange.xStop; currentRange.yStop=currentRange.yStop>=maxY?maxY-1 :currentRange.yStop; }首先先判定计算机算法的计算范围,然后将分析现有棋盘的形式。主要代码如下: privatePointdoAnalysis(List<Point>comuters,List<Point>humans) {//我们来对属于现行的入口方式进行研究,可以分三个步骤,其中第三步骤的难度控制可由子类干预 if(humans.size()==1) {//第一步 returngetFirstPoint(humans); } //初始化计算范围 initRange(comuters,humans); //清除以前的结果 initAnalysisResults(); //开始分析后,我们通过对所有没有棋子的点来得出第一次分析结果 PointbestPoint=doFirstAnalysis(comuters,humans); if(bestPoint!=null) { //System.out.println("这步就必须这么走了,是非常需要的"); returnbestPoint; } //我们通过第一次的结果来判断哪个点最适合自己 bestPoint=doComputerSencondAnalysis(computerFirstResults, computerSencodResults); if(bestPoint!=null) {//System.out.println("马上就赢了,必须走这步"); returnbestPoint; } computerFirstResults.clear(); System.gc(); //我们利用第一次的结果来选出敌人最重要的那个的点 bestPoint=doHumanSencondAnalysis(humanFirstResults, humanSencodResults); if(bestPoint!=null) { //System.out.println("再不下这个棋子就输了"); returnbestPoint; } humanFirstResults.clear(); System.gc(); //没有找到一招致命的点,第三次结果分析 returndoThirdAnalysis(); } //根据人和人玩的时候分析首先要进行的落子步骤来进行,这个过程的计算过程很简单 privatePointgetFirstPoint(List<Point>humans) { Pointpoint=humans.get(0); if(point.getX()==0||point.getY()==0||point.getX()==maxX &&point.getY()==maxY) returnnewPoint(maxX/2,maxY/2); else { returnnewPoint(point.getX()-1,point.getY()); } }当第一步完成之后,计算机开始分析,扫描所有空白的点,形成第一次分析结果,主要代码如下: privatePointdoFirstAnalysis(List<Point>comuters,List<Point>humans) {//我们通过观察所有没有棋子的空格来分析得出第一次结果 intsize=allFreePoints.size(); PointcomputerPoint=null; PointhumanPoint=null; intx,y; FirstAnalysisResultfirstAnalysisResult; for(inti=0;i<size;i++) { computerPoint=allFreePoints.get(i); //为了防止在分析的时候会将原来的对象改变,我们需要把坐标记下 x=computerPoint.getX(); y=computerPoint.getY(); if(x<currentRange.xStart||x>currentRange.xStop ||y<currentRange.yStart||y>currentRange.yStop) { continue; } //我们在这个位子落子,并分析落子后在横向上的状态,如活4,活3,半活4,活2等所有状态 firstAnalysisResult=tryAndCountResult(comuters,humans, computerPoint,HENG); computerPoint.setX(x).setY(y);//为了下一次分析撤销此步 if(firstAnalysisResult!=null) {//如果没有结果,那么这个情况下不能分胜负 if(firstAnalysisResult.count==5)//如果等于5,那表明有一种颜色的棋子已经出现五个及以上在一起的情况,胜负已定 returncomputerPoint; //记录第一次分析结果 addToFirstAnalysisResult(firstAnalysisResult, computerFirstResults); } //在“纵向”对上面的步骤再走一次 firstAnalysisResult=tryAndCountResult(comuters,humans, computerPoint,ZHONG); computerPoint.setX(x).setY(y); if(firstAnalysisResult!=null) {//死棋,不下 if(firstAnalysisResult.count==5) returncomputerPoint; addToFirstAnalysisResult(firstAnalysisResult, computerFirstResults); } //正斜向 firstAnalysisResult=tryAndCountResult(comuters,humans, computerPoint,ZHENG_XIE); computerPoint.setX(x).setY(y); if(firstAnalysisResult!=null) { if(firstAnalysisResult.count==5) returncomputerPoint; addToFirstAnalysisResult(firstAnalysisResult, computerFirstResults); } firstAnalysisResult=tryAndCountResult(comuters,humans, computerPoint,FAN_XIE); computerPoint.setX(x).setY(y); if(firstAnalysisResult!=null) { if(firstAnalysisResult.count==5) returncomputerPoint; addToFirstAnalysisResult(firstAnalysisResult, computerFirstResults); } //分析在横向上对方棋子的状态是怎样的,如敌方的活3、半活4等 firstAnalysisResult=tryAndCountResult(humans,comuters, computerPoint,HENG); computerPoint.setX(x).setY(y); if(firstAnalysisResult!=null) { if(firstAnalysisResult.count==5) humanPoint=computerPoint; addToFirstAnalysisResult(firstAnalysisResult,humanFirstResults); } firstAnalysisResult=tryAndCountResult(humans,comuters, computerPoint,ZHONG); computerPoint.setX(x).setY(y); if(firstAnalysisResult!=null) { if(firstAnalysisResult.count==5) humanPoint=computerPoint; addToFirstAnalysisResult(firstAnalysisResult,humanFirstResults); } firstAnalysisResult=tryAndCountResult(humans,comuters, computerPoint,ZHENG_XIE); computerPoint.setX(x).setY(y); if(firstAnalysisResult!=null) { if(firstAnalysisResult.count==5) humanPoint=computerPoint; addToFirstAnalysisResult(firstAnalysisResult,humanFirstResults); } firstAnalysisResult=tryAndCountResult(humans,comuters, computerPoint,FAN_XIE); computerPoint.setX(x).setY(y); if(firstAnalysisResult!=null) { if(firstAnalysisResult.count==5)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DB51T 1731-2014 成熟蜂蜜生产技术规程
- DB51T 1491-2012 手推式挤奶机使用技术规范
- DB51T 1022-2010 辣椒抗疫病性室外盆栽人工鉴定技术规程
- 新建乳化机项目可行性研究报告
- 新建车载式FM音频发射器项目立项申请报告
- 新建矿用防爆四轮运输车项目立项申请报告
- 化工设备项目立项报告
- 年产xx油漆杂品工具投资项目可行性研究报告
- 2024-2030年机械疗法器具公司技术改造及扩产项目可行性研究报告
- 戊类功放课课程设计
- 人人爱设计学习通超星期末考试答案章节答案2024年
- 铜材压延生产节能减排关键技术研究
- 500字作文标准稿纸A4打印模板-直接打印
- 五年级体质健康数据
- 牛津英语9B-课文翻译
- 绿化养护记录表(共2页)
- 环氧树脂的固化机理及其常用固化剂.ppt
- 真空蒸镀中部分金属熔点及不同气压下蒸发温度
- 中日标准件对照表
- 关于成立电子产品公司商业计划书(参考模板)
- 坝基渗漏问题分析
评论
0/150
提交评论