基于WEB平台的背单词应用设计与实现毕业论文_第1页
基于WEB平台的背单词应用设计与实现毕业论文_第2页
基于WEB平台的背单词应用设计与实现毕业论文_第3页
基于WEB平台的背单词应用设计与实现毕业论文_第4页
基于WEB平台的背单词应用设计与实现毕业论文_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

1、本科毕业论文(设计) 题 目: Web平台下的背单词 App设计与实现 学 院: 软件技术学院 专 业: 数字媒体艺术 姓 名: 刘 相 指导教师: 李 晓 娜 2014 年 5 月 26 日 摘 要由于网络相关技术的快速发展,现代人对于英语的学习也开始发生了很大的改变,比如六级单词冲关等,非常成功的实现了使用网络工具帮助用户进行英语学习。本论文在解析其他单词平台的基础上,自主开发了一款背诵单词的软件。从编码测试,架构设计,需求分析等等方面进行了细致的介绍。该软件包括服务器后期平台架构的组成,相应客户端页面实现。该应用已在局部范围内上线运营,本应用与相应背诵单词软件相比较而言,还有很多需要完善

2、的地方。关键词:背单词,网络背单词,单词学习ABSTRACTDue to the rapid development of network-related technology, modern people have begun to learn the English language has undergone great changes, such as six words washed off, etc., to achieve a very successful tool to help users use the network for English learning. This

3、 paper, based on analytical platforms other words, recite the words of a self-developed software. Carried out a detailed presentation from the encoding tests, architecture design, requirements analysis, etc.,. The composition of the latter part of the software, including server platform architecture

4、, the corresponding client page implementation. The application is on-line operations in the local area, the application and the corresponding software comparison to recite the words, there are many needs to be perfected.Keywords:Word back, the network back word, word learning目 录 1 绪论11.1 课题背景与意义21.

5、1.1 课题来源21.1.2 课题背景与意义31.2 国内外研究现状21.2.1 Web2.0对英语学习的影响21.2.2 现有背单词应用:托词31.2.3 现在背单词App的特点3 1.3 课题研究内容21.3.1 研究目标21.3.2 主要任务31.3.3 采用的开发环境21.3.4 关键技术难点3 1.4 论文组织结构22 需求分析22.1 系统建设总目标22.2 功能性需求22.3 非功能性需求22.4 本章小结23 相关原理与技术63.1 Tomcat23.2 J2EE23.2.1 Struts223.2.2 DWR33.3.3 JDBC23.3 MVC开发模式23.4 jQuery

6、23.5 本章小结24 系统总体设计84.1 系统整体架构设计84.2 系统整体功能设计84.2.1 用户登录24.2.2 背诵单词34.2.3 测试单词24.2.4 数据同步24.2.5 排行榜34.2.6 单词本24.3 页面迁徙方案设计24.3.1 背诵,测试页面24.3.2 其他页面34.4 数据库设计24.5 本章小结25 系统详细设计与实现135.1 功能设计135.1.1 系统初始化25.1.2 用户背诵单词35.1.3 用户测试单词25.1.4 单词本操作25.2 策略设计145.2.1 DWR应用25.2.2 单词切换设计策略35.2.3 浏览器兼容设计25.2.4 单词选择

7、策略25.2.5 同步策略35.2.6 安全策略25.3 本章小结206 系统测试评估226.1 功能设计136.1.1 测试环境26.1.2 测试用例36.1.3 兼容性测试26.2 系统评估146.3 本章小结20总结与展望22 总结 展望致 谢24参考文献25青岛大学本科生毕业论文(设计)1 绪论 1.1 课题背景及意义 一个专用来解决英语学习者在学习英语的过程中遇到的记忆单词困难的背诵单词WEB平台。软件采用循环记忆以及图片声乐配合记忆的方法,再结合艾宾浩斯遗忘曲线规律,极大的客服了英语学习过程中的枯燥问题,帮助英语学习者快速的进入到一个相应的学习状态中去,以期形成永久记忆。别致的图文

8、声三位一体记忆单词系统,新颖独特的图片单词群记忆功能,对艾宾浩斯遗忘曲线原理的完美理解与运用,用好本平台将会极大提升英语学习者在学习过程中的效率。1.2 国内外研究状况 1.1.1 WEB2.0对英语教育及学习的影响 伴随着WEB2.0时代的到来,人们学习英语的习惯也悄然发生着变革。人们学习英语从以前的仅仅在网络上浏览相关信息资料进一步发展到通过自己建立相应网站帮助自己或者他人学习外语,逐渐使用RSS对应技术来下载订阅必要的外语资料在这些地方WEB2.0发挥了巨大的辅助学习作用。近些年我国教育部向全国不同高校推荐了几套大学英语教材,里面都包含有我们将要体积的网络在线学习系统,很多都是用了 有“

