Java 程序设计实验报告
题 目 网络五子棋游戏
20xx 年 5 月 16 日
一、实验目的
1、熟练掌握基本网络编程技术。
2、掌握 Swing 图形用户界面编程。
3、掌握多线程编程的基本原理,能使用多线程设计服务器端程序。
4、培养独立查找资料,并解决问题的能力
二、实验任务
网络五子棋游戏
必做部分:
(1)服务器端为多线程,当判断有偶数个用户连接时,方可开始游戏。
(2)先连接的客户执黑棋,先下。另一客户执白棋。
(3)双方交替下棋,由服务器端程序判断客户本次下棋步骤是否有效,仅将有
效的下棋步骤传递给双方。
(4)客户端程序负责本地下棋界面的显示工作,与服务器通信,并处理相应的
鼠标事件。
(5)下棋胜负由客户端自行判定。提供客户退出按钮,点击按钮,将退出游戏。
选作部分:
(1)由服务器端程序判定游戏胜利方,并终止游戏,向双方显示游戏胜利者信
息。
(2)提供玩家注册功能,并保存该玩家胜负局数信息、等级、中途逃逸次数等
信息。
(3)游戏初始化时,向双方显示玩家等级、逃逸次数等基本信息,玩家可选择
是否开始和对手的游戏。
三、开发工具与平台
使用 IDEA 编写代码,网络编程+多线程+swing+mysql。整体代码使用了 MVC
架构,数据库部分使用了 mybatis 框架运用注解开发简化操作。
四、设计思路
1、界面设计
Vision 包下是主要的视图,包括登录界面、大厅界面、游戏界面,还有专门处
理鼠标事件的类。
(LoginFrame 类)登录界面:监听“登录”、“注册”按钮,连接数据库判断用
户是否存在进行登录和注册,登录成功后进入大厅界面。
(GameLobby 类)大厅界面:主要是各个房间的标签,设计 12 个房间并添加图
片美化,各个房间的 JLabal 都有编号以及“进入房间的按钮”还会显示房间人
数,监听按钮向主服务器发送对应信息,主服务器解析后开启对应房间的房间服
务器并发送 socket 等待后续操作。
(FiveChess 类)游戏界面:包含返回大厅的菜单栏,此外还有五子棋盘和聊天
界面对应的两个 JPanel。玩家下棋、悔棋、聊天等都是向对应房间的服务器发
送信息,由房间服务器解析后对玩家双方的界面进行修改,例如下棋,a 下棋后
自己的界面更新,同时向房间服务器发送信息,房间服务器向 b 发送信息,b 用
户解析后更新界面。此外有棋子的图片,客户端收到下棋的指令就会调用
paintComponent()进行绘画。
因为棋盘和聊天游戏双方都是同一界面所以可以简化,客户端只需调用相同的界
面即可。
(CursorEvent 类)鼠标事件:存入鼠标的光标的图片,优化玩家体验,由于下
棋位置只能是棋盘交叉点,所以需要不断存取鼠标的相对坐标。
以上是主要的界面设计,其余都是一些美化,比如背景图还有字体等的设计,优
化用户的体验
2、逻辑设计(课题中的难点的解决方案)
难点 1:多客户访问同一服务端可能造成延迟,而且多用户访问同一房间会造成
数据不同步。
解决:对每个房间又新建一个房间服务器,而且每一个房间使用一个棋盘类
(Model 类),用户访问某个房间就与对应房间服务器进行连接并使用对应的棋
盘。使用数组存储每个房间的人数,并对该修改该数据的线程加锁,一旦房间人
数超过 2 就进入观战模式,同时通过判断房间人数确定该用户使用的棋子颜色。
难点 2:禁止用户在非自己的回合内下棋。
解决:客户端增加一个判断是否是自己回合的参数,黑方确定后先将该参数置
true,此后谁下完就置 false 并且另一用户的参数为 true。
难点 3:在界面中将棋子显示在棋盘的正确位置,并判断是否有玩家获胜。
解决:判断光标是否在棋盘内,再计算棋子与棋盘的相对位置,用(鼠标在组件
内的位置-棋盘边界+格子宽度/2)/格子宽度 记录棋子位置,就是将棋盘化为长、
宽都为 15 的数组,当玩家下棋后判断该棋子的 8 个方位同色棋子数,同一直线
上的数量相加判断是否超过 5。所以可用 hashmap 存储棋子坐标和颜色方便判断。