Java语言程序课程设计报告资料_第1页
Java语言程序课程设计报告资料_第2页
Java语言程序课程设计报告资料_第3页
Java语言程序课程设计报告资料_第4页
Java语言程序课程设计报告资料_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、Java 语言程序课程设计报告题 目:手机网络游戏( J2ME+Servlet 实现) 项目组成员: 100511117 陈田澍100511118 代 倩100511110 李永平100511111 王长玉100511108 李 明100511109 李树南经济管理学院2014年 1 月内容1. 需求分析目前手机网络游戏的迅速崛起, 让游戏运营商们又发现了一个新的发展 “特 区”,期待着能继网游之后的经济增长点。手游为广大手机用户带来了一种全新 的休闲方式, 他们可以随时随地利用手游放松紧张的情绪, 缓解学习、工作生活 中的种种压力。从手机游戏依托的技术平台来看, 目前 Java 手机游戏保持

2、很高的增长速度。 手机游戏将是未来游戏市场的主要发展方向, 只要拥有一部手机, 就可以进入到 全新的掌上游戏世界。 游戏正成为无线增值服务的主力军, 各游戏开发商早已洞 察到这一点,通信公司 2.5G 和 3G 通信技术的发展,给手机用户带来了高达每 秒 384K 的移动带宽,将语音、图像、视频有序地结合起来,给手机用户带来了 更加丰富多彩的多媒体娱乐服务, 借此东风, 各游戏开发商将进入全新的无线网 络游戏时代。市场潜力巨大。手机版象棋游戏采用 MIDP1.0 开发,在低端手机上运行的同时,保证了高 端手机的兼容性,其市场发展空间巨大。伴随着中国移动 GPRS 和中国联通 CDMA1X 数据

3、业务的开展,手机游戏将是 3G 数据业务的一个重要的应用领域。迅达科技有限公司是一家手机游戏运营商, 公司已经从网络版的手机游戏运 营商中获取了大量的资金, 现在总结了玩家的反馈信息, 发现游戏玩家需要一些 小型的休闲类游戏,例如纸牌、象棋、围棋和一些智利游戏等。现需要委托其他 单位开发一个网络版的手机象棋游戏。2. 系统概要设计通过与迅达科技有限公司的沟通和需求分析,需要系统具有以下功能:( 1) 系统操作简单,界面友好。( 2) 运行速度快,保证程序的稳定性。( 3) 支持多人操作。( 4) 支持移动网络连接。( 5) 以 HTTP 协议通信。 通过以上的系统功能,以及根据需求分析的描述以

4、及用户的沟通,制定的系统目标如下: 界面设计简洁、友好、美观大方,保证直接上手便可游戏。 操作简单、快捷方便。 规则简单、方便游戏者进行游戏。 实现理智规则判断。 支持大型Web服务器,以Http协议通信。 向 PC 端开发靠拢,为以后 PC 与手机的互联奠定基础。关于走棋和吃子对局时,由执红棋的一方先走,双方轮流各走一着,直至分出胜、负、和, 对局即终了。 轮到走棋的一方, 将某个棋子从一个交叉点走到另一个交叉点, 或 者吃掉对方的棋子而占领其交叉点, 都算走一着。 双方各走一着, 称为一个回合。 各种棋子的走法中国象棋是我国国粹,历史悠久,普及流行。下棋双方根据对棋局形势的 理解和对棋艺规

5、律的掌握,调动车马,组织兵力,协调作战。在棋盘这块特定的 战场上,进行着象征性的军事战斗。以下对游戏规则作简要说明。(1) 棋子 象棋中棋子共三十二个,分为红黑两组,各十六个,由对弈双方各执一组, 兵种是一样的,分为七种。红方:帅、仕、相、车、马、炮、兵。黑方:将、士、象、车、马、炮、卒。其中帅与将、仕与士、相与象、兵与卒的作用完全相同,仅仅是为了区分红 棋和黑棋。在本设计中为了简便,棋子只有将、士、象、车、马、炮、兵,区分 仅仅为颜色不同。(2) 棋盘棋子活动的场所, 叫做棋盘。 在长方形的平面上, 绘有九条平行竖线和十条 平行的横线相交组成,共九十个交叉点,棋子就摆在这些交叉点上。中间第五