9、全天候的开放式的教育辅导资料”+“网络自测题库”+“主流的学习管理系统”+“学生与老师的互动”等等。为学生的进一步发展创造了条件。在WEB2.0时代主流思想和相应理论的指引下学习WEB2.0,运用了如RSS,SNS,WIKI,BLOG等媒介工具,来进行学习活动。像英语这种语言,其信息传播功能展示了其与网络的强大结合点,学友们建立的英文网站,以多形式展现了丰富全面的英语百科知识,以全民性的环境来促进大家在日常生活中对英语的学习,以师生互动网络互动的方式提高传播率,这种帮助英语学习者学习,主动提高英语学习过程中的积极性,展示出这种新的英语学习模式的强大优势。 2.1.1 目前的记忆单词应用:托词

10、新形式的网络教育,产生与互联网出现以后,高速的网络联通状态使传统的教育形态发生了改变。大家接受外语教育的形式在这以后极大的改变,这些探索和尝试的掘金者,为新兴的服务产业带来了新的发展机遇。 托词是一款专为英语薄弱者提供词汇突破的一种服务,同时它也是一款用于背单词的软件,它包括两个网页以及客户端两个方面,依据客户端收集的用户记忆单词反应速度来更好的评估对单词的记忆掌握程度。托词在一些细微的应用上采用了一些心理学原理,不仅设置了冲关倒计时,还只计算用户在托词上的学习时间而不去计算他的在线时间。 跟以往的背单词应用相比,托词拥有自己独立的算法,它不仅全方位记录了每位用户在学习过程中的处理事件行为,从

11、而个性化的为每位用户提供他继续的服务需求。 1.2.3 现在背单词应用的特点 现在的背单词应用多了很多互动共享的功能,例如,不少的背单词应用都具有好友排行榜以及单词本功能;在学习过程中为使用者提供相应的视频,图片,以及配套的解释资料,在线管理者也可以根据广大客户的使用情况才用特点算法进行具体的分析,并对使用者提供适用建议与使用帮助。1.3 课题研究内容 1.3.1 研究目标 利用现有的网络在线背诵单词应用的基础之上,独立研发一款与众不同的网络背诵单词应用。 1.3.2 任务 WEB平台下的网络应用应具有的功能: 在线实时记录用户背诵单词情况。 创造竞争压力,制定用户学习排行榜。 用户生词本用来

12、记录用户的学习情况。 系统与用户交互,自行选择需要学习的板块。1.3.3 应用的开发环境操作系统: Windows 7及以上;项目框架: JDBC+Struts2+DWR;编程语言: JAVA1.6;集成环境: Eclipse+Tomcat6.0;1.3.4 核心技术问题1 背诵单词的过程中选择怎样的模块策略。2 实时性与交互性,用户需实时从服务器读取单词数据,用户过多可能导致服务器崩溃。3 算法对用户背诵单词状况的分析。1.4 论文框架结构论文第一章是绪论部分,说明本文需要阐释的课题,其中包括论文课题背景及来源,还有论文中设计的一些概念问题和各国研究状况对比。本文第二章将要进行应用的需求分析

13、。第二章颇为详尽的阐述了开发此系统的所有要求,例如有非功能性要求。用户的各种需求都被需求用例图详尽的阐述,比如背诵单词,学习单词发音等。兼容性以及稳定性是非功能性需求非常看重的。本文的第三章隆重介绍了课题所涉及到的相关技术及原理。包括有JAVA2EE框架和Struts2框架等。本文的第四章用来做总体系统设计。着重讲了系统总体逻辑,之后阐述了整个系统的设计功能,包括数据库的搭建,整体架构的铺设。本文的第五章是用来详细的阐述整个系统。系统的三个方面,包括生词本的记录操作,测试新单词,记忆单词等等都做了十分详尽的说明。之后又详细的介绍了系统采用的算法策略;如安全选择策略,实时性策略,同步策略,单词切

