Java游戏编程原理与实践教程 教学课件 ppt 作者 陈锐 夏敏捷 葛丽萍 第16章 网络象棋游戏

上传人:E**** 文档编号:89382855 上传时间:2019-05-24 格式:PPT 页数:19 大小:252KB
返回 下载 相关 举报
Java游戏编程原理与实践教程 教学课件 ppt 作者  陈锐 夏敏捷 葛丽萍 第16章  网络象棋游戏_第1页
第1页 / 共19页
Java游戏编程原理与实践教程 教学课件 ppt 作者  陈锐 夏敏捷 葛丽萍 第16章  网络象棋游戏_第2页
第2页 / 共19页
Java游戏编程原理与实践教程 教学课件 ppt 作者  陈锐 夏敏捷 葛丽萍 第16章  网络象棋游戏_第3页
第3页 / 共19页
Java游戏编程原理与实践教程 教学课件 ppt 作者  陈锐 夏敏捷 葛丽萍 第16章  网络象棋游戏_第4页
第4页 / 共19页
Java游戏编程原理与实践教程 教学课件 ppt 作者  陈锐 夏敏捷 葛丽萍 第16章  网络象棋游戏_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《Java游戏编程原理与实践教程 教学课件 ppt 作者 陈锐 夏敏捷 葛丽萍 第16章 网络象棋游戏》由会员分享,可在线阅读,更多相关《Java游戏编程原理与实践教程 教学课件 ppt 作者 陈锐 夏敏捷 葛丽萍 第16章 网络象棋游戏(19页珍藏版)》请在金锄头文库上搜索。

1、Java游戏编程原理与实践教程,主编 陈锐 夏敏捷 人民邮电出版社,第16章 网络中国象棋,本章介绍Java下的基于UDP编程方法制作的网络中国象棋。 1、棋盘 棋子活动的场所,叫做“棋盘“,在长方形的平面上,绘有九条平行的竖线和十条平行的横线相交组成,共九十个交叉点,棋子就摆在这些交叉点上。中间第五、第六两横线之间未画竖线的空白地带,称为“河界“,整个棋盘就以“河界“分为相等的两部分;两方将帅坐镇、画有“米“字方格的地方,叫做“九宫“。 2、棋子 象棋的棋子共三十二个,分为红黑两组,各十六个,由对弈双方各执一组,每组兵种是一样的,各分为七种: 红方:帅、仕、相、车、马、炮、兵 黑方:将、士、

2、象、车、马、炮、卒 其中帅与将、仕与士、相与象、兵与卒的作用完全相同,仅仅是为了区分红棋和黑棋。,网络中国象棋界面,16.2 关键技术,UDP协议的全称是用户数据报(User Datagram Protocal),在网络中它与TCP协议一样用于处理数据报。在OSI模型中, UDP位于第四层传输层,处于IP协议的上一层。UDP有不提供数据报分组、组装以及不能对数据报排序的缺点。也就是说,当报文发送之后,是无法得知其是否安全完整到达的。 本章基于UDP编程方法制作的网络中国象棋 使用包下的DatagramSocket和DatagramPacket类,可以非常方便地控制用户数据报文。下面就对这两个类

3、进行介绍。,棋盘,16.2 关键技术,DatagramPacket类 DatagramPacket类用于处理报文,它将Byte数组、目标地址和目标端口等数据包装成报文或者将报文拆卸成Byte数组。应用程序在产生数据报时应该注意,TCP/IP规定数据报文大小最多包含65507个,通常主机接收548个字节,但大多数平台能够支持8192字节大小的报文。 DatagramPacket的常用方法有: getAddress()、setAddress(InetAddress) 得到、设置数据报地址。 getDate()、setDate(byte buf) 得到、设置数据报内容。 getLength()、se

4、tLength(ing length) 得到、设置数据报长度。 getPort()、setPort(int port) 得到、设置端口号。,16.2 关键技术,DatagramSocket类 DatagramSocket类在客户端创建数据报套接字与服务器端进行通信连接,并发送和接受数据报套接字。虽然有多个构造方法可供选择,但创建客户端套接字最便利的选择是DatagramSocket()函数,而服务器端则是DatagramSocket(int port)函数。如果未能创建套接字或绑定套接字到本地端口,那么这两个函数都将抛出一个SocketException对象。一旦程序创建了DatagramSo