6、、 第六两横线之间未画竖线的空白地带, 称为河界。 整个棋盘就以河界分为相等的 两部分,两方将、帅坐镇。画米字方格的地方,叫做九宫。(3) 将或帅移动范围:它只能在九宫内移动。移动规则:它每一步只可以水平或垂直移动一点。(4) 士 移动范围:它只能在九宫内移动。 移动规则:它每一步只可以沿对角线方向移动一点。(5) 象 移动范围:河界的一侧。移动规则: 它每一步只可以沿对角线方向移动两点, 另外,在移动的过程中 不能够穿越障碍。(6) 马 移动范围:任何位置。 移动规则:每一步只可以水平或垂直移动一点, 再按对角线方面向左或者右 移动。另移动的过程中不能够穿越障碍。(7) 车 移动范围:任何位

7、置。 移动规则:可以水平或垂直方向移动任意个无阻碍的点。(8) 炮 移动范围:任何位置。移动规则: 移动起来和车很相似, 但它必须跳过一个棋子来吃掉对方的一个 棋子。(9) 兵 移动范围:任何位置。移动规则:每步只能向前移动一点。 过河以后, 它便增加了向左右移动的能 力,兵不允许向后移动。(10) 胜、负 帅(将)被对方吃掉。(11) 和 一方提议作和,对方同意。吃子 :任何棋子走动时, 如果目标位置上有对方的棋子, 就可以把对方的棋子拿 出棋盘,再换上自己的棋子(即 吃子 )3. 系统详细设计本系统服务器端包括消息接收和桌面管理,功能结构如下图所示。客户端包 括主窗体、游戏界面、消息处理等

8、模块。其功能结构图如下图所示。1.服务器端系统功能结构图2客户端系统功能结构构建开发环境,在开发手机游戏时,分别使用了以下软、硬件环境。(1)硬件平台:CPU:PM 800GHz。内存:256MB以上。 硬盘: 500MB 以上空间 显卡: 32MB 以上显存。(2)软件平台:操作系统: Windows2003(SP1)。JAVA 开发包: JDK 1.6。J2ME 开发包:Wireless Toolkit 2.5.2 for CLDC。分辨率:最佳效果1024 X 768像素。手机分辨率:最佳效果为240 X 292像素。关于象棋的规则和具体界面设计预览 象棋是一种双方对阵的竞技项目。棋子共

9、有三十二个,分为红黑两组,各有 十六个,由对弈的双方各执一组。兵种是一样的,分为七种:红方:红方有帅一个,仕、相、车、马、炮各两个,兵五个。黑方 : 黑方有将一个,士、象、车、马、炮各两个,卒五个。其中帅与将;仕与士;相与象;兵与卒的作用完全相同,仅仅是为了区别红 棋和黑棋而已。棋子活动的场所,叫作 棋盘 。在长方形的平面上,绘有九条平行的竖线和 十条平行的横线相交组成, 共有九十个交叉点, 棋子就摆在交叉点上。 中间部分, 也就是棋盘的第五, 第六两横线之间末画竖线的空白地带称为 “河界 ”。两端的中 间,也就是两端第四条到第六条竖线之间的正方形部位,以斜交叉线构成 “米” 字方格的地方,叫

10、作 “九宫”(它恰好有九个交叉点) 。整个棋盘以 “河界 ”分为相等的两部分。为了比赛记录和学习棋谱方便起见, 现行规则规定:按九条竖线从右至左用中文数字一-九来表示红方的每条竖线,用阿拉伯数字仔睐表示黑方的每条竖线。对弈开始之前,红黑双方应该把 棋子摆放在规定的位置。任何棋子每走一步,进就写 “进”,退就写 “退”,如果像 车一样横着走,就写 “平”。任何棋子在走动时, 如果乙方棋子可以到达的位置有对方的棋子, 就可以把 对方棋子拿出棋盘 (称为吃子 )而换上自己的棋子。只有炮的 吃子方式与它的走 法不同:它和对方棋子之间必须隔一个子(无论是自己的还是对方的) ,具备此 条件才能 吃掉 人家

