Java培训实习报告

实习报告

实习名称:

实习时间:

学生姓名:

学院名称:

专业名称:

班级名称:

学 号:

指导教师: 201508/26-201509/08 张利智 通信与电子工程学院 电子信息工程 电子122 2013131068

1

实习时间:

20xx年8月26日——20xx年9月8日

实习公司:

哈尔滨鑫联华信息技术开发有限公司 实习目的:

了解并掌握java相关理论知识,提高了学习的积极和创造性。方便以后进入公司能够很快进入工作状态。 公司介绍:

1. 甲骨文公司

通过自我学习和导师的介绍,我对甲骨文公司各方面都有了较深入的了解。甲骨文公司,作为世界五百强企业之一,作为IT公司中名列前茅的跨国公司,拥有从软件到硬件的一整套完整的产品线,为全球客户提供全面、完整的解决方案。 - 上一个财年营收达到319亿美元,拥有50个行业最佳的产品 - 客户遍及全球145个国家,目前已为超过37万位客户提供服务 - 全球合作伙伴超过2万个

- 目前全球员工总数超过10万名

- 而Oracle在线社区的开发者数也已经突破了1000万

长久以来甲骨文公司一直致力于技术创新,数据库的新版本推出的速度,作为行业的领导者和风向标。

- 目前已有将近3万名专业开发者和工程师

- 超过1万5千名客户服务专家,可以支持27种语言的客户服务 2

- 拥有超过2万名的实施顾问

- 每年支撑全球150万的学员的培训和学习

- 目前有870个独立的Oracle用户群组,超过35万名成员

2.甲骨文公司完整的产品体系和IT发展思路

甲骨文公司通过近10年的收购整合,从一个数据库软件公司发展成了世界上产品线最为齐全的公司,涵盖管理软件、中间件、数据库、操作系统与虚拟机、服务器与存储,每一个领域都有世界上数一数二的产品。过去的5-6年的时间,完成了超过70宗的收购。 甲骨文公司收购的公司都是业界在某个领域的领先公司,包括20xx年的Bea ,20xx年的Sun。甲骨文公司是一个执行力非常强的公司,收购的公司能迅速整合到已有的产品集中去。

甲骨文公司的IT发展思路是:如何通过简化IT来实现创新?对于这个问题,它自身已经做了最好的回答。

甲骨文通过自身的创新,将这些软硬件整合成了一个个行业解决方案和创新产品,这其中最为引人注目就是一系列一体机:数据库一体机、中间件一体机、大数据一体机。由于全部是采用自己的产品,能够使各种软硬件的效率发挥到极致,从而大大提高了产品性价比,简化了大中型项目的软硬件部署过程,减少了时间和成本。甲骨文公司致力于通过简化IT来实现创新。它不断地运用优秀企业治理原则,并将各种创新产品应用到自身中,使之自身成为通过简化IT来实现和实践创新的优秀企业例证。

3.云计算

甲骨文公司对着云有着深刻的理解,并成功的将云和自身的产品结合,形成了一系列云计算产品和解决方案,包括私有云、公有云和混合云。

在学习过程中,我们体验了甲骨文公司已经发布的JAVA、数据库公有云服务,并在导师的指导下亲手使用甲骨文的OVM搭建了小型的私有云。

3

实习内容:

第一实习阶段:

这次到ORACLE的实习,每个人都抱着一种认真学习的态度,去接受未来的挑战。 在现今社会,就业问题就似乎总是围绕在我们的身边,成了说不完的话题。招聘会上的大字报都总写着“有经验者优先”,可还在校园里面的我们这班学子社会经验又会拥有多少呢?为了拓展自身的知识面,扩大与社会的接触面,增加个人在社会竞争中的经验,锻炼和提高自己的能力,以便在以后毕业后能真正走入社会,能够适应国内外的经济形势的变化,并且能够在生活和工作中很好地处理各方面的问题,我来到了ORACLE,开始了我这个学期的专业实习。专业实习,就是把我们在学校所学的理论知识,运用到客观实际中去,使自己所学的理论知识有用武之地。只学不实践,那么所学的就等于零。理论应该与实践相结合。另一方面,实践可为以后找工作打基础。通过这段时间的专业实习,学到一些在学校里学不到的东西。因为环境的不同,接触的人与事不同,从中所学的东西自然就不一样了。

