java编程应用实例03.pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《java编程应用实例03.pdf》由会员分享,可在线阅读,更多相关《java编程应用实例03.pdf(47页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、目前手机网络游戏的迅速崛起,让游戏运营商们又发现了一个新的发展“特区”,期待着手游能继网游之后成为新的经济增长点。手游为广大手机用户带来了一种全新的休闲方式,他们可以随时随地利用手游放松紧张的情绪,缓解学习、工作、生活中的种种压力。本章将介绍如何使用Java 的 J2ME 技术开发一款以象棋为核心的手机网络游戏。通过阅读本章,可以学习到:J2ME 程序开发 HTTP 协议的有状态连接 J2ME 与 Tomcat的通信 如何绘制游戏界面 游戏信息处理 使用EclipseMe 工具手机网络游戏手机网络游戏(J2ME+Servlet实现)实现)10第第章章Java 项目开发全程实录10.1 开发背景
2、加入 WTO 之后,随着 3G 时代的即将到来,中国手机网络游戏迅速崛起,成为继网游之后又一新的经济增长点。有限公司是一家手机游戏运营商,公司已经从网络版的手机游戏运营中获取了大量的资金,现在总结了玩家的反馈信息,发现游戏玩家需要一些小型的休闲类游戏,例如纸牌、象棋、围棋和一些智利游戏等。现需要委托其他单位开发一个网络版的手机象棋游戏。10.2 系统分析10.2.1 需求分析通过与有限公司的沟通和需求分析,要求系统具有以下功能。系统操作简单,界面友好。运行速度快,保证程序的稳定性。支持多人操作。支持移动网络连接。以HTTP 协议通信。10.2.2 可行性分析从手机游戏依托的技术平台来看,目前
3、Java 手机游戏保持很高的增长速度。手机游戏将是未来游戏市场的主要发展方向,只要拥有一部手机,就可以进入到全新的掌上游戏世界。游戏正成为无线增值服务的主力军,各游戏开发商早已洞察到这一点。通信公司 2.5G 和 3G 通信技术的发展,给手机用户带来了高达每秒 384K6ps 的移动带宽,将语音、图像、视频有序地结合起来,给手机用户带来了更加丰富多彩的多媒体娱乐服务。借此东风,各游戏开发商将进入全新的无线网络游戏时代,市场潜力巨大。手机版象棋游戏采用 MIDP 1.0 开发,在低端手机上运行的同时,保证了高端手机的兼容性,其市场发展空间巨大。伴随着中国移动 GPRS 和中国联通 CDMA1X
4、数据业务的开展,手机游戏将是 3G数据业务一个重要的应用领域。198第 10 章 手机网络游戏(J2ME+Servlet 实现)10.3 系统设计10.3.1 系统目标根据需求分析的描述以及与用户的沟通,现制定系统实现目标如下。界面设计简洁、友好、美观大方,保证直接上手便可游戏。操作简单、快捷方便。规则简单,方便游戏者进行游戏。实现智能规则判断。支持大型Web 服务器,以 Http 协议通信。向PC 端开发靠拢,为以后 PC 与手机互联奠定基础。10.3.2 系统功能结构本系统的服务器端包括消息接收和桌面管理,功能结构如图 10.1 所示。客户端包括主窗体、游戏界面、消息处理等模块,其功能结构
5、如图10.2 所示。主机服务器端消息接收登录信息处理落座信息处理开始信息处理走棋信息处理退出信息处理桌面管理更新单个桌面获取桌面列表更新所有桌面 手机客户端主窗体桌面更新处理落座信息处理获取玩家列表落座消息处理退出信息处理游戏界面绘制棋盘规则处理绘制棋子消息处理消息发送图 10.1 服务器端系统功能结构 图 10.2 客户端系统功能结构10.3.3 构建开发环境(根据语言的实际情况写)在开发手机游戏时,分别使用了以下软、硬件环境。硬件平台:CPU:P 800GHz。内存:256MB 以上。硬盘:500MB 以上空间。显卡:32MB 以上显存。199Java 项目开发全程实录软件平台:操作系统:
6、Windows 2003(SP1)。Java 开发包:JDK 1.6。J2ME 开发包:Wireless Toolkit 2.5.2 for CLDC。分辨率:最佳效果1024768 像素。手机分辨率:最佳效果为 240292 像素。开发工具:Eclipse 3.2+MyEclipse 5.1+EclipseMe 1.7.7。10.3.4 系统预览手机版象棋游戏的界面根据具体游戏进度而变换,下面仅列出几个典型界面的预览,其他页面参见光盘中的源程序。游戏的开局界面如图10.3 所示,该界面是游戏的主界面,包含游戏的规则算法、控制走棋、吃棋、选棋、退出、开始等操作。如图10.4 所示是游戏进行到死
7、局的界面效果,在该界面中,红棋已经无路可走,它被对方的“炮”和“车”将死。200第 10 章 手机网络游戏(J2ME+Servlet 实现)图 10.3 开局界面(光盘GameCanvas.java)图 10.4 死局界面(光盘GameCanvas.java)输棋的界面如图 10.5 所示,该界面在玩家输棋的时候提示玩家“抱歉,您失败了”。游戏胜利界面如图10.6 所示,该界面在玩家取得胜利的时候提示玩家“恭喜,您获胜了”。图 10.5 输棋界面(光盘GameCanvas.java)图 10.6 胜利界面(光盘GameCanvas.java)说明:由于路径太长,因此省略了部分路径,省略的路径是
8、“TM10 xiangqisrccomlzw”。10.3.5 文件夹组织结构在进行系统开发之前,需要规划文件夹组织结构。也就是说,建立多个文件夹,对各个功能模块进行划分,实现统一管理。这样做的好处在于:易于开发、管理和维护。开发本游戏时,服务器文件夹组织结构和客户端文件夹组织结构分别如图 10.7 和图 10.8 所示。201Java 项目开发全程实录图 10.7 服务器端文件夹组织结构图 10.8 客户端文件夹组织结构10.4 主程序设计手游程序的主程序,必须继承 MIDlet 类,MIDlet 是一个抽象类,该类是手游应用程序的入口,这和Java 应用程序中含有 main()方法的主类相似
9、。Game 类继承了 MIDlet 类成为手游程序的主类,并实现了 CommandListener 接口处理相应的软键触发事件。该类在程序界面中创建了 List 列表,该列表包括游戏桌面信息和相应的操作(本实例主要是介绍游戏的开发,游戏桌面信息使用简单的字符信息“0”和“1”代替“空座”和“落座”信息)。简单的界面如图10.9 所示。202第 10 章 手机网络游戏(J2ME+Servlet 实现)第一位数字代表桌子号码,第二位和第三位的 0 代表是否有玩家落座 图 10.9 简单桌面列表信息创建主程序的步骤如下:(1)创建Game类,该类必须继承MIDlet类并实现 CommandListe
10、ner 接口。在类中创建并初始化程序画布类(即游戏界面)、消息处理、桌面列表、软键按钮等对象。关键代码如下:例程01 代码位置:光盘TM10 xiangqisrccomlzwGame.javapublic class Game extends MIDlet implements CommandListener private Client client;/声明客户端消息处理对象public static Display display;/声明静态的设备对象private GameCanvas canvas;/声明游戏画布对象private List playerList;/声明列表控件对象pr
11、ivate int desks;/声明桌面数组private int trySeat,tryDesk;/声明落座的桌号和位置变量private Command okCommand;/声明落座按钮控件对象public Game()/在构造方法中初始化所有类成员display=Display.getDisplay(this);playerList=new List(Online player,Choice.EXCLUSIVE);Command exitCommand=new Command(退出,Command.EXIT,0);playerList.addCommand(exitCommand);
12、okCommand=new Command(落座,Command.OK,0);playerList.addCommand(okCommand);playerList.setCommandListener(this);display.setCurrent(playerList);client=new Client(this);/省略部分代码(2)实现MIDlet 类规定的3 个声明周期方法,其中 startApp()方法在手游程序被加载时,初始化程序需要的数据,pauseApp()方法在手游程序被暂停或者被手机来电中断时暂存游戏数据,destroyApp()方法在退出手游程序时负责清空程序数据,
13、释放所有资源。这些方法是父类的抽象方法,即使不实现方法逻辑,也要编写相应的方法声明。关键代码如下:203Java 项目开发全程实录例程02 代码位置:光盘TM10 xiangqisrccomlzwGame.javaprotected void startApp()throws MIDletStateChangeException protected void pauseApp()protected void destroyApp(boolean p0)throws MIDletStateChangeException/在程序退出时,发送 exit 消息client.sendMessage(ex
14、it);display.setCurrent(null);(3)实现 CommandListener 接口中规定的 commandAction()方法,该方法用于处理软键的触发事件。当玩家触发“退出”按钮时,该方法将使游戏退出并结束手游程序。当玩家触发“落座”按钮时,该方法将获取桌面列表中选择的当前列表项,并分析该桌面的玩家信息,如果该桌面有空位置,则设置游戏玩家的桌号和座位号,并显示游戏界面。关键代码如下:例程03 代码位置:光盘TM10 xiangqisrccomlzwGame.javapublic void commandAction(Command c,Displayable s)if
15、(c.getCommandType()=Command.EXIT)/当玩家触发退出按钮时client.sendMessage(exit);try destroyApp(false);notifyDestroyed();/退出并结束手游程序 catch(Exception e)e.printStackTrace();else if(c=okCommand)/当玩家触发落座按钮时if(playerList.getSelectedIndex()=0)try String info=playerList.getString(playerList.getSelectedIndex();/获取桌面信息in
16、t index1=info.indexOf(-);int d=Integer.parseInt(info.substring(0,index1);int index2=info.indexOf(-,index1+1);int d1=Integer.parseInt(info.substring(index1+1,index2);int d2=Integer.parseInt(info.substring(index2+1);if(d1=0|d2=0)/如果该桌面有空的座位if(d1=0)trySeat=0;/设置玩家座位号为 0elsetrySeat=1;/或者设置玩家座位号为 1tryDes
17、k=d;if(canvas=null)canvas=new GameCanvas(this,client);/初始化游戏界面的画布对象elsecanvas.init();/调用游戏界面的 init()方法client.sendMessage(take,+d+,+trySeat);/调用 sendMessage()方法发送落座消息204第 10 章 手机网络游戏(J2ME+Servlet 实现)catch(Exception exc)System.out.println(Error parseInt);exc.printStackTrace();(4)编写takeSeat()方法,该方法用于处理
18、玩家的落座信息。当程序接收到服务器的takeseat信息时,将调用该方法完成程序界面的初始化、设置玩家座位、桌号,并显示游戏界面。关键代码如下:例程04 代码位置:光盘TM10 xiangqisrccomlzwGame.javapublic void takeSeat()/处理落座信息的方法if(canvas=null)/如果游戏界面对象未初始化canvas=new GameCanvas(this,client);/初始化游戏界面对象elsecanvas.init();/调用游戏界面的 init()方法canvas.setSeatPos(trySeat);/设置玩家座位canvas.setDe
19、skIndex(tryDesk);/设置玩家卓号display.setCurrent(canvas);/显示游戏界面(5)编写updateDesk()方法,该方法用于更新桌面列表的单个列表项,也就是单个桌面的座位信息。当程序接收到服务器的 updatedesk 信息时,将调用该方法解析 updatedesk 信息之后的桌面数据,并更新到程序界面中。关键代码如下:例程05 代码位置:光盘TM10 xiangqisrccomlzwGame.javapublic void updateDesk(String str)/更新桌面int index1=str.indexOf(,);/解析分隔符的位置in
20、t index2=str.indexOf(:,index1+1);int index3=str.indexOf(,index2+1);try/截取桌面数据到 desks 数组中int d=Integer.parseInt(str.substring(index1+1,index2);desksd0=Integer.parseInt(str.substring(index2+1,index3);desksd1=Integer.parseInt(str.substring(index3+1);playerList.set(d,d+-+desksd0+-+desksd1,null);/更新桌面列表
21、catch(Exception exc)(6)编写 setDesks()方法,该方法用于设置整个桌面列表。当程序接收到服务器的 desks 信息时(该信息包括了所有桌面信息),setDesks()方法必须解析这些信息并更新游戏主程序的所有桌面。关键代码如下:例程06 代码位置:光盘TM10 xiangqisrccomlzwGame.javapublic void setDesks(String string)for(int i=0;i playerList.size();i+)/清除原桌面列表205Java 项目开发全程实录playerList.delete(i);int index1,ind
22、ex2,index3,index4,index0;/解析分隔符位置index1=string.indexOf(,);index2=string.indexOf(:,index1+1);int desknum=Integer.parseInt(string.substring(index1+1,index2);/解析桌面编号desks=new intdesknum4;/初始化桌面数组index0=index2;int counter=0;while(counter 0)deskscounter1=Integer.parseInt(string.substring(index1+1,index4)
23、;else string=string.trim();deskscounter1=Integer.parseInt(string.substring(index1+1);playerList.append(counter+-+deskscounter0+-/将数组中的数据更新到主程序界面+deskscounter1,null);index0=index4;counter+;10.5 公共模块设计本系统的服务器项目空间中,有部分程序是公用的,它们被多个模块甚至整个系统重复调用完成指定的业务逻辑,本节将这些公共的模块提出来进行单独介绍。10.5.1 创建 Player公共类Player 类代表玩家
24、对象。每个玩家都有不同的属性,这些属性用来表示唯一的玩家。在现实社会中没有完全相同的两个人物,而游戏中也应如此,否则无法保证游戏的数据安全。要做到区分不同的玩家,就必须为每个玩家添加IP 地址和端口属性。另外,玩家会坐在不同桌子的不同座位上、有不同颜色的棋子、独立的消息队列和开始状态等,这些都需要声明对应的属性并记录属性状态。关键代码如下:例程07 代码位置:光盘TM10XiangQiServersrccomlzwPlayer.javapublic class Player private int ID=1;/玩家编号private String IP=;/玩家 IP地址206第 10 章 手
25、机网络游戏(J2ME+Servlet 实现)private int PORT=9999;/玩家端口号private Desk desk;/玩家所在的桌面对象public Queue data;/消息队列private String Color=;/玩家手中象棋的颜色public boolean start=false;/开始状态public Player(String ip,int p)IP=ip;/初始化 IPPORT=p;/初始化端口desk=null;data=new Queue();/初始化消息队列public void setDesk(Desk d)/设置玩家桌号的方法desk=d;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 编程 应用 实例 03
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内