14、换策略等等。本文的第六章用来进行了系统的测评。此章中展示了应用的测试用例,最后进行应用的总体测评。2 需求分析2.1 系统建设总体目标开发此应用依据<<英语等级考试-词汇大冲关>>的教材,这里面的单词按照<<词汇大冲关>>的分类,分成了30关,相当于每天一关。本WEB应用会保存用户背诵单词情况。本应用不支持注册功能,用户能够自行选择已解锁的一关背诵单词,如果之前一关的单词测试没有通过则不能到下一关去,突出闯关的特点。2.2 功能性需求如图2.1所示。1 用户可以依据此背诵单词的APP:(1) 单词测评。词库里的单词可以依据用户自己的意愿来测试。(

15、2) 词库选择。词库里的单词按照一定数量进行分组,用户选择相应的关卡来背诵单词。(3) 单词的背诵。选择了单词关卡后,用户才可以按照关卡里的单词进行背诵。2 管理单词本的一些需求:(1) 检查生词本。可以根据自己的需要来检查生词本。(2) 单词删除。可以自由删除掉生词本里已掌握的单词。(3) 添加生词。在本APP的应用中,遇到不会的单词,可以随时添加到生词本。3 本应用的功能:(1) 用户必须登录APP,才能使用本软件背诵单词等。(2) 不同的用户可以通过排行榜参与竞争,参与排名,可以在排行榜上查到自己的资料。(3) 用户可以通过网站分享自己的学习心得。4 其他功能:(1) 单词读音初始是默认

16、的。用户按照自己的意愿来设置声音的开关。(2) 系统自动统计用户对单词的背诵情况。2.3 非功能性需求1. 稳定性相关:系统在长时间较多用户使用的情况下,不会出现系统无故崩溃等现象,日常操作不出现无故错误。2. 兼容性相关:本软件支持多种类型的浏览器:360安全浏览器,FireFox,Safari。3. 易掌握性相关:用户上手简单,操作起来非常容易。4. 性能相关:系统对于用户背诵单词的响应时间处于可接受的范围。2.4 小结 本章阐述了系统功能性要求与非功能性要求的方方面面。例如一些排行榜,生词本,背诵统计等等。而非功能性要求考虑到了稳定性与兼容性等方面。2 相关原理技术图2 基本框架图整个游

17、戏三个模块:单挑模块,辩论模块,作战模块。由于时间有限以及水平的限制,我们目前只是实现了前两个模块的演示版本。在游戏中,每个玩家可以申请一个账号,每个账号代表一个玩家。在游戏中玩家可以根据自己的喜好选择游戏模式,单挑模块的游戏模式是两个玩家之间的单挑,每个玩家出三个武将卡(根据游戏不断搜集),然后双方按照一定的规则进行,当对方的三个武将全部死亡的时候那一方就算输。辩论模块则是双方每人6张牌,根据一定的规则进行辩论驳之后,谁先出完手中的牌谁就算获胜。单兵作战模块则是根据最终粮草值的多少决定胜负。玩家随着通过不断的游戏可以提高自己的级别,从而换取更多的武将卡,进而获得更多的用户体验。而整个游戏最重

18、要的却是游戏的网络模块和社交模块。由于整个游戏的社交性,使得这款游戏的传播与发展十分迅速。如果有一个玩家玩这个游戏并且获得了很好的用户体验,他就会把这个游戏介绍给他的其他朋友并且朋友之间可以在游戏中互相交流。在游戏的技术上,首先是Android游戏框架,我们整个游戏是基于Android平台开发的,所以说使用到了Android的游戏开发的相关知识,游戏的界面形成是利用的Android中的surfaceview类,不同界面之间传输消息是使用的Handler机制,Handler机制是Android中特有的用于不同界面之间进行消息的传输。其次,在编写第二个辩论模块的时候我们使用了rokon引擎。rok

19、on是一款专门用于开发Android平台下的手机游戏的引擎,它是基于openGL ES进行开发的游戏引擎,可以实现很多复杂的物理效果。在辩论模块的游戏中主要使用了Rokon的基本框架RokonActivity取代了Android里面的Activity,由于Rokon功能比较强大,所以很多工作实现起来相比较于在Android上直接实现要简单许多。在Rokon中大量的使用了精灵(sprite)的概念,游戏中每一幅图都是一个精灵。很多Android中需要创建线程去完成的工作在使用了rokon引擎之后也比较容易完成,因为许多相对底层的工作都已经被事先做好,开发者只要直接调用就可以。最后在游戏的网络模块

20、使用了客户端/服务器的架构,即c/s架构,实现了不同玩家通过网络进行相互对战。这种客户端/服务器的架构是最传统并且使用度最高的一种网络模式。目前市面上的网络游戏除了网页游戏之外大都使用这种架构。该架构主要是基于socket链接实现的,通过socket将客户端与服务器实现一个链接,双方可以互相发送信息,并将处理的结果反馈回去。比如,当双方的牌比较完之后,会将比较结果反馈给服务器,服务器经过信息处理之后,将结果在返回给玩家,玩家就可以看到究竟是谁输谁赢。 游戏最初的设想是要加上社交模块的,玩家可以在游戏之中交朋友并且可以与朋友进行交流或者交换彼此的卡片。加上社交功能之后游戏更加完善,可是由于水平的