第一周的学习比较轻松,进一步了解Java开发的相关知识,掌握Java开发的基本技术,丰富Java开发的实战经验。学习SQL的基础知识及正确的运用方法,ssh等企业应用框架和有用的相关技术,提高自己的工作效率。通过实习,培养我们综合运用已学知识Java语言的面向对象编程能力;培养我们动手能力;培养我们良好编程规范、编程方法;以便能较全面地理解、掌握和综合运用所学的知识,提高自身的编程能力;增强自己的团队协作意识,了解软件开发的思考角度和主要流程。为毕业之后能够更快地进入工作状态并且能够更好的工作,打好一定的基础。

第二阶段实习:

第二阶段的内容越来越紧凑。在培训的学习期间,不是像正式上班的朝九晚五,而是朝八晚九。 我们不可能简单的了解一些企业文化,简单的学学新的知识就可以了,我们的这个实习必将是一个繁忙的实习,也必将是一个充实的,进步的实习。来到这里,我们要忘掉大学里自由的作息时间,克服困难,养成良好的工作生活习惯 。基于各方面的原因,虽然在去之前我们做了比较充足的准备,但还是遇到了一些困难, 4

例如学习时间长,课后实战比较繁多,但时间又比较的短,难以保证按时按质按量完成。下午下了班,正式的员工们都回去了,我们还在那儿练习,一直到晚上7点,才能回住处休息。中午也没有休息的地方,只能趴在电脑前休息一会,周末也只有一天,一两周下来,相当地疲惫。但我们都明白自己来实习的任务,都坚持着完成自己的任务和使命并学习java的基础知识。

Java的基础知识对于一个java软件工程师来说就好比是人的灵魂,现在的公司 在招聘的时候不在乎你会不会流行的技术,如(Struts、Hibernate、Spring、ibatis等)他看重的是你的基础扎不扎实,对于网易、腾讯等大公司来说更是如此,我们在开发过程中运用了大量的java基础知识,如类、对象、方法、成员变量、静态变量、封装、继承、多态、异常、接口、抽象类、IO流?等等等等,所以一个系统对于java编程基础的依赖便不言而喻。 Java中的常用设计模式

1.工厂模式

客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。

2.单例模式

单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

5

第三阶段实习: 第三阶段主要学习了MySQL、Oracle数据库的介绍

MySQL是最流行的开放源码SQL数据库管理系统,它是由MySQL AB公司开发、发布并支持的。MySQL AB是由多名MySQL开发人创办的一家商业公司。它是一家第二代开放源码公司,结合了开放源码价值取向、方法和成功的商业模型。Oracle则是以稳定性著称,在访问量和数据大量交换的服务器中,Oracle占了大臂的江山,在开发中主要用到了数据库的查询语句、数据库的关系、事物等

在职业素质培养和职业规划模块,我学到了不少东西,自己也课后进行了自学扩展。在个人形象方面,得体的着装是一个职业人基本的素养,也是我们职员专业素质的体现。它包括干净、整洁、成熟、干练的衣着,精神、简洁的职业妆、随时的肢体语言。在待人接物方面,要得体、客观。对上司和公司的安排我们要从公司考虑、并适当服从和保留自己的意见。

通过职业规划的测试,我了解了自己适合做什么。解除了一些困惑。结果是让人兴奋的,我选择了软件这个技术性行业是很适合我的。许多大学生在上大学之前并不了解自己,如果职业规划能提前到大学之前,相信会减少许多大学生的学校学习期间的许多困惑,也更有利于国家对人才的培养。