11、。一定要注意,中隔一个棋子,这个棋子俗称 “炮架子 ”。帅和将被吃或不能动弹即输棋。下面是具体的界面:用户运行程序后,依次单击按钮,进行桌面选择,如图下所示。然后确定“落座”后,进入象棋界面如下图所示:一尸o Sun o Sun SHUFTSPAtE*11 2牡I叫4qhi15趴6mn7PW4 1| |象棋界面选择桌面单击“开始”按钮,即可进行下棋操作。通上手机上的“ 按钮,进行对 象棋的上、下、左、右进行选择控制。中间的铵钮,是用来选择棋子和下棋子用 的。4系统实现4.1创建Player公共类Player类代表玩家对象。每个玩家都有不同的属性,这些属性用来表示唯一的玩家。在现实生活中没有完全

12、相同的两个人物,而游戏中也应该如此,否则无法保证游戏的数据安全。要做到区分不同的玩家,就必须为每个玩家添加IP地址和端口属性。另外,玩家会坐在不同桌子的不同座位上、有不同颜色的棋子、 独立的消息队列和开始状态等,这些都需要声明对应的属性并记录属性记录状态。关键代码如下:package com.lzw; public class Player private int ID = 1; private String IP = ; private int PORT = 9999; private Desk desk; public Queue data; private String Color =