21、限制,目前还没有实现这一功能,在将来我们会把这个游戏做的更好更完善。这就是整个游戏大体的框架。4 系统设计4.1 功能模块设置整个游戏主要分为三个模块:单挑模块,辩论模块,网络连接。单挑模块是每个玩家的生命值都为5,并且每个武将手中有五张牌,双方按照一定的规则(见策划案)进行游戏,最终生命值为0的玩家输掉比赛。辩论模块则是每个玩家手中都有6张牌,双方按照辩论驳等一系列规则进行游戏,先将手中的牌发完的一方获得比赛的胜利。 网络连接是实现不同玩家之间的网络对战,玩家通过选择网络对战模式可以和其他玩家进行PK。该游戏的网络连接使用的是c/s架构,即客户端/服务器架构,主要用到的知识是socket编程

22、。这三个模块之外还有两个模块,是作战模块和社交模块。作战模块是区别于单挑模块和辩论模块的一种新的玩法,主要模拟的是战场上的带兵打仗,在一定的时间段之内,最后谁的兵力多,粮草值丰富,谁就获胜。社交模块则是为了突出游戏的社交性,通过玩家之间的交流可以激发玩家游戏的兴趣,玩家之间可以交换已经拥有的卡片,并且使得游戏传播速度更快。4.2 游戏UI界面的设计UI的意思是用户界面(user interface),就是游戏与玩家交互的界面。优秀的用户界面可以增强用户体验,使得玩家获得身临其境的紧张感,带入感强烈。而游戏中UI的设计除了美工之外,更加离不开内部的程序逻辑。只有内部的逻辑正确,游戏的画面才能正确

23、的布局,每一张图片出现在应该出现的位置,这些工作都需要游戏逻辑去完成,而由于游戏中画面繁多,游戏状态不停改变,并且游戏的界面不停地转变。因此逻辑的实现是一项比较难完成的工作。在三国志这个游戏的单挑模块,我们使用了Android中的一个SurfaceView类,surfaceView类主要有surfaceChanged,surfaceCreated,surfaceDestroyed三个方法组成 。surfaceHolder类的一个起到控制作用的类,它主要对surfaceview的大小,格式等信息进行控制,并且主要用于监听SurfaceView的状态。该类主要保存的是view的像素数据,Andro

24、id系统通过surfaceHolder与surfaceview打交道。surfaceHolder对其进行监听的接口是Callback接口。当创建一个surfaceview时需要响应三个方法,这三个方法分别是: public void surfaceCreated(SurfaceHolder holder); public void surfaceChanged(SurfaceHolder holder,int format ,int width,int height); public void surfaceDestroyed(SurfaceHolder holder); 当程序执行的时候,首

25、先调用的是一个surfaceCreated方法,该方法的作用就是创建一个surfaceview界面,一般的程序会在重写这个方法时开启一个线程,从而让游戏进入开始界面,并且保证线程不断地执行,在玩家进行其他操作之前整个游戏一直保存在开始界面,直到玩家碰到某个按钮后,程序会产生一个碰撞检测,那时游戏才会从一个Surfaceview变换到另一个surfaceview,并且重新调用一个surfaceCreated方法。在游戏中刚进入游戏时是一个开始界面,由玩家自己选择会进行哪个操作。如果玩家选择了单挑模块,程序会自动进入游戏,如果玩家选择了辩论模块,游戏会进入另一个模块,整个游戏就是采用这种方式实现的

26、。surfaceChanged方法是在SurfaceView的状态发生改变时才会调用的。比如,当游戏进入暂停状态时就是一种游戏状态的转变,此时游戏进入了暂停状态,这时候操作系统就会调用该方法进行相应的操作,当暂停结束之后,程序会再一次的回到游戏之中,这样,就不会影响整个游戏的进程。surfaceDestroyed则是在游戏界面转换到另一个界面时调用的,他的作用是当一个界面被关闭或者是从一个界面转移到另一个界面时,会自动调用这个方法,将本界面占用的内存资源全部删除,并且将整个游戏之前开启但是现在不再需要的线程全部关闭。这样就可以节省很多内存空间,使得游戏和其他程序运行更加流畅。 在安卓游戏开发中

27、,这三个方法不同的变换使用,就构成了整个游戏的基础架构,在游戏运行时,三个方法不断地被调用,整个游戏就顺畅的运行,无论是暂停,开始还是结束都十分顺畅,这样循环往复,就构成了一个游戏的整体。在我们三国志这个游戏中,当我们需要进入某个游戏模块时,会相应的调用不同的SurfaceView里面的方法,当进入单挑模块时,代表单挑模块的SurfaceView就是会进行这样的改变。当游戏从开始界面跳转到单挑界面时,代表开始界面的SurfaceView就会进入调用surfaceDestroyed方法关掉已经开启的线程和占用的内存资源,然后代表单挑模块的SurfaceView就会调用其中的surfaceCrea