而进项目组的模拟面试环节,则训练了我们的表达能力,首先是自我介绍,然后让是技术面试。面试,第一个要点是表达,适当地展示自己,清楚地表达是面试中必备的法宝。我们做程序的,可能知道怎么用,但若要向别人清楚的解释一个问题或者原理,没有一定的经验是说不好的。所以平时多讨论问题,和周围的人交流,多留心钻研都是在为面试和以后更好地使用和交流技术打下基础,开口表达就是成功的开始。

软件开发是项团队工作,我们培养好自己职业素养,多多交流必定带来意想不到的收获。实习正是给了我们一个很好的机会去锻炼,相信会为以后找到一个好的工作埋下伏笔。

6

第四阶段实习:

这个阶段我们主要重新学习了三大框架并小组开发了飞机大战项目。

通过这次实习,让我们理论联系实际,在软件工程的开发过程、数据库的开发、分布式计算等工程实践经验上有了很大的提高。在公司中也培养了初步的大型项目合作开发经验,这一些都很好的增强了我们的个人的能力和并提高了自身的素质。

类似的以上的收获还有很多很多,但在实习结束的这个时候,仔细考虑一下,还是有一些地经验教训的。

例如在活动中我们能感觉得到,很多的工作经验,开发的知识我们了解的还是不够充分,致使我们在开发初期要发费较多的时间用于入门。但有一点感觉就是,我们在学校所学的一些基本知识还是比较有用的,例如J2EE,数据库基本原理等,正是这些基础知识使我们在缺少工程经验的情况下还能尽快入手,后来赶上。

针对我们学校部分学生普遍基础理论知识较多,工程经验不足的现象,我们同学大可以去掉以往羞于参与工程,怕在别人前认短的心态,我们学校的软件工程专业教学是挺不错的,知识面恰到好处,我们一般在工程面前还是能很快入手的,而为了更好的进行开发,我们也应该在校期间就多进行一些工程方面的锻炼,培养实际动手能力。

我想像这样让同学接触社会,培养实际动手能力的活动真的很不错,也是同学们所欢迎的,当然把这样的活动办好需要学校的老师和同学们共同努力。也希望,这样的活动能不断地继续下去,并发展壮大。

虽然是短暂的实习,但我想这一份经历必将会为我们将来进入社会打下一个良好的基础,不管是在以后的就业指导上、还是在工作生活为人上,我们都拥有了一笔宝贵的财富。

7

实习总结(体会和收获)

第一次参加专业实习,让我明白了大学生生产实习是引导我们学生走出校门,走向社会,接触社会,了解社会,投身社会的良好形式;是培养锻炼才干的好渠道;是提升思想,树立服务社会的思想的有效途径。通过参加专业实习活动,有助于我们在校中学生更新观念,吸收新的思想与知识。近半个月的实习,虽然时间很短,却让我从中领悟到了很多的东西,而这些东西将让我终生受用。专业实习加深了我与社会各阶层人的感情,拉近了我与社会的距离,也让自己在实践中开拓了视野,增长了才干,进一步明确了我们青年学生的成材之路与肩负的历史使命。社会才是学习和受教育的大课堂,在那片广阔的天地里,我们的人生价值得到了体现,为将来更加激烈的竞争打下了更为坚实的基础。我在实践中得到许多的感悟!

实习期间,第一,我学会了如何规范的编写代码和文档。文档和代码是团队各成员在项目开发交流合作中的纽带,风格随意混乱的代码和缺失或语义不明的文档会让团队中的其他成员不能理解和使用自己写的程序,我在平时编写代码比较随意,并不注重这一点,经历这次实战演练之后,我一定会严格的遵守编码规范。 第二,我学会了如何理解和分析客户的需求。软件为客户而生,只有理解了客户的需求才有写出优秀的软件的可能,在这次实战演练中,老师教会了我们如何组织团队正确的理解和分析客户的需求,并写出完善的需求分析,并用于项目开发。 第三,我学会了对按照需求对软件架构进行设计,这点我想是我们许多同学之前都非常欠缺的,因为我们在学校的时编写代码篇幅短小,功能单一,所以设计思路通常只留于脑内,非常模糊。而在这次项目开发演练中,老师手把手的教会我如何从需求中抽象出问题,并将之模块化,然后逐步求精,就如同为高楼大厦搭建栋梁。 第四,我学会了如何团队合作,共同开发。作为项目开发小组的组长,我的体会更加深刻。独木难支,光靠一个人的力量是远远不够的。只有管理组织好一个团队,才能够最终完成项目的开发,或许在编程技术水平上团队成员有高有低,但是,每个人都有自己的闪光点,总可以在团队的找到适合自己的位置,每个人在自己的团队中每个人在自己的团队中做的贡献,创造出不可磨灭的重大价值。