5、cket对象,那么程序分别调用send(DatagramPacket p)和 receive(DatagramPacket p)来发送和接收数据报。,16.2 关键技术,DatagramSocket类 常用方法: connect(InetAddress address, int port) 连接指定地址。 disconnect() 断开套接字连接。 close() 关闭数据报套接字。 getInetAddress() 得到套接字所连接的地址。 getLocalAddress() 得到套接字绑定的主机地址。 getLocalPort() 得到套接字绑定的主机端口号。 getPort() 得到套接

6、字的端口号。 reseive(DatagramPacket p) 接收数据报。 send(DatagramPacket p) 发送数据报。,16.3 网络中国象棋设计思路,16.3.1棋盘表示 棋盘表示就是使用一种数据结构来描述棋盘及棋盘上的棋子,我们使用一个二维数组Map。一个典型的中国象棋棋盘是使用 9 10 的二维数组表示。每一个元素代表棋盘上的一个交点。一个没有棋子的交点所对应的元素是-1。一个二维数组Map保存了当前棋盘的布局。当Mapx,y=i时说明此处是棋子i,否则-1此处为空。程序中下棋的棋盘界面使用如图16-1所示图片资源。,棋盘,16.3 网络中国象棋设计思路,16.3.2

7、 棋子表示,棋子设计相应的类,每种棋子图案使用对应的图片资源如图 。 为设计程序方便,将32个棋子对象赋给了数组chess。chessi中下标i的含义是:如果i小于16,那么说明它属于黑方的棋子,否则是红方的棋子。这样就可以得到我们所需要的全部象棋棋子了。黑方对应的是 0至15,红方则用 16至31。,16.3 网络中国象棋设计思路,16.3.2 棋子表示,棋子设计相应的类,每种棋子图案使用对应的图片资源如图 。 为设计程序方便,将32个棋子对象赋给了数组chess。chessi中下标i的含义是:如果i小于16,那么说明它属于黑方的棋子,否则是红方的棋子。这样就可以得到我们所需要的全部象棋棋子

8、了。黑方对应的是 0至15,红方则用 16至31。,16.3 网络中国象棋设计思路,16.3.3 走棋规则 对于象棋来说,有马走日,象走田等一系列复杂的规则。走法产生是博弈程序中一个相当复杂而且耗费运算时间的方面。不过,通过良好的数据结构,可以显著地提高生成的速度。 程序中IsAbleToPut(firstchess, x, y)函数实现判断是否能走棋返回逻辑值,这代码最复杂。其中参数含义如下: firstchess代表走的棋子对象,参数x,y代表走棋的目标位置。走动棋子原始位置(oldx,oldy)可以通过firstchess.pos.x获取原x坐标oldx,firstchess.pos.y