28、ted方法,创建一个新的游戏界面,这样玩家就进入了单挑界面。整个游戏的大体工作流程就是这样的,当关闭整个游戏的时候,会自动调用surfaceDestroyed,从而销毁整个程序所占的内存空间,这样就避免了资源的浪费,不会影响其他软件的运行。打开游戏之后,首先进入的是MenuView界面,即菜单界面。在MenuView的surfaceCreated中启动一个menuThread线程,该线程的作用是调用draw方法不断地绘制游戏开始界面,开始界面上包含很多按钮,其中最上面的五个分别是:演武场,辩论台,练兵场,征兵所,寄售行。这五个按钮是游戏的核心功能,前三个就代表着游戏的两个模块:单挑模块和辩论模

29、块。左边的按钮则是代表玩家的一些基本信息,包括玩家的等级,装备以及手中的卡牌数等。右边则是涉及到一些网络的按钮。这些按钮每一个都对应着一个碰撞检测,每一次当玩家按下去的时候都会产生相应的调用,并且进入另一个界面。该界面呈现在屏幕上便是开始界面,在开始界面上有一个onTouch函数,该函数的作用是实现手机触屏,当点到演武场按钮时,就进入单挑模块,当点到辩论台按钮时就进入辩论模块。如图3:图3 游戏的开始界面进入单挑模块之后,会出现以下布局:上方是吕布头像,并且有五张从大到小排列的牌 。下方是赵云头像,也有从大到小顺序排列的五张牌。右下角是出牌,委任,强退三个按钮。中间的部分是出牌区,电脑和玩家发

30、出的牌都显示在出牌区中。该界面的显示主要由gameView实现。gameView中的draw方法主要完成背景的绘制以及玩家手中牌的绘制,武将(赵云,吕布)头像的绘制。onTouch方法主要是实现牌的跳出,玩家点一下纸牌,被点中的牌就跳出来。其中用到的方法主要是改变坐标值,点击一张纸牌,纸牌的纵坐标y就会减去15,体现在屏幕上就是纸牌跳出来。当第二次点击的时候,纸牌的坐标会加上15,纸牌又回到原来的位置。如此循环,实现了选择纸牌的方法。当点击出牌的时候,会调用Desk类中的onTouch方法,被选中的牌的坐标值会改变,当下一次程序再执行绘制方法draw的时候,就会将被选中的纸牌绘制在出牌区。这样

31、就实现了出牌的方法,如图4:图4 玩家出牌图在经过比较函数之后,会进行玩家生命值的绘制。生命值的绘制的方法主要是运用两个变量:blood_pc和blood_npc,两个变量的初始值都是5,每进行一次比较,两个变量的值都会改变。在绘制的时候根据变量的值绘制不同的血量,当其中一个玩家的血量为0时,(含图)会调用draw方法,绘制单挑胜利或者单挑失败的画面。当绘制完成之后,游戏会给sanguoActivity这个类通过Handler发送一个消息,告诉该类显示一个新的游戏界面,这样游戏会返回到开始界面。当玩家再次游戏的时候可以选择相应的界面进行游戏。单挑模块的作用是一样的,当点击了辩论按钮时,游戏就会

32、自动进入辩论模块,辩论模块中的布局和单挑模块的布局大体一致,只是游戏模式从武将的金戈铁马变成了文官的唇枪舌剑。效果如图5和6:图5 游戏单挑界面图6 游戏辩论界面5 系统实现5.1 游戏音效光效的实现游戏的声效和光效对整个游戏的用户体验很重要,因为一个游戏除了优美的界面和正确的逻辑算法之外,光效和音效也是决定一个游戏成功与否的关键。因为好的光效和音效可以增加玩家的带入感,如果一个游戏在出完牌之后没有任何动作,就会显得没有任何带入感,相反,如果在每张牌出完之后如果出现一道漂亮的刀痕或者火花之类的特效则显得生动许多。当一方的牌小于对方的时候,如果说只是血量上减少的话,这样效果会很不明显,游戏会很难

33、吸引玩家,如果在输的那一方的头像上画上一个刀疤,再加上一声呻吟的音效。在一些著名的游戏中光效和声效都起到了显著的作用,例如著名的游戏魔兽争霸中各种魔法的特效,刀光剑影以及诡异的音效,真的像是将玩家带入了魔兽世界中一样。这样会更加生动,同时也让胜利的一方获得一种优越感,从而更加集中精力的玩游戏。可见游戏的光效和声效是十分重要的。如图7:图7 游戏特效游戏中光效的实现方法是首先创建一个Bitmap数组,动画特效的实现是连续的播放几张相似却不同的画面,从而产生动画的效果,在游戏中也是这样。先将游戏中不同的几帧图片存放在一个数组中,然后当游戏触发一个动画特效(发出一套牌)时,程序会相隔一段时间然后一帧