8

第五,我学会了如何与客户沟通并展示自己的项目,软件项目的开发最终需要的是客户的认可,让客户了解并认可自己的产品最好的办法就是用言语将自己的项目的最好的一面展示出来,在最后一天里,实训的老师组织了项目的答辩,给我们提供了给我们提供了锻炼自己的表达能力,展示自己的项目的舞台。

在实战的过程中,我对项目开发流程有了切实的体会:学会了如何编写规范合格的代码和文档;学会了了正确理解分析客户需求并设计项目的方法;体会到了团队合作精神的重要性,明白了组织团队进行项目开发的具体流程,还了解到了向客户展示产品以及与客户进行沟通的技巧。

通过在达内的实习,让我的专业知识有了进一步的提高,缩短了我与社会接轨距离。让我懂得在工作上还要有自信。自信不是盲目地自夸,而是对自己的能力做出肯定。社会经验缺乏,学历不足等种种原因会使自己缺乏自信。其实有谁一生下来句什么都会的,只要有自信,就能克服心理障碍,那一切就变得容易解决了。同时知识的积累也是非常重要的。知识犹如人的血液。人缺少了血液,身体就会衰弱,人缺少了知识,头脑就要枯竭。这次接触的酿造业,对我来说很陌生,要想把工作做好,就必须了解这方面的知识,对其各方面都有深入的了解,才能更好地应用于工作中。我认识到了一个软件开发的完整的过程,为我今后进行实际的工作奠定了坚实的基础。首先,进入公司,你就是一名职业人,不再是一名学生,你要具备一名职业人应具备的素养,不迟到不早退是必然的,而且还要时刻严格要求自己,公司的规定要严格遵守。然后,在技术上也有了很大的提高,学习了很多公司自己的框架和工具,这都是一些前辈的宝贵经验。而且所作的软件应用性更强。所以,在今后的学习中我会严于律己,认真学习有关软件编程的课,为以后的工作打好坚实的基础。

所以在最后我想我们应当感谢为我们辛勤付出的学校领导和老师,ORACLE敬业的员工们!

9

 

第二篇:JAVA实习报告

实习性质:       JAVA程序设计           

学生姓名:         胡桂豪          

专业班级:        计应103             

指导教师:     万青、陈戈、谢先伟           

实习时间:     20##-12-3120##-1-6         

实习地点:         4312           

重庆工程职业技术学院


目录

1 实习目的... 4

2 实习内容... 4

2.1 设计文档... 4

2.2需求分析... 6

2.3设计方法... 6

2.3.1 ChessFrame主要功能... 6

2.3.2 游戏主窗体... 7

2.3.3 主菜单... 8

2.3.4 创建待机室... 9

2.3.5 服务器端... 10

2.3.6 客户端... 12

3 实习心得... 14


1 实习目的

根据教学计划的安排,本课程在后半学期将进行一周的课程实习安排,完成《JAVA小游戏:五子棋》的开发。通过实习,可以使学生进一步掌握Java面向对象设计方法、JDK常用类、Java窗口界面设计、数据库访问等方面的知识和技能,将前面学习的基础知识应用到实际的软件开发中去,积累应用程序分析、设计、编码、调试的经验。