13、; public boolean start = false; public Player(String ip, int p)IP = ip; PORT = p; desk = null;data = new Queue(); public void setDesk(Desk d) desk = d; public Desk getDesk() return desk; public boolean equals(String ip) if (IP.equals(ip) return true;else return false; public boolean equals(Player p)

14、 if (IP.equals(p.getIP() & PORT = p.getPort() return true;else return false; public String getIP() return IP; public int getPort() return PORT; public void setID(int id) ID = id; public int getID() return ID;public boolean isStart() return start;public void init() start = false;data.clear();IP=;PORT

15、=0;public void reset() Color = ;start = false;public void start() start = true;public void setStart(boolean start) this.start = start;public String getColor() return Color;public void setColor(String color) Color = color;4.2 创建 Queue编写消息列队公共类Queue,该类负责储存服务器发送给玩家的消息, 当手 机客户端发出请求信息是, 服务器汇从该客户端对应的玩家对象的

16、消息队列中获 取消息,如果消息列队中没有消息, 那么手机客户端必须等待服务器围棋分配消 息。Queue 公共类遵循“先进先出”的存储结构,数据元素只能从队尾进入,从 队首取出。在队列中,数据元素可以任意增减,但数据元素的次序不会改变。每 当有数据元素从队列中被取出, 后面的数据元素一次向前移动一位。 所以,任何 时候从列队中读到的都是队首的数据。关键代码如下:package com.lzw;“先进先出” (LIFO) 的存储结构。数据元素只能从队尾进入,从队首取出。在 队列中, 数据元素可以任意增减, 但数据元素的次序不会改变。 每当有数据元素 从队列中被取出, 后面的数据元素依次向前移动一位

17、。 所以, 任何时候从队列中 读到的都是队首的数据。根据这些特点,对队列定义了以下六种操作: push(x) 向队列插入一个值为 x 的元素; pop() 从队列中取出一个元素; front() 从队列中读一个元素,但队列保持不变; empty() 判断队列是否为空,空则返回真; clear() 清空队列;search(x) 查找距队首最近的元素的位置,若不存在,返回 -1*/public class Queue extends java.util.Vector public class EmptyQueueException extends java.lang.RuntimeExceptio

18、n public EmptyQueueException() super();public Queue() super();public synchronized void push(Object x) super.addElement(x);public synchronized Object pop() /* 队列若为空,引发 EmptyQueueException 异常 */if (this.empty()throw new EmptyQueueException();Object x = super.elementAt(0); super.removeElementAt(0); ret

19、urn x;public synchronized Object front() if (this.empty()throw new EmptyQueueException();return super.elementAt(0);public boolean empty() return this.isEmpty();public synchronized void clear() super.removeAllElements();public int search(Object x) return super.indexOf(x);4.3 创建 Umpire 公共类服务器端的 Umpire

20、 公共类用于裁判游戏输赢、记录棋盘的数据。在 Desk 公共类中将调用Umpite类的moveChess方法更新棋盘数据的记录。类外该公共 类还定义了其他方法来更改棋盘数据,例如 init() 方法可以初始化棋盘数据到开 局状态。关键代码如下: package com.lzw;public class Umpire private int huihe;private int bigID;private int score;protected static int i, j;protected static int isRedWin = 1, isWhiteWin = 1;/ g2表示该谁走了,

21、后面那俩 顾名思义了private int point;public Umpire() huihe = 0;score = 0;point = new int 1,2, 3, 4, 5, 6, 7, 8, 9 ,/ 初始化 INT 数组 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 10, 0, 0, 0, 0, 0, 11, 0 , 12, 0, 13, 0, 14, 0, 15, 0, 16 , 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0,0, 0,0,0, 0, 28, 0, 29, 0, 30, 0, 31, 0, 32 , 0, 26

22、, 0, 0, 0, 0, 0, 27, 0 , 0, 0, 0,0, 0,0,0, 0,0 , 17, 18, 19, 20, 21, 22, 23, 24, 25 ;public void checkWin() / 判断输赢 isRedWin = 0;isWhiteWin = 0;for (i = 0; i 3; i+) for (j = 0; j 3; j+) if (point0 + i3 + j = 5) isRedWin+;for (i = 0; i 3; i+) for (j = 0; j 3; j+) if (point7 + i3 + j = 21) isWhiteWin+;

23、public void moveChess(int selectedY, int selectedX, int n, int m) pointselectedYselectedX = pointnm; pointnm = 0;checkWin();public void logHuihe() huihe+;public int getHuihe() return huihe;public void init() huihe = 0;score = 0;isRedWin = 1;isWhiteWin = 1;point = new int 1, 2, 3, 4, 5, 6, 7, 8, 9 ,/

24、 初始化 INT 数组 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 10, 0, 0, 0, 0, 0, 11, 0 , 12, 0, 13, 0, 14, 0, 15, 0, 16 , 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0 , 28, 0, 29, 0, 30, 0, 31, 0, 32 , 0, 26, 0, 0, 0, 0, 0, 27, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0 , 17, 18, 19, 20, 21, 22, 23, 24, 25 ;public int sco

25、re() return score;public void clearScore() score = 0;public void clearhuihe() huihe = 0;4.4创建Desk公共类服务器端的 Desk 公共类是游戏桌面的定义类,该类包含了游戏桌面编号、 玩家数量、游戏回合局等属性,另外该类还包含Umpire对象、Player对象、Server 对象等属性,其中 Server 对象是服务器的主程序,他负责信息的接收,发送和 处理等业务。Desk公共类的属性声明与初始化的关键代码如下:package com.lzw;import java.util.Vector;public

26、class Desk private int ID;/ 桌子 IDprivate Player players;/ 玩家数组private int NUM = 2;/ 玩家数量private Player banker = null; / 庄家private int bankerID = 0; / 庄家 IDprivate Umpire umpire;/ 算法private int game = 0; / 游戏局数private int score = 0;/ 分数 暂时没用到Server server;public Desk() game = 0;server = new Server();

27、umpire = new Umpire(); players = new PlayerNUM; banker = null;bankerID = 0;for (int i = 0; i NUM; i+) playersi = null;/*初始化*/public void init() banker = null; / 庄家 bankerID = 0; game = 0; umpire.init();public void reset() umpire.init();for(int i=0;iNUM;i+)playersi.reset();public void start() players

28、bankerID.setColor(red); players(bankerID+1)%NUM.setColor(white); sendMessage(playersbankerID, color:+playersbankerID.getColor();sendMessageToOther(playersbankerID,color:+players(bankerID+1)%NUM. getColor();sendMessage(playersbankerID, turn);public void moveChess(String message) int index0 = message.

29、indexOf(;);int index1 = message.indexOf(:);int index2 = message.indexOf(, index1 + 1);int index3 = message.indexOf(, index2 + 1);int index4 = message.indexOf(, index3 + 1);int seat = Integer.parseInt(message.substring(index0 + 1, index1);int selectedY = Integer.parseInt(message.substring(index1 + 1,

30、 index2);int selectedX = Integer.parseInt(message.substring(index2 + 1, index3); int n = Integer.parseInt(message.substring(index3 + 1, index4);int m = Integer.parseInt(message.substring(index4 + 1); umpire.moveChess(selectedY, selectedX, n, m); sendMessageToOther(playersseat, message);if (Umpire.is

31、WhiteWin = 0) sendMessage(playersbankerID, win,you); sendMessageToOther(playersbankerID, win); bankerID = (seat + 1) % NUM; reset(); else if (Umpire.isRedWin = 0) sendMessage(players(bankerID+1)%NUM, win,you); sendMessageToOther(players(bankerID+1)%NUM, win); bankerID = (seat + 1) % NUM; reset();pub

32、lic int getID() return ID;public void setID(int id) ID = id;public Player getBanker() return banker;public void setBanker(Player banker) this.banker = banker;public int getGame() return game;public boolean isReady() / 本桌是否坐满,并且都开始 for (int i = 0; i = NUM)return false;return playerspos = null;public

33、int getBankerID() return bankerID;public int getPlayersCounter() / 获得玩家总数return NUM;public Player getPlayers() return players;public int getPlayerSeat(Player p) / 返回玩家座位for (int i = 0; i = NUM)return; playerspos = n;public void removePlayer(Player p) / 移除玩家 pfor (int i = 0; i NUM; i+) if (playersi =

34、 null) continue;else if (playersi.equals(p) playersi = null;public void sendMessageToAll(String mes) for (int i = 0; i NUM; i+) if (playersi != null) sendMessage(playersi, mes);public void sendMessageToOther(Player player, String message) for (int i = 0; i NUM; i+) if (playersi != null & !playersi.e

35、quals(player)sendMessage(playersi, message);public void sendMessage(Player p, String m) server.sendMessage(p, m);public void sendBankerInfo() sendMessageToAll(bankerInfo: + bankerID);public void sendScoreInfo() sendMessageToAll(scoreInfo: + score);public void overOneGame() init();5.系统测试从广泛意义上讲性能测试包括

36、:稳定性测试、负载能力测试和可扩展性测试等。在不同应用系统的性能测试中, 需要根据应用系统的特点和测试目的的不同来选择具体的测试方案, 本次手机网络游戏的性能测试主要是采用通常的稳定 性测试模式来执行的,逐步测试,查看应用系统在各种状况下的性能表现。正确性测试 ,输入用户实际相关数据以验证系统是满足需求规格说明书的 要求;测试用例中的测试点应首先保证要至少覆盖需求规格说明书中的各项功 能,并且正常。取某些特例进行检测,看是否能出现预期的效果。容错性(健壮性)测试 ,程序能够接收正确数据输入并且产生正确(预期) 的输出, 输入非法数据(非法类型、不符合要求的数据、溢出数据等) ,程序应 能给出提

37、示并进行相应处理。把自己想象成一名对产品操作一点也不懂的客户, 在进行任意操作。增大系统适用范围。接口间测试: 测试各个模块相互间的协调和通信情况, 数据输入输出的一致 性和正确性。数据库测试: 依据数据库设计规范对软件系统的数据库结构、数据表及其 之间数据调用关系进行测试。错误推测:主要是根据测试经验和直觉, 参照以往的软件系统出现错误之处。 可理解(操作)性: 理解和使用该系统的难易程度(界面友好性) 。 6.课程设计总结经过两周的课程设计根据老师所给的代码, 我们实现了中国象棋的算法, 完 成了课程设计的要求,这期间我经历了不少困难,比如在开始搭建 JAVA 环境时 会遇到各种各样的问题,例如无法安装 JDK、Wireless Toolkit 等等。比如有的程 序在调试过程中都有错误, 我们通过学过的知识将错误一一改正, 可是运行出来 没有结果。 还有就是怎样实现棋子的走动, 炮的走棋规则怎样执行等等。 但是最 终在同学和老师的帮助下,把问题一个一个的解决了最终实现了中国象棋的算 法。本次 Java 课程设计我们这组做的课题

温馨提示

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

最新文档

评论

0/150

提交评论