34、帧的绘制出每一张图片,这样就会产生一个动画的效果。比如游戏中当赵云发出一套牌的时候,程序会调用虎威这个Bitamp数组,然后就会产生一个动画。如图8:图8 游戏光效效果图5.2 游戏部分算法实现游戏的算法是游戏的核心部分。只有正确的算法才能支撑整个游戏的算法,如果算法不正确,游戏就难以继续运行下去,在这个模块主要是游戏中游戏基本功能的算法实现,也是整个程序运行的基础。Card类的设计:Card类的作用是创建card对象,每一个card对象都代表一套牌,游戏中的牌型主要有单牌(即一张牌),同点(两张牌一样,三张牌一样,四张,五张牌一样),顺子(三顺子,四顺子,五顺子)。在游戏中每一种牌的类型就是

35、一个对象,每当选中要发出的牌并且点击出牌按钮时,就会触发一个碰撞检测,然后程序会自动创建一个card对象。首先在Card类中编写了一个构造函数:public Card(),其中传入方法的参数是pokes数组,该数组主要的作用是记录选中了哪张牌。还有两个Bitmap对象,其中一个是传入的纸牌背面的图片,另一个则是传入的纸牌正面的对象。最后一个传入的参数是确定该card对象究竟是玩家手中的card还是电脑手中的card。该构造函数的作用是初始化Card类中的变量,并且用来创建Card对象。除了构造函数之外,还有两个paint方法,之所以使用两个paint方法主要是因为在双方发出牌之后有一个比较,用

36、来比较双发发出的牌的数量是否一样。此时牌应该是反着的,玩家是看不见牌的,此时会调用第一个paint方法进行一次绘制,绘制的是纸牌的背面。而当比较完双方发出的纸牌的数量且发出的牌的数量一致时,会调用Card类中的第二个paint函数,这个paint方法是将牌翻转过来,即绘制的是牌的正面,此时双方的输赢会完全的展示在玩家眼前,血量也会根据比较的结果进行重新绘制。除了这些方法之外,还有一个updatecard(int pokes)方法,该方法的作用是更新card对象,每一次发完牌都会对玩家手中的牌进行一次更新,而这个方法的作用就是对玩家手中的牌和电脑手中的牌以及玩家发出的牌进行更新,这个方法主要改变

37、的变量:pokes,即玩家手中的牌。玩家手中牌的数量length。以及发出的牌的类型。主要改变的就是这些变量。这样card对象就能形象的模拟现实中的各种出牌方式。通过整个card类的设计,完成了游戏中最基本的一个类的设置,之后所有的游戏进行都是以这个类为基础进行的。因为整个游戏是卡牌类的游戏,所以说卡牌以及出牌的规则还有纸牌的绘制是整个游戏的基本。Card类刚好解决了卡牌和出牌的类型以及卡牌的绘制问题。通过这个设计之后,可以在之后的编写代码中省去很多工作。在这个游戏中卡牌是基础,Card类实现的一些基本功能将被反复的利用。在出牌时会调用,在判断时也会调用,在游戏结束时也会调用。而现在我们已经完

38、成了一些基础的工作,接下来将要实现的是玩家的出牌和电脑的出牌规则。AnalyzePoke类的作用:这个类中的方法主要是对玩家和电脑手中的牌进行分析。首先定义一个countPokes数组,该数组的作用是记录1到9每种牌出现的次数,比如玩家手中有一张5,而countPokes4就会加上1,这种方式可以记录玩家手中有几张每种数字的牌。同点的分析:遍历整个countPokes数组,如果其中某一个countPokesi等于5,则表示i+1数的牌有5张。比如当countPokes5等于5,则表示玩家手中有五张6。当确定了哪种牌有五张时,就可以新建一个tongdians数组存放着5张牌,并且将这个数组存放到

39、Vector容器中。同理,每一种同点的判断都是采用这种方法,唯一的不同就是tongdians数组的大小不同,三同点时tongdians的大小就是3,当牌为单牌时也是使用这种方法将每张牌存入Vector容器中。顺子的分析:如何判断一组牌是顺子。首先声明两个变量,dstart=dend=-1。然后遍历整个countPokes数组,如果countPokesi的值大于等于1,则dstart=i,这样i不停的加,让此时的dend等于i,直到countPokesi<1为止。当countPokesi<1的时候,先判断dend-dstart+1的大小是不是5,4,3。如果是,创建一个数组dansh