Java的广泛流行是与它所编写的程序可以在网络上运行且可以跨平台。事实上,支持Java的浏览器内置Java虚拟机,使得Java的小程序能够在网络上完全地传送和运行。这样使得程序人员即使不具备有关的网络知识,也能编写出高质量的网络通信程序。“网上五子棋游戏”便是其最好的例子。

本程序是一个基于网络协议为TCP/IP的网上对弈游戏,采用服务器-客户端的网络架构模式,允许网络上的多台机器(可能是两台机器)同时运行,一台用作服务器,始终处理网络上要求它进行服务的请求。如果有机器请求与它进行连接,用作服务器的机器接受之后就可以进行相互之间的通信。

通过本程序,我们初步熟悉并掌握java语言的基本知识,掌握服务器-客户端的网络架构模式,为以后学习高级web开发课程做准备。

2 实习内容

2.1 设计文档

(1)界面棋盘设计

在对棋盘界面设计方面要考虑简洁友好,符合游戏者需求。棋子的设计方面系统中设置了两种棋子颜色,white或者black, 游戏者可自行选择。棋子怎样画出来,怎样使棋子按我们所想的方式来绘制出来是设计的主要难题。运行时要求当每次点击鼠标的时候就在点击鼠标的地方画一个棋子,所以得定义一个棋子的类使点击鼠标时系统把棋子绘制出来。这样主界面里的棋子就确定了,而且也确定了几个所需要的类。可以先定义好这些类了。

有了以上的准备就可以把棋盘绘制出来了,下棋时每次在适当位置点击鼠标的时候就在所点击的位置上画出你这个角色的颜色,然后计算机会自动的下棋,计算机自动下棋要有一个控制变量来控制能不能下棋。人可以随意的下子,可是计算机就要计算在哪个位置下子了。这里由计算机下子的算法来确定,人人对战的话就不象单机游戏一样,要计算机来判断人下子之后计算机下那一个地方了,人人对战只要在双方下子的时候判断赢棋情况,当然还要同步的控制两个人下棋的顺序,这样的话就要用到线程了,各自都继承或实现线程类或接口,以便各自能随时单独控制接发消息。

(2)算法设计

对于五子棋游戏,无论人机对战,还是双人对战,都需要判断棋盘上是否存在五子连珠情况,这既是游戏名字的由来,也是游戏结束的标志。判断五子连珠的原理是从横,竖,左斜线,右斜线4条线上判断是否存在5个相连的同类棋子。

  对战一方落子后,在该处向8个方向检测连续的同类棋子,如果检测到直线方向上存在5个连续的同类棋子(包含本位置棋子),则判断为“连五”并结束检测循环。基于检测结果,可以判断游戏是否结束,并根据获胜方的落子代码判断获胜方是谁。

  由于不考虑禁手问题,在实现“连五”过程中,我们可以考虑完成“双四”,“四三”,“双三”,“冲四”,“活三”,“活四”来实现目的。

  活四:有两个点能形成“连五”的四就是活四;

   冲四:只有一个点能形成“连五”的四叫做“冲四”,或者叫做“单四”;

   活三:己方在落一子就能形成“活四”的三叫做“活三”。“活三”分为“连活三”和“跳活三”。连活三:在棋盘某一条阳线或阴线上有同色三子相连,且在此三子两端延长线上有一端至少有一个,另一端至少有两个无子的交叉点与此三子紧密相连。跳活三:中间仅间隔一个无子交叉点的连三,但两端延长线均至少有一个无子的交叉点与此三子相连。

   双三:由于黑方走一着在无子交叉点上同时形成二个或二个以上黑方 " 活 " 的局面。

     双四:由于黑方走一着在无子交叉点上同时形成二个或二个以上黑方 " 四 " 的局面。

   四三:指某一方同时具备两个先手,其中一个是 " 四 " ,一个是 " 活三 " 。

  在实现上面这些高级算法的时候,我们需要一个基础,就是对制定位置周围情况进行检测。在棋盘上面,棋子存在8个移动方向,检测时需要对每个方向进行检测。为了简单直观,这里将每步棋子的移动生成一个新的棋子。

