五子棋网络对战游戏的设计与实现
论文作者姓名: | |
---|---|
申请学位专业: | |
申请学位类别: | |
指导教师姓名(职称): | |
论文提交日期: |
五子棋网络对战游戏的设计与实现
摘 要
在现代社会中,及其它无线设备越来越多的走进普通老百姓的工作和生活。随着3G技术的普及与应用,基于Java开发的软件在上的使用非常的广泛,增值服务的内容也是越来越多,对丰富人们的生活内容、提供快捷的资讯起着不可忽视的作用。
本文基于J2ME技术,以计算机网络游戏的运行流程为基础,分模块开发一款网络五子棋游戏软件。
本文对以下几点内容做了重点研究和探讨:
- 系统整体结构,根据设计目标,结合普通网络游戏的运行流程,给出了系统总体设计方案,并探讨了系统设计时需要用到的关键技术。
- MIDP客户端的实现,MIDP客户端是游戏的唯一客户端,主要功能包括连接服务器进行身份验证、进行游戏并不断的与服务器交换数据。
- 后台系统的设计与实现,后台用来处理与数据库的互联来验证用户身份、处理由客户端发送过来的数据。
由于受到客观条件的限制,本系统的测试是在三星模拟器上完成的,但它仍不失具一定的实用价值。
关键词:J2ME;游戏;Servlet
The Design and Implementation of The Gobang War Game on Cell Phone Network
Abstract
In modern society, more and more cell phones and other wireless devices come into the work and life of ordinary people. With the popularization and application of the 3rd Generation of Digital communication technology,the development of Java-based software in the use of mobile phones is very broad, mobile value-added services are more and more. It plays an import role to enrich people's lives and provide easier access to information.
This paper is based on J2ME technology, it expounds how to take the running flow of computer network as basis, introduce a kind of gobang game on network by the sub-module method. .
The main points of this paper go as follows:
-
- The overall system structure. According to the design goals, with the general operation of the network game flow, gives the system design, and explores the key technology, which is used by the design of this system.
- The implementation of the phone MIDP client. MIDP client is the only game client, the main functions include connecting the server to check the status, playing games and keeping the exchange of data with the server.
- The implementation and design of background system. Background is to deal with the Internet database to verify the identity of users, processing the data, which is sent by the clients.
Due to the restrictions of objective conditions, the system's test completed in the Samsung handset simulator. But it does have some advantages.
Key words: J2ME; Handset game; Servlet
目 录
论文总页数 :24页
1引言11
2系统综述11
3游戏的现状和关键技术介绍22
3.1软件现状22
3.2 J2ME概况22
3.2.1 J2ME的由来22
3.2.2 J2ME的3层体系结构及MIDP简介33
3.3 tomcat服务器介绍44
3.4 servlet技术介绍55
4 开发环境介绍77
4.1开发环境77
4.2 关于SAMSUNG Wireless Tool Kit7SAMSUNG Wireless Tool Kit7SAMSUNG Wireless Tool Kit7
5 客户端模块的开发77
5.1 综述77
5.2 程序的类结构77
5.3 游戏的功能流程图88
5.4 游戏的实现99
5.4.1 主类Omok的实现99
5.4.2 游戏登录界面以及操作说明界面的实现1010
5.4.3游戏画布类的实现1212
5.4.4网络连接类的实现1414
5.4.5五子棋获胜算法1515
6服务器端程序的开发1717
6.1数据库的设计与实现1717
6.2 servlet程序的编写1717
7改进建议和措施2020
7.1关于图片问题2020
7.2软件测试2020
7.2.1测试前的准备工作2020
7.2.2进行测试2121
7.2.3有待添加和完善的功能2222
结 论2222
参考文献2222
致 谢2323
声 明2424
1引言
Java语言是美国Sun Microsystem的James Gosling、Pratrick Naughton及Mike Sheridan等人于1991年精心设计出来的计算机编程语言,其构想在于实现使用同一种编程语言所写出来的程序可以在不同的平台上运作。这种架构对于消费性电子产品而言是具有革命性的,因为在消费性电子产品中的处理器及操作系统各不相同,要在这些平台上开发程序必须要了解各个平台的特性,以及其提供的API使用方式,分别开发不同的版本才能执行,影响应用程序的普及性。
近几年,由于微处理器性能的大幅提升,加上无线通讯技术的突破,手持式移动设备开始受到大众的青睐。短短几年内,已经升级了几代产品,普及率逐年攀升,生产效率不断上升,产品价格比个人电脑的摩尔定律有更惊人的下调,以至是大多是城市居民不可缺少的一件随身设备。继短信、彩信等服务之后,中国移动提供基于Java的百宝箱业务,应用产品遍及商务应用、信息获取、英汉互译、游戏娱乐等多媒体领域。
为了适应移动数据的发展,推动无线电子商务等业务的发展,J2ME(Java 2 Micro Edition)既用于嵌入式系统的Java被引入无线领域。J2ME的出现实际上是Java技术的回归。作为Java2平台的一部分,J2ME与J2SE、J2EE一起,为无线应用的客户端和服务器端建立了完整的开发、部署环境。随着J2ME的应用,它为移动互联引入了一种新的模型,既允许可以从互联网上下载各种应用程序,并在创造可执行环境离线运行这些程序。由于定义了可执行下载的标准,并在上创立了可执行环境和程序开发语言,由此,在移动通信业第一次为软件开发商创造了巨大的商业机会,用户在得到丰富应用体验的同时,也大大提高了运营商的网络流量。
2系统综述
本系统采用C/S结构,包括客户端和服务器后台两个部分。
客户端采用j2me midp1.0函数编写,保证了非常好的可移植性。服务器端采用了tomcat作为http服务器,免费并且具有非常强大的功能,中间件采用java servlet进行中间过程的处理,具有很好的稳定性和可移植性,采用的数据库则是sql server 2000。
用户需要运行本系统客户端软件,输入用户名和密码进行身份验证,如果验证成功,则可以进入游戏界面,和其他已经登录的玩家进行游戏;如果验证不成功,说明输入的用户名或者密码错误,需要重新进行输入,否则不会进入到游戏界面。
系统分为三层,包括数据库服务器层、功能层和表示层。数据库服务器层主体是SQL2000,功能层由Tomcat+ servlet技术实现,表示层为前台操作客户端.总体结构如下图所视:
图1 总体结构图
3游戏的现状和关键技术介绍
3.1软件现状
在信息社会中,及其他无线设备越来越多的走进普通百姓的工作和生活,随着信息网络化的不断进展,及其他无线设备上网络势在必行。但是传统存在以下弊端:
- 传统出厂时均由硬件厂商固化程序,程序不能增加、删除,有了错误也不能更新、修改,若要增加新功能必须另换一部。
- 传统访问互联网是通过WAP(Wireless Application Protocal),所有网络资源必须接通网络才能在线访问,非常耗时、费用亦很高。
而Java技术在无线应用方面的优势非常明显:
- 应用程序可按需下载,而不是购买由硬件商提供的套件,可升级空大。
- Java技术提供了一个类库,它使的应用开发商可以创建更为直觉、丰富的用户界面(GUI);
3.Java技术使网络带宽的应用更为有效,因为应用程序可以下载到器件上,并在本地运行,仅仅是在连接到服务器时才会占用网络带宽。
3.2 J2ME概况
3.2.1 J2ME的由来
Java的最大目标和特点,就是"一次编写,到处运行"的平台无关性。但是,一套标准无法适应各种不同的需求。因此,Java技术目前共有三套,分别针对不同的平台和应用。
Standard Edition(J2SE,标准版):针对桌面端PC和工作站的个人和低端商务应用。
Enterprise Edition(J2EE,企业版):针对服务器端企业级应用,支持Servlets, JSP和XML等等。
Micro Edition(J2ME,袖珍版):针对有限内存,显示和处理能力的设备,主要是消费电子和嵌入式设备领域(这实际正是Java语言设计最初的目标领域)。
图2 java总体架构图
在消费电子和嵌入式设备领域,内存从几百K到几十M,从没有屏幕到Web-TV,CPU从低功耗的嵌入式处理器到206MHz的RISC处理器,硬件条件的差异是相当大的。这就使得J2ME的标准需要有不同的层次和类别来适应这个复杂的领域,因此相比之下J2ME就比J2SE和J2EE的标准要复杂得多。因此,清楚的理解J2ME的体系结构的划分才能更好的理解和掌握J2ME。
3.2.2 J2ME的3层体系结构及MIDP简介
J2ME的3层体系结构依照各种设备的资源特性,将J2ME技术构架分为简表(Profile)、配置(Configuration)和Java Virtual Machine(JVM)3层,然后再进一步细分,这使J2ME能够在每一类设备的限制下工作,而同时提供最低限度的Java语言功能性。
关于J2ME的体系结构,可以这样来进行总结:Configuration的分类是根据计算能力的不同来划分的,同类设备的计算能力相近。Configuration是一个规范,定义了这类设备的共同Java平台,定义与设备无关的Java虚拟机和核心库,是平台相容性的基础。Profile的分类是根据设备功能划分的,同类功能的设备其他各种硬件条件和需求也相近。Profile是一组API,在某一Configuration的基础上扩展了针对设备特定功能的API,使得标准能够完全适应特殊的设备,彻底发挥设备的功能。
J2ME体系的一般结构是:由Configuration定义的Java虚拟机运行于设备的宿主操作系统之上,构成整个平台的基础。Configuration提供了基本的语言特性,Profile提供针对设备的特殊功能API和扩展类库。应用程序的运行环境需要一个Configuration和至少一个Profile,多个Profile可以共存,也可以叠加。
MIDP(Mobile Information Device Profile)定义了针对移动信息处理设备(主要指智能和一部分具有无线通信功能的PDA)的图形界面,输入和时间处理,持久性存储,无线电话网络连接之上的一些消息处理(例如短消息),安全等等API,并且考虑到了移动信息设备的屏幕和内存限制。类似于J2SE中的Applet框架,MIDP提供了基于javax.microedition.midlet 包的MIDlet应用程序框架。
应为MIDP提出较的比较早,目前重要的智能和PDA操作系统上都已有了相应的实现,而且应用的也比较广泛。
3.3 tomcat服务器介绍
Tomcat是一个免费的开源的Serlvet容器,它是Apache基金会的Jakarta项目中的一个核心项目,由Apache,Sun和其它一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和Jsp规范总能在Tomcat中得到体现。Tomcat被JavaWorld杂志的编辑选为2001年度最具创新的java产品,可见其在业界的地位。
由于Java的跨平台特性,基于Java的Tomcat也具有跨平台性。与传统的桌面应用程序不同,Tomcat中的应用程序是一个WAR(Web Archive)文件。WAR是Sun提出的一种Web应用程序格式,与JAR类似,也是许多文件的一个压缩包。这个包中的文件按一定目录结构来组织:通常其根目录下包含有Html和Jsp文件或者包含这两种文件的目录,另外还会有一个WEB-INF目录,这个目录很重要。通常在WEB-INF目录下有一个web.xml文件和一个classes目录,web.xml是这个应用的配置文件,而classes目录下则包含编译好的Servlet类和Jsp或Servlet所依赖的其它类(如JavaBean)。通常这些所依赖的类也可以打包成JAR放到WEB-INF下的lib目录下,当然也可以放到系统的CLASSPATH中,但那样移植和管理起来不方便。
在Tomcat中,应用程序的部署很简单,你只需将你的WAR放到Tomcat的webapp目录下,Tomcat会自动检测到这个文件,并将其解压。你在浏览器中访问这个应用的Jsp时,通常第一次会很慢,因为Tomcat要将Jsp转化为Servlet文件,然后编译。编译以后,访问将会很快。另外Tomcat也提供了一个应用:manager,访问这个应用需要用户名和密码,用户名和密码存储在一个xml文件中。通过这个应用,辅助于Ftp,你可以在远程通过Web部署和撤销应用。当然本地也可以。
Tomcat不仅仅是一个Servlet容器,它也具有传统的Web服务器的功能:处理Html页面。但是与Apache相比,它的处理静态Html的能力就不如Apache。我们可以将Tomcat和Apache集成到一块,让Apache处理静态Html,而Tomcat处理Jsp和Servlet。这种集成只需要修改一下Apache和Tomcat的配置文件即可。
基于Tomcat的开发其实主要是Jsp和Servlet的开发,开发Jsp和Servlet非常简单,你可以用普通的文本编辑器或者IDE,然后将其打包成WAR即可。
Tomcat确实是一个很好的工具,不仅仅因为其免费,功能强大,更因为其开放性。
3.4 servlet技术介绍
Servlet是用Java编写的Server端程序,它与协议和平台无关。Servlet运行于Java-enabled Web Server中。Java Servlet可以动态地扩展Server的能力,并采用请求-响应模式提供Web服务。
最早支持Servlet技术的是JavaSoft的Java Web Server。此后,一些其它的基于Java的Web Server开始支持标准的Servlet API。
一、Servlet的特点
Servlet是Java技术对CGI编程的回答。Servlet程序在服务器端运行,动态地生成Web页面。与传统的CGI和许多其他类似CGI的技术相比,Java Servlet具有更高的效率,更容易使用,功能更强大,具有更好的可移植性,更节省投资。
1、高效
在传统的CGI中,每个请求都要启动一个新的进程,如果CGI程序本身的执行时间较短,启动进程所需要的开销很可能反而超过实际执行时间。而在 Servlet中,每个请求由一个轻量级的Java线程处理(而不是重量级的操作系统进程)。在传统CGI中,如果有N个并发的对同一CGI程序的请求,则该CGI程序的代码在内存中重复装载了N次;而对于Servlet,处理请求的是N个线程,只需要一份Servlet类代码。在性能优化方面,Servlet也比CGI有着更多的选择,比如缓冲以前的计算结果,保持数据库连接的活动,等等。
2、方便
Servlet提供了大量的实用工具例程,例如自动地解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等。
3、功能强大
在Servlet中,许多使用传统CGI程序很难完成的任务都可以轻松地完成。例如,Servlet能够直接和Web服务器交互,而普通的CGI程序不能。Servlet还能够在各个程序之间共享数据,使得数据库连接池之类的功能很容易实现。
4、可移植性好
Servlet用Java编写,Servlet API具有完善的标准。因此,为I-Planet Enterprise Server写的Servlet无需任何实质上的改动即可移植到Apache、Microsoft IIS或者WebStar。几乎所有的主流服务器都直接或通过插件支持Servlet。
5、节省投资
不仅有许多廉价甚至免费的Web服务器可供个人或小规模网站使用,而且对于现有的服务器,如果它不支持Servlet的话,要加上这部分功能也往往是免费的(或只需要极少的投资)。
二、Servlet的主要功能
Servlet的主要功能在于交互式地浏览和修改数据,生成动态Web内容。这个过程为:
客户端发送请求至服务器端;
服务器将请求信息发送至Servlet;
Servlet生成响应内容并将其传给Server。响应内容动态生成,通常取决于客户端的请求;
服务器将响应返回给客户端;
Servlet看起来像是通常的Java程序。Servlet导入特定的属于Java Servlet API的包。因为是对象字节码,可动态地从网络加载,可以说Servlet对Server就如同Applet对Client一样,但是,由于 Servlet运行于Server中,它们并不需要一个图形用户界面。从这个角度讲,Servlet也被称为Faceless Object。
三、JAVA Servlet的优势
Servlet可以和其他资源(文件、数据库、Applet、Java应用程序等)交互,以生成返回给客户端的响应内容。如果需要,还可以保存请求-响应过程中的信息。
采用Servlet,服务器可以完全授权对本地资源的访问(如数据库),并且Servlet自身将会控制外部用户的访问数量及访问性质。
Servlet可以是其它服务的客户端程序,例如,它们可以用于分布式的应用系统中,可以从本地硬盘,或者通过网络从远端硬盘激活Servlet。
采用Servlet Tag技术,可以在HTML页面中动态调用Servlet。 Servlet API与协议无关。它并不对传递它的协议有任何假设。 像所有的Java程序一样,Servlet拥有面向对象Java语言的所有优势 Servlet提供了Java应用程序的所有优势——可移植、稳健、易开发。使用Servlet 的Tag技术,Servlet能够生成嵌于静态HTML页面中的动态内容。 一个Servlet被客户端发送的第一个请求激活,然后它将继续运行于后台,等待以后的请求。每个请求将生成一个新的线程,而不是一个完整的进程。多个客户能够在同一个进程中同时得到服务。一般来说,Servlet进程只是在Web Server卸载时被卸载。
4 开发环境介绍
4.1开发环境
操作系统:Microsoft Windows XP
程序语言:Java 2
开发平台:Java 2 Micro Edition + Tomcat 5.0
开发工具: SAMSUNG Wireless Tool Kit 2.1+ eclipse3.0.1
4.2 关于SAMSUNG Wireless Tool Kit
SAMSUNG WTK(SAMSUNG Wireless Tool Kit)是SAMSUNG公司针对J2ME推出的用于和Palm等移动设备的软件开发包,它通用性高,开发出的应用程序可保证能运行在大部分设备上,具有强大的功能和完善的调试手段,它提供了运行模拟器的最基本组件,是其他IDE需集成采用的必备元素,也可以单独使用。
5 客户端模块的开发
5.1 综述
客户端部分主要划分为3个界面:菜单界面,登录界面、游戏界面。
具体实现的功能为:
1、菜单界面:有如下选项:
进入游戏——进入到用户登录界面;
操作说明——进入说明界面,说明游戏软件的操作方法;
2、登录界面:
得到用户输入的用户名和密码,向服务器提交,如果身份验证成功,界面则跳转到游戏界面,如果身份验证失败,则弹出警告窗口,说明登录失败原因。
3、游戏界面:
用户游戏时看到的界面,负责根据需要画图。
5.2 程序的类结构
程序一共有7个类,程序的类结构如图所示:
OmokCanvas
:Canvas
Omok.
:MIDlet
ServerConnector
Cursor
:Canvas
Logo
:Form
Help
:Form
OmokBoard
: Canvas
图3类结构图
5.3 游戏的功能流程图
进入游戏后,首先显示的是菜单,有2个命令选项:进入游戏和操作说明;一个按钮:退出程序。选择进入游戏这个命令,则进入到用户登录窗口,如果登录成功,则跳转到游戏界面,如果登录失败,则跳出警告窗口,3秒后返回到登录窗口。也可以从登录窗口退出程序。如果选择操作说明命令,则显示操作说明界面,按返回按钮,又回来主菜单。游戏的功能流程如图所示
菜单
进入游戏
操作说明
登录窗口
游戏
说明
Back
警告窗口
游戏
图4功能流程图
5.4 游戏的实现
5.4.1 主类Omok的实现
MIDlet是最核心的类。MIDlet程序有三种状态:
1、 暂停状态
2、 运行状态
3、 销毁状态
J2ME程序都是从MIDlet类开始执行。系统在执行MIDlet程序时,首先构造一个MIDlet类型的对象,然后使程序进入到暂停状态,按照生命周期的规定,系统会自动调用MIDlet对象的startApp方法使程序进入到运行状态,开始程序的执行。
图5 开始界面
首先,先要创建MIDlet类型的对象,下面来看对象的构造方法:
public Omok() {
startCmd = new Command("Start", Command.SCREEN, 2);
exitCmd = new Command("Exit", Command.EXIT, 3);
theCanvas = new OmokCanvas();
theOne=new main();
display=Display.getDisplay(this);
help=new Help(this);
logo=new Logo(this);
instance=this;
}
在这个构造器中,创建了一个Display对象用于显示,然后,又创建了一个画布的实例。
Display类有两个最主要的作用:
1、 获得屏幕的属性。例如屏幕是否是彩色的,以及支持的颜色数量等信息。
2、 控制屏幕的显示。例如使屏幕显示某个指定界面或者获得当前的显示界面等。
其中,特别是第二个作用使用的更加频繁。
当程序启动的时候,则调用了程序的startApp方法,用来显示画面:
public void startApp() {
theCanvas.addCommand(startCmd);
theCanvas.addCommand(exitCmd);
theCanvas.setCommandListener(this);
display.setCurrent(theOne);
}
这个方法的作用是把在构造器中创建的画布对象设置为当前屏幕上需要显示的画面。
当调用destroyApp 这个方法的时候,则退出程序。
public void destroyApp(boolean unconditional)
{
exit();
}
public void exit()
{
System.gc();
notifyDestroyed();
}
退出程序的时候,要实行垃圾回收,释放掉不再使用的内存。
5.4.2 游戏登录界面以及操作说明界面的实现
这两个类的实现都是继承了Form类,来添加各种组件的。下面是效果图:
图6 Form界面效果图
下面先来分析logo类:
class Logo extends Form implements CommandListener
这是类的声明,它继承了Form类,同时派生了一个接口,用来产生按钮事件。
Logo(Omok midlet)
{
super("");
this.midlet = midlet;
UserName=new TextField("用户名","",9,TextField.ANY);
UserPassword=new TextField("密 码","",9,TextField.PASSWORD);
try{
img=new ImageItem("",Image.createImage("/1.png"),ImageItem.LAYOUT_CENTER,"image explorer");}
catch(java.io.IOException e){}
append(img);
append(UserName);
append(UserPassword);
backCommand = new Command("登录", Command.BACK, 1);
exit = new Command("退出", Command.EXIT, 1);
addCommand(backCommand);
// addCommand(exit);
setCommandListener(this);
}
这是他的构造方法,创建了2个输入框,并添加到Form上,并且还加上了2个按钮。
Help类的实现和它类似,因此不再详细介绍。
5.4.3游戏画布类的实现
在J2ME游戏编程中,Canvas类是最常用的类之一,该类提供了获得屏幕属性、绘制界面以及事件处理等很多实用的功能。
Canvas类是Displayable的子类,在实际的使用过程,一般都通过继承Canvas来利用该类提供的功能。Canvas类是一个抽象类,继承该类的时候必须覆盖paint方法。来看游戏画面:
图7 游戏运行效果图
首先先看下它的构造方法:
public OmokCanvas() {
board = new OmokBoard();//创建画板
cursor = new Cursor();//创建光标
connector = new ServerConnector(this);
setGameMode(INIT);//设置模式
}
在它里面,创建了画板,光标、连接器。并且设置了模式。
然后来看具有流程控制作用的setGameMode方法:
private void setGameMode(int gameMode) {
this.gameMode = gameMode;
switch(gameMode) {
case INIT :
id0 = id1 = -1;//设置标记变量初始值
row = col = 6;//初始化棋盘大小
board.init();
break;
case CONNECT :
Thread cthread = new Thread()
{
public void run()
{
repaint();
if(islogin)
{connect();
}
else
{loginGame();
}
}
};
cthread.start();
break;
case TURN0 :
cursor.setLocation(row, col);
break;
case TURN1 :
connector.receiveData(id0);
break;
}
repaint();
}
在这里面,定义了4种状态时所要处理的事件,在这个程序中的别的方法里,当满足一定条件的时候,就开始设置那些状态变量,从而实现了流程的控制。
5.4.4网络连接类的实现
在J2ME中,专门提供了一个网络连接框架——GCF。它为资源有限的设备提供了一个可扩展的、通用的I/O 框架。GCF 是一组在 http://javax.microedition.io 包中定义的接口。
在 GCF 中共定义了七个接口 ,其中 Connection 是最基本的连接类型,且同时提供了对数据包和流连接的支持。沿着层次结构向下派生出提供更多功能的接口。在MIDP 1.0 规范只要求设备支持 HTTP 连接协议,而更新的 MIDP 2.0 规范要求同时支持 HTTP 和 HTTPS,后者提供了对更安全的网络连接的支持。
下面来分析核心代码:
//打开连接
private String readPage(String url) throws IOException {
StringBuffer result = new StringBuffer();
HttpConnection c = null;
InputStream is = null;
try {
c = (HttpConnection)Connector.open(url);
is = c.openInputStream();
int ch = 0;
while ((ch = is.read()) != -1) {
result.append((char)ch);
}
} finally {
if (is != null) is.close();
if (c != null) c.close();
}
return result.toString();
在这个方法中,首先建立了一个连接,采用流来得到数据,当数据传输完毕后,关闭流,关闭连接。
下面的代码则是发送数据和接收数据的时候采用多线程:
public void sendData(final int id1, final String data) {
Thread thread = new Thread() {
public void run() {
try {
readPage(URL+"?command=sendData&id="+id1+
"&data="+data);
} catch (IOException e) {
}
}
};
thread.start();
}
public void receiveData(final int id0) {
Thread thread = new Thread() {
public void run() {
receive(id0);
}
};
thread.start();
}
在目标设备具有内存小,计算能力弱和电池供电等特点的时候,如何使应用程序高效的运行就成为开发中的一个大问题.尤其针对等移动信息设备时,无线通讯的特点又对我们的程序提出了更高的要求.从代码优化的角度,在网络编程中引入多线程就显得十分重要。
当程序运行的时候,Application Management Software(应用管理软件)首先初始化一个MIDlet,然后调用它的startApp()方法使得MIDlet进入active状态,这条程序分支就是主线程,它执行其他的方法后都会返回到这个分支上来继续执行。然而网络连接是个可能堵塞的操作,意味着它可能长时间都不返回。
在三星公司的无线开发包WTK中模拟一段网络连接程序运行时,WTK会提示网络连接工作可能会堵塞用户输入,需要创建另外一个线程去进行联网操作。所以针对以上情况,采用多线程进行实现。
5.4.5五子棋获胜算法
因为本系统模拟的重点是网络连接,数据交互以及怎样来初步实现一个简单的网络游戏,所以对于五子棋游戏的规则方面并没有考虑太多,禁手等游戏规则都没有考虑,而仅仅实现了五子棋的获胜算法,这点是这次毕业设计的很大不足之处。
下面这个方法就是来实现五子棋的获胜算法:
//检测是否获胜
public int checkStones() {
for (int x = 0;x < 11;x++) {
for (int y = 0;y < 11;y++) {
if (stones[x][y] == EMPTY) continue;
//检查一行
if (x != 0 && x != 1 && x != 10 && x != 11 &&
stones[x][y] == stones[x-2][y] &&
stones[x][y] == stones[x-1][y] &&
stones[x][y] == stones[x+1][y] &&
stones[x][y] == stones[x+2][y])
return stones[x][y];
//检查一列
if (y != 0 && y != 1 && y != 10 && y != 11 &&
stones[x][y] == stones[x][y-2] &&
stones[x][y] == stones[x][y-1] &&
stones[x][y] == stones[x][y+1] &&
stones[x][y] == stones[x][y+2])
return stones[x][y];
//检查右下方向一列
if (x != 0 && x != 1 && x != 10 && x != 11 &&
y != 0 && y != 1 && y != 10 && y != 11 &&
stones[x][y] == stones[x+2][y+2] &&
stones[x][y] == stones[x+1][y+1] &&
stones[x][y] == stones[x-2][y-2] &&
stones[x][y] == stones[x-1][y-1])
return stones[x][y];
//检查左下方向一列
if (x != 0 && x != 1 && x != 10 && x != 11 &&
y != 0 && y != 1 && y != 10 && y != 11 &&
stones[x][y] == stones[x+2][y-2] &&
stones[x][y] == stones[x+1][y-1] &&
stones[x][y] == stones[x-2][y+2] &&
stones[x][y] == stones[x-1][y+1])
return stones[x][y];
}
}
return -1;
}
通过在水平,垂直,斜45度方向上进行检测,来判断是否获胜。
6服务器端程序的开发
6.1数据库的设计与实现
数据库系统是一个实际可运行的存储、维护和应用数据的软件系统,是存储介质、处理对象和管理系统的集合体。它通常由软件、数据库和数据管理员组成。其软件主要包括操作系统、各种宿主语言、实用程序以及数据库管理系统。数据库是依照某种数据模型组织起来并存放二级存储器中的数据集合。这些数据为多个应用服务,独立于具体的应用程序。数据库由数据库管理系统统一管理,数据的插入、修改和检索均要通过数据库管理系统进行。数据库管理系统是一种系统软件,它的主要功能是维护数据库并有效地访问数据库中任意部分数据。对数据库的维护包括保持数据的完整性、一致性和安全性。
在本系统中,只建立了一个表users,用来存储用户身份信息。
表1用户信息表
表名 | 描述 |
---|---|
Users | 用户登录表 |
用户登录表,包括以下字段:用户名,密码。其中用户名就是系统分配给各个用户的固定号码,初始状态下其密码与其用户名相同。例如:在本系统中,用户名为“1001”,那密码也为“1001”。
因为本人是第一次编写联网的游戏,各方面都处于初学摸索状态,并且这方面的资料在网上非常少,所以本系统后台方面功能比较简单,目前对数据库的操作只有身份验证这一个功能模块。
6.2 servlet程序的编写
编写了OmokServlet这个类实现了数据的传输以及数据库的查询功能。
public class OmokServlet extends HttpServlet
下面来看doGet方法:
public synchronized void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException {
String command =getParameterValue(request, "command");
String result = "";
//连接
if (command.equals("connect")) {
dataMap.remove(String.valueOf(idCount));
result = String.valueOf(idCount);
idCount = (idCount > 999) ? 0 : idCount+1;
}
else if (command.equals("login")) {
String userid = getParameterValue(request, "UserId");
String psw = getParameterValue(request, "Psw");
System.out.println(userid);
System.out.println(psw);
String sql ="select * from users where id='"+userid+"'";
try
{
ResultSet result0=ExecuteQuery(sql);
if(result0.next())
{
String password = result0.getString("password");
if(password.equals(psw))
{
dataMap.remove(String.valueOf(idCount));
result = String.valueOf(idCount);
System.out.println(result);
idCount = (idCount > 999) ? 0 : idCount+1;
}
else
{
result=String.valueOf(-1);
}
}
else
{
result=String.valueOf(-1);
}
}catch(Exception e){System.out.println("访问数据库出错");}
}//断开
else if (command.equals("disconnect")) {
String id = getParameterValue(request, "id");
dataMap.put(id, "E");
}//发送数据
else if (command.equals("sendData")) {
String id = getParameterValue(request, "id");
String data = getParameterValue(request, "data");
dataMap.put(id, data);
}//接收数据
else if (command.equals("receiveData")) {
String id =getParameterValue(request, "id");
if (dataMap.containsKey(id)) {
result = (String)dataMap.remove(id);
}
}
PrintWriter pw = response.getWriter();
pw.print(result);//返回分配给每个客户端分配的代号
pw.flush();
pw.close();
}
在这个方法中,分别就5种状态进行了分别的处理,包括:用户验证状态、连接状态、发送状态、接受状态以及断开状态。客户端在进行登录,身份验证的时候,状态为login,然后提交用户名密码,当这个servlet接收到信息后,首先查询信息的状态,然后进行相应的处理,这次状态为“login”,所以提取用户名密码 进行查询,如果都匹配的话,返回分配给这个客户端的号码,以便以后传输信息用。如果不匹配的话,则返回-1。身份验证成功的客户端,以后在每次发送消息的时候都要附带发送之前被分配的那个号码,因为是没有ip地址的,并且本系统的传输协议为http连接,为了区分发送过来的信息的来源,就必须附加一个号码,每次解吸信息前,先提取是哪个号码发送来的信息,然后把信息放到hashtable中,然后等待与这个号码相匹配的另一个号码发送请求来取走信息。
7改进建议和措施
7.1关于图片问题
在编程过程中,由于没有美工,本人又不会太多的图片处理技术,所以有一些图片是从www.baidu.com上面搜索到的,然后再进行加工,因为本题目为毕业设计,不是商业用途,所以对于侵犯版权问题,不应该存在。
7.2软件测试
7.2.1测试前的准备工作
第一步:首先必须在PC上安装J2SE SDK 1.4.2
第二步:下载SAMSUNG WTK2.0,这个程序是三星的软件开发包,里面包含有很多种型号的模拟器,我们需要的就是这个模拟器。
第三步:双击桌面上开发包程序的快捷方式,打开开发包程序,然后打开开发包内自带的工程,启动模拟器,运行那个工程,测试下软件是否安装成功。
Java 语言并没有完全编译成二进制可执行文件,编译出的.class文件是一种介于源程序和二进制之间的一种基于半解释的字节码,需要虚拟机来执行。它包括了所有的信息。然而这样会导致.class很容易被反编译为源代码,从而不能保护作者的知识成果。目前流行的如decodeJAD等反编译工具可以以很快的速度生成源文件。如果不加以施行有效的措施,将造成严重的后果。
由此引入混淆器的概念。混淆器将代码中的所有变量、函数、类的名称变为简短的英文字母代号,如果缺乏相应的函数名指示和程序注释,即使被反编译,也将难以阅读。
混淆器的作用不仅仅是保护代码,它也有精简编译后程序大小的作用。由于以上介绍的减少变量、函数的命名长度的关系,编译后也会从.class文件中减少这些冗余的信息。混淆后,体积大约能减少25%,这对当前费用较贵的无线网络传输是有一定意义的。
打包具体过程:
游戏文件打包实际上就是生成jar、jad文件。wtk中文件打包是这样实现的:
图8 打包效果图
7.2.2进行测试
进行游戏系统测试的目的是发现错误,一个成功的测试是发现了迄今为止还没有发现的错误。因为游戏系统的功能实现最终是通过界面体现出来的,所以我们下面的测试将游戏系统功能测试和界面测试结合起来进行。
- 进入游戏前的显示界面 (图9)
- 用户登录界面(图10)
- 游戏界面(图11)
图9显示界面 图10 登录界面
图11 游戏界面
测试过程中发现的bug:
- 录界面中,输入用户名的时候,要先把光标移动到下面输入框内
- 如果用户名输入错误后,第二次输入的时候则不能登录进去
3、游戏中如果用户较多,回合较多的话,会有数量限制
游戏bug的解决:
- 由于经验问题,这个问题还未解决
- 把登录函数转移到登录界面类中去
- 由于技术问题,还未得到解决办法
7.2.3有待添加和完善的功能
1、界面设计不够美观。界面采用统一的方格块,看起来很单调。游戏任务失败和任务完成都是通过文字显示,缺少画面效果。
2、游戏没有时间控制模块。
3、玩家人数有限制。
结 论
程序设计实现了上联网游戏的开发以及后台的实现,具有一定的可玩性和复杂性。经过了细心的调试和排错解决了绝大部分的问题。
现在已经做出的是游戏的1.0版本,实现了游戏的最基本功能,还有一些在游戏中应有的功能没有能实现,离一个完全意义上的网络游戏还有很大一段的距离:
1.游戏只在模拟器上运行,还没有经过真机调试;
2.游戏的选项界面没有经过任何效果美化;
3.后台实现比较简单
参考文献
[1] 胡虚怀,杨志和,李焕.J2ME移动设备程序设计[M].北京:清华大学出版社,2005。
[2] 李振鹏,龚剑.J2ME游戏开发技术详解[M].北京:清华大学出版社,2006。
[3] 詹建飞.J2ME开发精解[M].北京:电子工业出版社,2006。
[4] 施铮.J2ME技术参考手册[M].北京:电子工业出版社,2004。
[5] 微型爪哇人.JAVA开发[M].北京:中国铁道出版社,2003。
[6] 闻怡洋.J2ME MIDP 1.0/2.0无线设备编程指南[M].北京:北京大学出版社,2004。
致 谢
首先感谢指导老师李晓岗老师和苟智坚老师,他们在毕业设计过程中提出了指导性的方案和架构,并指引本人阅读相关的资料和书籍,使本人在不熟悉的领域中仍能迅速掌握新兴的技术。
感谢答辩组对毕业设计的考核,如果可以得到专家的认可将对本人的学习和工作给予极大的鼓励。你们客观的评价和建议将牢记在心,在今后的发展中扬长避短,更加努力的严格要求自己。
在论文完成过程中,本人还得到了其他老师和许多同学的热心帮助,本人向他们表示深深的谢意!
最后向在百忙之中评审本文的各位专家、老师表示衷心的感谢!