40、un,这个数组的大小是dend-dstart+1。然后将pokes中的值赋给danshun数组。最后将这个数组加入到Vector容器中。三张顺子,四张顺子,五张顺子都是这个原理。Poke类的作用:getPokeType()方法,该方法的主要作用是确定传入的数组是什么牌型。当传入的数组元素个数是1时,该类型为单牌。当传入的数组元素个数是2时,如果两张牌上的数字相等则为同点,如果数组元素个数是3,那么先判断每个数组中的数代表的牌上的数字是否相等,如果不相等,然后判断是否每张牌上的数字都差1。如果成立的话则代表是三顺子。四张的时候以及五张的时候分析方法和以上相同,再次不再继续说明。当所有这些条件都不

41、成立的时候,这组牌的类型就是error。Poke类中有两个最重要的方法,分别是outCardByItself()方法以及findTheRightCard()方法。这两个方法主要实现的功能:电脑先出牌时会调用outCardByItself()方法,此时电脑会选择自己手中最大的牌发出,如果电脑手中有五张同点,则电脑返回一个数组,这个数组就代表整个电脑手中的牌,就是五张同点。若是玩家没有五张同点,则判断是否有五张顺子,如果有,则返回一个数组,若没有,继续判断玩家手中是否有四张同点,判断完四张同点之后会判断是否有四张顺子。四张的同点和顺子判断完之后是判断三张的同点和顺子。有牌就出最大的,当判断完三张之

42、后,会判断手中有几套两张的同点,然后挑选最大的出。若是以上的每一个牌型都没有的话就会从所有的单牌中挑选最大的发出。findTheRightCard()方法则是根据玩家发出的牌在确定自己要发的牌,具体规则如下:当有五张同点或顺子时,电脑直接出牌。当电脑手中有四张顺子或同点,而且玩家发出的牌的数量小于等于4,则电脑发出牌。如果电脑手中最大的牌是三张同点或顺子且玩家出的牌小于等于3,则电脑出牌。当电脑最大的牌是两张顺子且玩家发出的牌的数量小于2时,电脑出牌。最后当所有的情况都不满足时,则电脑从自己手中的牌中挑选最小的几张出牌,选中的个数是玩家发出的牌的个数。Person类的作用:person方法是这

43、个类的构造方法,该方法的作用主要是初始化一些变量和一些Bitmap对象,Bitmap是Android里面自带的绘图类。初始化的变量主要是玩家手中的牌,创建的对象是玩家还是电脑根据变量id判断。paint方法,该方法的作用是进行玩家手中和电脑手中的牌的绘制。电脑手中的牌是绘制的反面,因为玩家是看不到电脑的牌的。而玩家手中的牌则是绘制的正面,而且玩家手中的牌是按从大到小的顺序排列的。chupaiAI方法是电脑的出牌方法,传入该方法的参数是玩家发出的牌,该方法的作用是如果玩家之前没有发牌,那么调用outCardByItself()方法,电脑根据分析自己手中的牌直接发出自己手中最大的牌。如果电脑已经发

44、出一套牌,则调用findTheRightCard()方法,根据电脑发出的牌的数量出牌,返回一个pokeWanted数组。当发出牌之后,电脑会自动更新自己手中的牌。pokes代表是一个数组,该数组存放的是电脑手中的牌,接下来会进行一个比较,删除pokes数组中与pokeWanted相等的值。这样就相当于更新了一下电脑手中的牌,在下一次绘制的时候,就会看到电脑的牌减少了。bupaiAI方法是如果玩家发出的牌的数量大于电脑发出的牌的数量,该方法传入的参数是双方牌数相差的个数。bupaiAI的作用就是电脑自动补上双方相差的牌数。新建一个tiqupai数组,这个数组的大小刚好是双方出牌数的差值,然后电脑

45、从自己的incard中选择相应数量的牌加入到outcard中,即在电脑发出的牌中添上相等数量的牌,这样玩家发出的牌和电脑发出的牌的数量就相等了。当双方的牌的数量相等时就会进行比较,并且产生结果了。游戏的初始化,出牌,补牌,最后当双方都发出牌的时候,就可以比较大小了。在游戏中进行比较的方法是Desk类中的Compare方法: public void Compare ()if(persons0.outcard!=null&&persons1.outcard!=null)int pc_plength=persons0.outcard.pokes.length;int npc_plen

46、gth=persons1.outcard.pokes.length;int bupaicount; if(pc_plength=npc_plength) processoutcard();else if(pc_plength>npc_plength) bupaicount=pc_plength-npc_plength; persons1.bupaiAI(bupaicount); Compare (); return;else if(pc_plength<npc_plength)bupaicount=npc_plength-pc_plength;pcBupai=true;这是游戏比较