2.2需求分析

   一款小游戏的确立是建立在各种各样的需求上面的,这种需求往往来自于玩家的实际需求,其中玩家的实际需求最为重要.面对游戏拥有不同知识和理解层面的玩家,游戏制作人对玩家需求的理解程度,在很大程度上决定了此类游戏开发的成败.因此如何更好地的了解,分析,明确玩家需求,并且能够准确,清晰以文档的形式表达给游戏制作人,保证开发过程按照满足玩家需求为目的正确开发方向进行,是每游戏游戏制作人需要面对的问题。

作为五子棋的设计需要考虑到的最基本的需求莫过于人机对战与人人对战功能的实现,当然还有下棋过程中的下棋悔棋功能以及判断游戏的胜负等方面的要求。当然最好是要考虑到界面的友好性,作为一个娱乐软件,还应该考虑到玩家在游戏时的舒适性。

我们通过使用套接字SOCKET来实现游戏之间的通讯,它是基于点对点的通讯,开始让服务器初始化建立服务器套接字SOCKET,基于某个端口PORT,然后打开客户端套接字SOCKET,连接到服务器端的地址ADDRESS和端口PORT,在这之间可能发生异常EXCEPTION。 

“网络五子棋”是由服务器端和客户端组成的。游戏分为黑方与白方,只要其中一方的棋子形成“五子连珠”之势,即可获胜。

网络五子棋游戏服务器端主要有三个类:OmokServer类、Omok_ Thread类(线程类)和BManager类(消息广播者)。它的主要功能是连接客户端,使多个客户端连接在一起,最终实现联网。

2.3设计方法

2.3.1 ChessFrame主要功能

类ChessFrame主要功能是创建五子棋游戏主窗体和菜单,主要代码如下:

class ChessFrame extends JFrame implements ActionListener {

private String[] strsize={"20x15","30x20","40x30"};

private String[] strmode={"人机对弈","人人对弈"};

public static boolean iscomputer=true,checkcomputer=true;

private int width,height;

private ChessModel cm;

private MainPanel mp;

2.3.2 游戏主窗体

构造五子棋游戏的主窗体,主要代码如下:

public ChessFrame() {

   this.setTitle("五子棋游戏");

   cm=new ChessModel(1);

   mp=new MainPanel(cm);

   Container con=this.getContentPane();

   con.add(mp,"Center");

   this.setResizable(false);

   this.addWindowListener(new ChessWindowEvent());

   MapSize(20,15);

   JMenuBar mbar = new JMenuBar();

   this.setJMenuBar(mbar);

   JMenu gameMenu = new JMenu("游戏");

   mbar.add(makeMenu(gameMenu, new Object[] {

    "开局", "棋盘","模式", null, "退出"

    }, this));

   JMenu lookMenu =new JMenu("视图");

   mbar.add(makeMenu(lookMenu,new Object[] {

    "Metal","Motif","Windows"

    },this));

   JMenu helpMenu = new JMenu("帮助");

   mbar.add(makeMenu(helpMenu, new Object[] {

    "关于"

   }, this));

}

2.3.3 主菜单

构造五子棋游戏的主菜单,代码如下:

public JMenu makeMenu(Object parent, Object items[], Object target){

   JMenu m = null;

   if(parent instanceof JMenu)

    m = (JMenu)parent;

   else if(parent instanceof String)

    m = new JMenu((String)parent);

   else

    return null;

   for(int i = 0; i < items.length; i++)

    if(items[i] == null)

     m.addSeparator();

    else if(items[i] == "棋盘"){

     JMenu jm = new JMenu("棋盘");

     ButtonGroup group=new ButtonGroup();

     JRadioButtonMenuItem rmenu;

     for (int j=0;j<strsize.length;j++){

      rmenu=makeRadioButtonMenuItem(strsize[j],target);

      if (j==0)

       rmenu.setSelected(true);

      jm.add(rmenu);

      group.add(rmenu);

     }

     m.add(jm);

    }else if(items[i] == "模式"){

     JMenu jm = new JMenu("模式");

     ButtonGroup group=new ButtonGroup();

     JRadioButtonMenuItem rmenu;

     for (int h=0;h<strmode.length;h++){

      rmenu=makeRadioButtonMenuItem(strmode[h],target);

      if(h==0)

       rmenu.setSelected(true);

      jm.add(rmenu);

      group.add(rmenu);

     }

     m.add(jm);

    }else

     m.add(makeMenuItem(items[i], target));

   return m;

}

2.3.4 创建待机室

该游戏创建了待机室,供其他未处于下棋状态的人们使用,也可以创建另一个房间,供下棋的两个人使用。

我们可以通过标记号码来区分待机室与下棋室。即用0标记待机室,其他房间使用0以上的自然数来标记。事实上,我们并不时真正创建了房间,而只是将房间号码赋予了客户机而已。以此,我们可以实现拥有相同号码的客户机彼此间可以相互通信。

