教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 教育文库 >

疯狂java实例-第15章 仿QQ游戏大厅(3)

来源:网络收集 时间:2026-08-31
导读: 15.3 建立五子棋游戏大厅 我们已经在15.2中编写了游戏大厅的基本框架,那么本小节开始编写一个五子棋的游戏大厅。在编写游戏大厅框架的时候,就定下规则,必须为游戏建立一个入口类。另外,五子棋的游戏大厅中还包

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字,全部文档内容请下载后查看。喜欢就下载吧 ……

疯狂java实例-第15章 仿QQ游戏大厅(3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/279657.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)