47、的关键代码,如果双方牌的数量一致,就会调用一个processoutcard()方法。进行比较大小,而如果玩家的牌数少于电脑发出的牌,则玩家补牌,如果电脑发出的牌少,则电脑应该调用bupaiAI方法。当牌数一样的时候,才能继续调用。private void processoutcard()int pcType=persons0.outcard.pokeType;int npcType=persons1.outcard.pokeType;if(pcType=PokeType.error&&npcType!=PokeType.error)blood_pc=blood_pc-perso

48、ns0.outcard.pokes.length;if(blood_pc<=0)blood_pc=0;return;else if(pcType!=PokeType.error&&npcType=PokeType.error)blood_npc=blood_npc-persons1.outcard.pokes.length;if(blood_pc<=0)blood_pc=0;else if(blood_npc<=0)blood_npc=0; return;else if(pcType!=PokeType.error&&npcType!=Poke

49、Type.error)if(pcType>npcType) blood_pc=blood_pc-1; if(blood_pc<=0)blood_pc=0;else if(blood_npc<=0)blood_npc=0;return;else if(pcType<npcType)blood_npc= blood_npc-1; if(blood_pc<=0)blood_pc=0;else if(blood_npc<=0)blood_npc=0;return;else if(pcType=npcType)int pc_points=Poke.getPokeVal

50、ue(persons0.outcard.pokes0);int npc_points=Poke.getPokeValue(persons1.outcard.pokes0);if(pc_points>npc_points)blood_npc=blood_npc-1;if(blood_pc<=0)blood_pc=0;else if(blood_npc<=0)blood_npc=0;else if(pc_points<npc_points)blood_pc=blood_pc-1;if(blood_pc<=0)blood_pc=0;else if(blood_npc&l

51、t;=0)blood_npc=0;else if(pc_points=npc_points)return;这个是游戏的processoutcard方法,该方法的作用就是判断双方发出的牌谁大谁小,比较的规则如下比较的规则如下:同点>顺子>单张。主要有6种情况:if(pcType=PokeType.error&&npcType!=PokeType.error),当玩家发出的牌不成牌组而电脑发出的牌成数组时,玩家的血量应该减去相应的数量。同理,当电脑的牌不成同点也不是顺子时,电脑减去相应数目的血量。这样每一种情况玩家和电脑都会减去相应的血量,从而实现了血量的减少,比较完血

52、量就会进入下一轮的出牌。5.3 游戏网络链接实现图9 游戏网络连接图 在计算机网络中,数据是以包的形式进行传输的。包称为数据报。每一个数据报都包含首部和有效载荷。首部包含所去往的地址和端口,包来自的地址和端口以及用于保证可靠传输的各种其他管理信息。有效载荷就是数据本身。socket主要实现的是两台主机之间的链接,它将网络连接视为另一种可以读取字节的流,但是它掩盖了网络底层的细节。 socket主要有两部分组成:socket和serversocket两种方式,这两个类一个用于客户端,一个用于服务器。服务器端的socket等待连接,客户端的socket发起连接。在游戏中,主要使用了客户端/服务器架

53、构。在游戏的客户端我们主要完成一些基本的工作,即游戏中图片的绘制是放在客户端的,而游戏的逻辑判断则在服务器端,例如,当双方都发出牌后,游戏会将双方的数据发送到服务器端,然后服务器会根据双方发出的牌来比较大小,并将比较的结果反馈给玩家。这样,当游戏再一次刷新的时候就会显示双方比较完成之后的结果,这就是游戏的网络连接部分。5.4 游戏最终实现整个游戏编写完成,进入游戏界面之后就会产生如下图10所示效果:图10 游戏效果图6 结束语毕业设计做到这里基本上已经到了尾声,这次毕业设计中,无论是知识上还是生活上都获益匪浅。首先是知识上的进步,通过这一次的毕业设计,我完成了三国志的开发,在制作这个游戏的过程

54、中,我进一步的加深了对Android手机游戏的开发的理解,将以前掌握的知识系统的整理了一遍,使我完全的掌握了安卓系统的软件结构,运行机制以及程序在系统中是如何启动,运行,停止的。在这个游戏中,我也加深了对java的理解。在没有做项目之前,对编程语言的理解还是比较浅显的,总感觉只要基本语法学好了,就可以编出好的程序,但是随着编程的进行,慢慢体会到编程思想的重要性,无论用何种语言,关键是要有编程思路,在面向对象的编程语言中,就要把一切事物都看成是对象,每一个对象之中都有属性和方法,并且不同的对象之间可以调用彼此的方法实现通信,只有这样,才能真正体会面向对象编程语言的精华,体会到面向对象对象性,封装性等基本特性。除了这些基本原理,我还懂得使用数据结构,在开始编程的时候由于基础比较薄弱,不知如何使用散列映射,链表等数据结构。在编程上浪费了大量的时间,但是随着不断的学习,

温馨提示

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

评论

0/150

提交评论