    例如,客户机向服务器提出进入某个房间的请求后,服务器必须确认所请求的房间是否允许它进入,然后,发送相应的请求给客户机。对于消息,我们可以采用“[消息类型]+内容”的形式。假若客户机想进入20号房间,那么,它需要向服务器发送消息“[ROOM]20”.如果第20号房间允许进入,那么,服务器在进行了某些处理后会向客户机传送消息“[ROOM]20”。相反,若20号房间禁止入内,则服务器将向客户机发送“[NULL]”消息。

客户机请求:[ROOM]20

服务器的应答:[ROOM]20,或[NULL]

    又例如,假设两个玩家同时进入某个房间,要进行对弈。首先,一名玩家点击开始按钮,向服务器发送“[STAERT]”消息,另一名玩家也向服务器发送了“[STAERT]”消息,然后服务器将会认为这两名玩家要进行对弈,它会随时向玩家指派棋子,并分别向玩家发送“[COLOR]BLACK”与“[CLOR]WHITE”消息。

客户机1的请求:“[STAERT]”

客户机2的请求:“[STAERT]”

服务器的应答:[COLOR]BLACK”与“[CLOR]WHITE

2.3.5 服务器端

    网络五子棋游戏服务器端主要有三个类:OmokServer类、Omok_ Thread类(线程类)和BManager类(消息广播者)。

  OmokServer类在受到客户机的连接请求后,将创建新的套接字,并使其与客户机连接,然后启动线程,并将线程添加至BManager对象中。

Private BManager bMan=new BManager();           //消息广播者对象

...........

While(true){

Socket socket=server.accept();                     //获取套接字

Omok_Thread ot=new Omok_Thread(socket);        //创建线程

ot.start();                                      //启动线程

bMan.add(ot);                                  //添加线程

...........

}

    Omok_Thread对象不仅可以获取套接字、输入输出流,而且它还提供了有关客户机的消息。例如客户机的姓名、房间号、游戏开始与否等。这是因为我们需要确定消息的来源及主要在某个房间传播的消息。并且,消息广播者也需要参照线程对象的房间号,以便将消息发送至某个房间中。

    BManager类继承了Vector类,它的元素为Omok_ Thread线程对象,这样才能自由地参照Omok_ Threadd对象的房间号及玩家的名字等。为了实现向指定的房间发送消息,需要比较Bmanager各元素的房间号和给定的房间号,若两者相同,则向此房间发送消息。

  SendToRoom()方法用于向指定的房间(roomnum)发送消息(msg),代码如下。

void sendToRoom(int roomNum,String msg){

for(int i=0;i<size();i++){

if(roomNum==第i个线程的房间号)     //向第i个线程连接的客户机发送消息

   }

  }

 }

SendToOthers()方法用于向同房间的其他用户发送消息(msg)这个方法与SendToRoom()一样,将使用for循环检查元素(线程)的房间号。但是,并不会与ot连接的客户机发送消息。

void sendToOthers(Omok_Thread ot,String msg){

for(int i=0;i<size();i++){

if(第i个线程的房间号==ot的房间号&&第i个线程!=ot){

   }

  }

 }