9、获取原y坐标oldy。,16.3 网络中国象棋设计思路,16.3.3 走棋规则 IsAbleToPut(idx, x, y)函数实现走棋规则判断: 例如“将”或“帅”走棋规则,只能走一格,所以原x坐标与新位置x坐标之差不能大于1,GetChessY(idx )获取的原y坐标与新位置y坐标之差不能大于1。 if (Math.Abs(x - oldx) 1 | Math.Abs(y - oldy) 1) return false; 由于不能走出九宫,所以x坐标4,5,6且 1 6 | (y 3 其余的棋子判断方法类似,这里不再一一介绍。,16.3 网络中国象棋设计思路,16.3.3 走棋规则 Is

10、AbleToPut(idx, x, y)函数实现走棋规则判断: 例如“将”或“帅”走棋规则,只能走一格,所以原x坐标与新位置x坐标之差不能大于1,GetChessY(idx )获取的原y坐标与新位置y坐标之差不能大于1。 if (Math.Abs(x - oldx) 1 | Math.Abs(y - oldy) 1) return false; 由于不能走出九宫,所以x坐标4,5,6且 1 6 | (y 3 其余的棋子判断方法类似,这里不再一一介绍。,16.3.5 通讯协议设计,(1)联机功能 join| 用户如果联机则发此命令,并处于不断接受对方联机的状态。 (2)联机成功信息conn| 收

11、到对方联机命令,发出此联机成功信息。 (3)认输信息lose | 如果游戏者认输信息,则发此命令。 (4)对方棋子移动信息move| idx, x, y 其中:棋子移动的目标位置坐标(x,y),棋子移动的起始位置坐标(old_x,old_y)可以从棋盘布局Map中获取;idx是被移动棋子的数组索引号。 注意本程序在传递棋子移动信息时,这里我们采取了个小技巧,在发送数据的时候我们把坐标再颠倒(把自己的棋盘颠倒)。即(x,y)坐标以(10-x),(11-y) 坐标发给对方。 (5)游戏结束 succ|+赢方代号 (赢了此局) (6)表示退出游戏quit|,16.4 网络中国象棋实现的步骤,16.4

12、.1 设计棋子类(chess.java) 棋子类的类图如图16-3所示。棋子类代码中首先定义棋子所属玩家、坐标位置、棋子图案、棋子种类成员变量。,16.4 网络中国象棋实现的步骤,16.4.2 设计棋盘类(ChessBoard.java) 棋盘类是游戏实例,首先定义一个数组chess存储双方32个棋子对象。二维数组Map保存了当前棋盘的棋子布局,当Mapx,y=i时说明此处是棋子i,否则-1此处为空。 用户走棋时,首先须选中自己的棋子(第1次选择棋子),所以有必要判断是否单击成对方棋子了。如果是自己的棋子,则firstChess2记录用户选择的棋子,同时棋子被加上黑色框线示意被选中。 当用户选

13、过己方棋子后,单击对方棋子(secondChess2记录用户第2次选择的棋子),则是吃子,如果将或帅被吃掉,则游戏结束。当然第2次选择棋子有可能是用户改变主意,选择自己的另一棋子,则firstChess2重新记录用户选择的己方棋子。 当用户选过己方棋子后,单击的位置无棋子,则处理没有吃子的走棋过程。调用IsAbleToPut(CurSelect, x, y)判断是否能走棋,如果符合走棋规则,则发送此步走棋信息。,16.4 网络中国象棋实现的步骤,16.4.2 设计棋盘类(ChessBoard.java) 棋盘类是游戏实例,首先定义一个数组chess存储双方32个棋子对象。二维数组Map保存了当

14、前棋盘的棋子布局,当Mapx,y=i时说明此处是棋子i,否则-1此处为空。 用户走棋时,首先须选中自己的棋子(第1次选择棋子),所以有必要判断是否单击成对方棋子了。如果是自己的棋子,则firstChess2记录用户选择的棋子,同时棋子被加上黑色框线示意被选中。 当用户选过己方棋子后,单击对方棋子(secondChess2记录用户第2次选择的棋子),则是吃子,如果将或帅被吃掉,则游戏结束。当然第2次选择棋子有可能是用户改变主意,选择自己的另一棋子,则firstChess2重新记录用户选择的己方棋子。 当用户选过己方棋子后,单击的位置无棋子,则处理没有吃子的走棋过程。调用IsAbleToPut(C

15、urSelect, x, y)判断是否能走棋,如果符合走棋规则,则发送此步走棋信息。,16.4 网络中国象棋实现的步骤,16.4.2 设计棋盘类(ChessBoard.java) 当用户联机成功后,NewGame(short player)根据玩家的角色(黑方还是红方),InitChess()初始棋子布局,布局时按黑方棋子在上,红方棋子在下设计。如果玩家的角色是黑方,为了便于玩家看棋,将所有棋子对调,即黑方棋子在下,红方棋子在上。布局后并将所有棋子,棋盘重画显示。 read()方法不断侦听本机设定的端口,得到对方发送来的信息,根据自己定义的通信协议通信中传送的是“输赢信息”,“下的棋子位置信息”,“认输”等信息而分别处理。,16.4 网络中国象棋实现的步骤,16.4.3 设计游戏窗体(Frmchess.java) 游戏窗口类Frmchess实现游戏全部功能,继承JFrame组件实现的。是由上方Panel1、中间Panel2和下方的Panel3组成。上方Panel1仅仅显示“帅”字图片。中间Panel2是游戏区,是棋盘类ChessBoard对象,实现游戏走棋功能。下方的Panel3添加了 “认按钮输”、“开始”按钮及输入对方IP、端口的文本框。,初始界面,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号