疯狂java实例-第15章 仿QQ游戏大厅(3)
15.3 建立五子棋游戏大厅
我们已经在15.2中编写了游戏大厅的基本框架,那么本小节开始编写一个五子棋的游戏大厅。在编写游戏大厅框架的时候,就定下规则,必须为游戏建立一个入口类。另外,五子棋的游戏大厅中还包括一系列的对象,包括桌子、位置等。我们将这些对象放到一个fivechess-commons的模块中。由于这些对象可能在客户端,也可能在服务器端使用到,因此我们将这些对象提取出来放到一个公共的模块中。
15.3.1 编写游戏大厅的对象
游戏大厅中最基本的单位就是桌子,但是每种游戏的游戏大厅都并不一致,例如斗地主游戏大厅中的桌子可能会有四个座位,而五子棋只需要两个座位,而且每个游戏都会有自己的玩家对象,这些玩家对象都包括不同的内容。新建一个ChessUser类,继承User类,该类代表一个五子棋玩家对象。
ChessUser包括以下属性:
//是否已经准备游戏 private boolean ready;
由于五子棋中每个桌子只有两个座位,因此我们为五子棋游戏新建一个Table对象来表示这个游戏的桌子对象。一个桌子中有两个座位,我们建立Seat对象来表示具体的某个座位。
Seat对象包括如下属性。
代码清单:code\fivechess-commons\src\org\crazyit\gamehall\fivechess\commons\Seat.java
//该座位的玩家
private ChessUser user; //座位的座标范围
private Rectangle range;
//座位边, 只能为本类的LEFT和RIGHT属性值 private String side; //座位宽度
public final static int SEAT_WIDTH = 30; //座位高度
public final static int SEAT_HEIGHT = 30; public final static String LEFT = "left"; public final static String RIGHT = "right";
Table对象包括如下属性。
代码清单:code\fivechess-commons\src\org\crazyit\gamehall\fivechess\commons\Table.java
//桌子图片在大厅中的开始X座标
疯狂java实例-第15章 仿QQ游戏大厅
private int beginX;
//桌子图片在大厅中的开始Y座标 private int beginY; //桌子的图片
private String tableImage; //桌子号
private int tableNumber; //默认的图片宽
public final static int DEFAULT_IMAGE_WIDTH = 140; //默认的图片高
public final static int DEFAULT_IMAGE_HEIGHT = 140; //该Table对应的范围 private Rectangle range; //左边的座位 private Seat leftSeat; //右边的座位
private Seat rightSeat;
这样,我们就定义了桌子和位置的对象,这里需要注意的是,位置并不需要知道自己属于哪张桌子,桌子对象中则提供了两个座位对象:leftSeat和rightSeat,表示一张桌子中只能有两个位置。Table与Seat对象都提供了range属性,表示桌子或者位置的图片在大厅中具体位置范围。
为Table对象提供一个构造器,在创建Table的时候,就需要同时创建左边与右边的座位对象,并且设置相应的坐标位置。
Table的构造器。
代码清单:code\fivechess-commons\src\org\crazyit\gamehall\fivechess\commons\Table.java
//创建桌子对象的时候就创建左右的Seat对象
this.leftSeat = new Seat(null, new Rectangle(getLeftSeatBeginX(), getLeftSeatBeginY(), Seat.SEAT_WIDTH, Seat.SEAT_HEIGHT), Seat.LEFT);
this.rightSeat = new Seat(null, new Rectangle(getRightSeatBeginX(), getRightSeatBeginY(), Seat.SEAT_WIDTH, Seat.SEAT_HEIGHT), Seat.RIGHT);
Seat对象的构造器。
代码清单:code\fivechess-commons\src\org\crazyit\gamehall\fivechess\commons\Seat.java
public Seat(ChessUser user, Rectangle range, String side)
这里需要注意的是,位置的具体位置由它所在的桌子确定。
15.3.2 服务器创建游戏大厅数组
确定了游戏大厅的几个对象后,我们就可以在服务器中创建游戏大厅的数组,五子棋游戏的服务器端在本章中使用的是fivechess-server模块,游戏大厅的几个对象都保存在fivechess-commons模块,因此fivechess-server模块会依赖于fivechess-commons模块。游戏大厅数组保存在服务器端,我们使用一个ChessContext的类来保存这些信息。
代码清单:code\fivechess-server\src\org\crazyit\gamehall\fivechess\server\ChessContext.java
//保存桌子信息
public static Table[][] tables = new Table[TABLE_COLUMN_SIZE][TABLE_ROW_SIZE]; static { //初始化桌子信息
tables = new Table[TABLE_COLUMN_SIZE][TABLE_ROW_SIZE]; int tableNumber = 0;
for (int i = 0; i < tables.length; i++) { for (int j = 0; j < tables[i].length; j++) {
疯狂java实例-第15章 仿QQ游戏大厅
}
}
}
Table table = new Table(Table.DEFAULT_IMAGE_WIDTH*i, Table.DEFAULT_IMAGE_HEIGHT*j, tableNumber); tables[i][j] = table; tableNumber++;
建立一个Table的二维数组,并在ChessContext类的初始化块中建立这个数组。就这样,在服务器端就保存了一个桌子的二维数组,当有新的玩家进入五子棋游戏大厅的时候,就将这个桌子的二维数组设置到Response的数据列表中,返回给所有的用户。对象与XML字符串进行互转的时候,尽量避免使用一些大对象,例如Image对象等,否则将对象转换成XML的时候,将生成大量的XML字符串,影响传输性能。
15.3.3 玩家进入游戏大厅
玩家通过登录界面,选择具体进入的某个游戏,就首先调用Game实现类的start方法。我们新建一个fivechess-client的模块,表示五子棋游戏大厅的客户端。按照之前的规则,提供游戏客户端,需要在MANIFEST.MF文件中声明一个Game-Class的属性,表示该游戏的入口类。下面为五子棋的游戏客户端提供一个入口类,实现Game接口。
代码清单:code\fivechess-client\src\org\crazyit\gamehall\fivechess\client\action\ChessGame.java
public void start(User user) { //得到进入游戏的玩家信息 }
ChessUser cu = convertUser(user); ChessClientContext.chessUser = cu;
//构造一次请求, 告诉服务器玩家进入大厅, 服务器响应处理类是LoginAction
Request req = new Request("org.crazyit.gamehall.fivechess.server.action.LoginAction", "org.crazyit.gamehall.fivechess.client.action.ClientInAction"); req.setParameter("user", cu);
//得到玩家的Socket并发送请求, 告诉服务器玩家进入了大厅 cu.getPrintStream().println(XStreamUtil.toXML(req));
ChessGame的start方法,首先将玩家对象(User)对象转换成一个五子棋玩家对象(ChessUser),再将当前的五子棋玩家对象设置到五子棋游戏的上下文对象中,最后,构造一次请求,发送到服务器,告诉服务器,新的玩家进入了五子棋游戏大厅。在以上代码中,声明了服务器处理类是服务器端的LoginAction,客户端处理类是ClientInAction。
当玩家发送了请求到服务器后,最先处理请求的是Game-Server模块,该模块将玩家的请求转发到具体的某个ServerAction实现类中,这里的LoginAction就 …… 此处隐藏:4041字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [教育文库]夜场KTV服务员的岗位职责及工作流程[1]
- [教育文库]企划、网络、市场绩效考核方案
- [教育文库]学党史、知党情、强党性--“党的基本理
- [教育文库]2016年高考物理大一轮总复习(江苏专版
- [教育文库]干部廉洁自律自查自纠的报告
- [教育文库]2010年北京大学心理学系拟录取硕士研究
- [教育文库]资金时间价值练习题及答案
- [教育文库]保护环境的心得体会
- [教育文库]英语角内容:英语趣味小知识
- [教育文库]档案收集与管理工作通知
- [教育文库]劳动规章制度范本范本
- [教育文库]高考物理一轮复习课后限时作业1运动的
- [教育文库]机械工艺夹具毕业设计195推动架设计说
- [教育文库]通用技术教学比赛说课稿2
- [教育文库]2018年四年级英语下册 Module 7 Unit 2
- [教育文库]第2章 宽带IP网络的体系结构
- [教育文库]九年级化学第五单元课题3《根据化学方
- [教育文库]小学英语六年级情态动词用法归纳
- [教育文库]甲级单位编制窑井盖项目可行性报告(立
- [教育文库]2016-2021年中国城市规划行业全景调研
- 高考英语听力十大场景词汇总结
- 全省领导班子思想政治建设座谈会会议精
- 人教版新课标高一英语提优竞赛试题 下
- 江西省2014年生物中考试题
- 长沙镇食品药品安全事故应急预案
- 《金刚石、石墨和C60》片段教学设计
- 福州教育学院(王旭东)
- 基于EDA音乐播放器的设计
- 9、古诗两首《夜书所见》《九月九日忆
- 小学语文课外阅读有效策略探讨
- 贵州文化产业发展成支柱产业的问卷调查
- 膀胱类癌的诊治体会(附3例报告)
- 发动机积碳产生的原因
- Configuring Code Composer Studio for
- 学生良好的心理素质如何培养点滴谈
- 46 电沉积法制备锂离子电池用硅-锂薄膜
- 美舍雅阁公司管理中各部门职责
- 去壳剥皮的小妙招
- 六自由度运动平台的仿真研究
- Pride and Prejudice(傲慢与偏见)