sendToRoom()与sendToOthers()方法的不足之处在于,房间越多,它们就会增重服务器的负担,消息的传播将变得十分缓慢。

2.3.6 客户端

网络五子棋游戏客户端主要是实现五子棋的界面和功能的程序,我们可以通过服务器端连接多个客户端实现最终游戏的目的。

    首先要实现五子棋盘(OmokBoard类)。五子棋盘继承了画布类,它内嵌于框架窗口中,拥有15*15(255)个方格。为了响应用户的下棋动作,五子棋盘必须能够响应鼠标事件。并且它必须拥有输出流,用以向对手传递棋手的下棋信息。程序中也有多种方法用来实现绘图操作。然而,程序中最重要的部分时如何决定胜负。横,竖或者对角线方向上拥有五颗同样的棋子时,即为胜利。

   请看图表3。假设五个黑子从左向右分别标记为1、2、3、4、5,那么我们可以先放置1、2、3、4棋子,如果黑方最后一颗棋子5号棋放在如图所示的位置,则黑方在横向上五子连珠,黑方胜。这个过程如何用程序实现呢?在放5号棋子后,首先程序要计算出他左边连在一起的黑色棋子的个数。其左边已放有2号与1号棋子,且这两颗棋子连在一起,所以5号棋子左边相连的黑色棋子有两颗。然后,再计算5号棋子右边连在一起的黑色棋子的个数。如图,5号棋子右边有3号。4号两颗棋子。因此,5号棋子左边、右边及5号棋子合起来共5颗黑色棋子,黑方获胜。当然在竖直方向与对角线方向上也采取相同的方法进行检查。

图表 3  

Map是一个二元数组,用于保存棋子的位置。如果在(2,3)位置上有一颗黑色棋子,则向数组元素map[2][3]赋入常数BLACK(=1);则将WHITE(=-1)值代入。并且,如果某个五子棋盘左上端坐标就变为(1,1),而非(0,0)。

为了计算方便,我这里将map的大小定义为17*17,而并非是先前的15*15。因此,五子棋盘左上就坐标就变为(1,1),而非(0,0)

count()方法用来查找并计算连在一起的棋子的个数。P为基准坐标,dx、dy分别为表示横向于竖向的变量。col代表棋子颜色。弱dx为-1,dy为0,则计算左边连续棋子的个数;若dx为1,dy为1,则计算左下到右上连续棋子的个数。dx与dy只取-1、0、1三个值之一。下面是count()方法的代码。

Private int count(Point p,int dx,int dy,int col)

{

 int i=0;

 for(;map[p.x+(i+1)*dx][p.y+(i+1)*dy]==col;i++)

{}

 return i;

 }

check()方法会调用count()方法,用来判断是否五子连珠。其代码如下。

Private Boolean check(point p,int cool)

{

 if(count(p,1,0,col)+count(p,-1,0,col)==4)      // 横向检查

 return true;

 if(count(p,0,1col)+count(p,0,-1,col)==4)      // 竖向检查

 return true;

 if(count(p,-1,-1,col)+count(p,1,1col)==4)      // 对角线方向检查

 return true;

 if(count(p,1,-1,col)+count(p,-1,1,col)==4)     // 对角线方向检查

 return true; }

若用户将color颜色的棋子放在(x,y)位置上,程序将会进行如下检查。如果获胜,则向服务器发送“[WIN]”消息。同时,服务器也会向其对手发送“[LOSE]”消息。

Map[x][y]=color;

If(check(new Point(x,y),color))

{writer.println(“[WIN]”);

 }

3 实习心得

通过这次课程设计,我进一步加深对基础理论的理解,扩大专业知识面,对收集资料、查阅文献、方案制定等实践方面得到了很好的锻练,促进对所学知识应用能力的提高。同时我渐渐的复习了Java使用方法和编程语法,之后的编程过程也相对得心应手,基本完成了预期计划的要求。

相关推荐