java毕业设计——基于java+J2ME的五子棋网络对战游戏设计与实现(毕业论文+程序源码)——五子棋网络对战游戏

基于java+J2ME的五子棋网络对战游戏设计与实现(毕业论文+程序源码)

大家好,今天给大家介绍基于java+J2ME的五子棋网络对战游戏设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴,可以进入我的博客主页查看左侧最下面栏目中的自助下载方法哦

文章目录:

1、项目简介

本文基于J2ME技术,以计算机网络游戏的运行流程为基础,分模块开发一款网络五子棋游戏软件。

本文对以下几点内容做了重点研究和探讨:
1、 系统整体结构,根据设计目标,结合普通网络游戏的运行流程,给出了系统总体设计方案,并探讨了系统设计时需要用到的关键技术。
2、 MIDP客户端的实现,MIDP客户端是游戏的唯一客户端,主要功能包括连接服务器进行身份验证、进行游戏并不断的与服务器交换数据。
3、 后台系统的设计与实现,后台用来处理与数据库的互联来验证用户身份、处理由客户端发送过来的数据。
由于受到客观条件的限制,本系统的测试是在三星模拟器上完成的,但它仍不失具一定的实用价值。


2、资源详情

项目难度:中等难度
适用场景:相关题目的毕业设计
配套论文字数:10802个字28页
包含内容:整套源码+完整毕业论文+答辩PPT


3、关键词

J2ME;游戏;Servlet

4、毕设简介

提示:以下为毕业论文的简略介绍,项目源码及完整毕业论文下载地址见文末。

引言
省略

2系统综述
本系统采用C/S结构,包括客户端和服务器后台两个部分。
客户端采用j2me midp1.0函数编写,保证了非常好的可移植性。服务器端采用了tomcat作为http服务器,免费并且具有非常强大的功能,中间件采用java servlet进行中间过程的处理,具有很好的稳定性和可移植性,采用的数据库则是sql server 。

用户需要运行本系统客户端软件,输入用户名和密码进行身份验证,如果验证成功,则可以进入游戏界面,和其他已经登录的玩家进行游戏;如果验证不成功,说明输入的用户名或者密码错误,需要重新进行输入,否则不会进入到游戏界面。

系统分为三层,包括数据库服务器层、功能层和表示层。数据库服务器层主体是SQL,功能层由Tomcat+ servlet技术实现,表示层为前台操作客户端.总体结构如下图所视:

在这里插入图片描述

图1 总体结构图

3游戏的现状和关键技术介绍
3.1软件现状
在信息社会中,及其他无线设备越来越多的走进普通百姓的工作和生活,随着信息网络化的不断进展,及其他无线设备上网络势在必行。但是传统存在以下弊端:

  1. 传统出厂时均由硬件厂商固化程序,程序不能增加、删除,有了错误也不能更新、修改,若要增加新功能必须另换一部。
  2. 传统访问互联网是通过WAP(Wireless Application Protocal),所有网络资源必须接通网络才能在线访问,非常耗时、费用亦很高。

而Java技术在无线应用方面的优势非常明显:
1 应用程序可按需下载,而不是购买由硬件商提供的套件,可升级空大。
2 Java技术提供了一个类库,它使的应用开发商可以创建更为直觉、丰富的用户界面(GUI);
3.Java技术使网络带宽的应用更为有效,因为应用程序可以下载到器件上,并在本地运行,仅仅是在连接到服务器时才会占用网络带宽。

3.2 J2ME概况
3.2.1 J2ME的由来
Java的最大目标和特点,就是"一次编写,到处运行"的平台无关性。但是,一套标准无法适应各种不同的需求。因此,Java技术目前共有三套,分别针对不同的平台和应用。
省略

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产品,可见其在业界的地位。

省略

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
程序语言:Java
开发平台:Java Micro Edition + Tomcat
开发工具: Wireless Tool Kit+ eclipse

4.2 关于Wireless Tool Kit
WTK(SAMSUNG Wireless Tool Kit)是SAMSUNG公司针对J2ME推出的用于和Palm等移动设备的软件开发包,它通用性高,开发出的应用程序可保证能运行在大部分设备上,具有强大的功能和完善的调试手段,它提供了运行模拟器的最基本组件,是其他IDE需集成采用的必备元素,也可以单独使用。

5 客户端模块的开发
5.1 综述
客户端部分主要划分为3个界面:菜单界面,登录界面、游戏界面。
具体实现的功能为:
1、菜单界面:有如下选项:
进入游戏——进入到用户登录界面;
操作说明——进入说明界面,说明游戏软件的操作方法;
2、登录界面:
得到用户输入的用户名和密码,向服务器提交,如果身份验证成功,界面则跳转到游戏界面,如果身份验证失败,则弹出警告窗口,说明登录失败原因。
3、游戏界面:
用户游戏时看到的界面,负责根据需要画图。

5.2 程序的类结构
省略

5.3 游戏的功能流程图
进入游戏后,首先显示的是菜单,有2个命令选项:进入游戏和操作说明;一个按钮:退出程序。选择进入游戏这个命令,则进入到用户登录窗口,如果登录成功,则跳转到游戏界面,如果登录失败,则跳出警告窗口,3秒后返回到登录窗口。也可以从登录窗口退出程序。如果选择操作说明命令,则显示操作说明界面,按返回按钮,又回来主菜单。

5.4 游戏的实现
5.4.1 主类Omok的实现
MIDlet是最核心的类。MIDlet程序有三种状态:
1、 暂停状态
2、 运行状态
3、 销毁状态
J2ME程序都是从MIDlet类开始执行。系统在执行MIDlet程序时,首先构造一个MIDlet类型的对象,然后使程序进入到暂停状态,按照生命周期的规定,系统会自动调用MIDlet对象的startApp方法使程序进入到运行状态,开始程序的执行。

首先,先要创建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 是一组在 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%,这对当前费用较贵的无线网络传输是有一定意义的。

7.2.2进行测试
省略

结 论
程序设计实现了上联网游戏的开发以及后台的实现,具有一定的可玩性和复杂性。经过了细心的调试和排错解决了绝大部分的问题。

现在已经做出的是游戏的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。

致 谢
省略


5、资源下载

本项目源码及完整论文如下,有需要的朋友可以点击进行下载。如果链接失效可点击下方卡片扫码自助下载。

序号毕业设计全套资源(点击下载)
本项目源码基于java+J2ME的五子棋网络对战游戏设计与实现(源码+文档)_java_J2ME_五子棋网络对战游戏.zip
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

毕业设计方案专家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值