APP下载

基于Java的国际象棋游戏系统设计与实现

2018-11-19覃建运李春青

软件导刊 2018年11期
关键词:服务端人机聊天

覃建运,李春青

(广西民族师范学院 数学与计算机科学学院,广西 崇左 532200)

0 引言

国际象棋作为一款著名的棋牌类游戏,不仅拥有悠久的历史和大规模玩家群体,还具有丰富的娱乐性、健脑性和交友性[1]。众多玩家群体在此具有广阔的交友空间,然而受地域限制,玩家以棋会友的梦想难以实现。随着计算机技术的发展,棋牌类游戏得到了快速发展,不仅拥有更加丰富的娱乐性,还打破了地域限制,玩家能交到更多好友。

Java作为一种面向对象设计的编程语言,因其可移植性、简洁、安全等特点,成为世界上最受欢迎的编程语言之一,深受众多编程人员喜爱[2-4]。本文在研究国际象棋规则基础上,结合Java Socket编程技术[5]、Java Swing技术[6]和人机博弈算法[7-9]等,设计并实现一个具有人机博弈、在线博弈、残局闯关和好友互动等功能的国际象棋博弈系统。

1 总体设计

1.1 网络通信设计

游戏网络通讯部分采用C/S模式,并结合Java Socket技术实现客户端与服务端之间的通信[10]。游戏需实现多用户同时在线,因此服务端需具有多客户端同时连接功能。首先在服务端建立ServerSocket类继承Thread类,并创建ServerSocket对象SS,采用线程实现对客户端连接请求的持续监听,即循环调用ServerSocket的accept()方法。当服务器接收到客户端的连接请求时建立专线连接,建立连接后的两个scoket将在一个单独的线程上进行信息交互。

1.2 界面设计

游戏界面采用Java Swing技术,分为登录界面、用户界面、游戏界面等。登录界面为玩家提供登录和注册功能,用户界面为玩家提供玩家互动和功能选择模块,玩家在用户界面点击功能选项进入相应的功能模块或游戏界面。

1.3 数据库设计

用户在与平台进行交流过程中,需要运用数据库进行语言传递,数据库是数据存储和数据分析的基础。本文数据库设计采用E-R图[11]方式,将用户需求、平台内容建设等相对抽象的概念转化为相对具象的概念模式[12],再由E-R图呈现。 在逻辑设计过程中,E-R图在Java的要求下需要转变为具体的DBMS产品[13]支持数据模型,并根据设计的功能模块分别形成符合模块要求的基本表。在基本表中对模块的不同功能设置不同字段,再借助数据类型使模块功能完整。

在SQL Server中建立ChessDB数据库,并根据ER图设计结果在ChessDB数据库中建立UserInformation表、Friend表、Count表、Chess表等。为方便数据库操作,本文新建了SQLDBO类,在SQLDBO类中运用JDBC技术实现服务端与服务器连接[14],在Operate类中实现对数据库的增删改查操作。服务端通过调用Operate类实现对数据库的操作。 玩家在客户端与数据库服务器端的交互过程如图1所示。

图1 客户端与数据库服务器端交互过程

1.4 功能设计

根据需求分析结果确定游戏系统功能,如图2所示。

图2 系统功能

关键模块功能如下:

(1)注册功能为玩家提供便捷的游戏账号注册通道。注册时玩家须填写用户名即玩家游戏昵称和密码,确认密码后点击“注册”完成注册;游戏玩家用户名唯一,不能重复注册,成功后不可更改。

(2)登陆功能是网络游戏必备的功能,该功能实现客户端与服务端连接。玩家须正确输入游戏账号和密码,客户端将账号信息发送至服务端,服务端将信息与数据库内的数据进行比对,验证成功后方可登陆至游戏界面。

(3)在线对战分为普通模式和残局模式。普通模式为完整棋盘,残局模式由服务器为双方玩家随机抽取残局棋盘,两种模式均通过服务器为玩家随机匹配对手,玩家下载模式后可进入匹配队列服务器为其匹配相应模式下的玩家,匹配成功后方可进行游戏。

(4)人机对战功能基于人机博弈算法Alpha_Beta[15]实现,游戏玩家可通过搜索算法功能与计算机进行博弈,从而达到锻炼棋技的目的。

(5)闯关模式是人机对战的特殊玩法,该功能通过将收录的残局棋谱设置成关卡形式供玩家选择,不同关卡代表不同的残局。在该模式下玩家将与计算机进行对战,在对战中玩家获胜后方能解锁下一关卡。

(6)玩家互动功能分为聊天、查找、挑战和好友功能,其中聊天室功能[16]分为多人文字聊天、一对一文字聊天、一对一网络语音聊天;查找功能为游戏玩家提供简单的玩家搜索功能;挑战功能模块为玩家提供挑战功能,通过该功能玩家能对任意在线空闲玩家发起挑战;好友功能拥有添加和删除功能,方便玩家对好友进行管理。

(7)我的棋谱功能模块拥有棋谱上传、下载、分享、删除、查看功能,为游戏玩家提供简单的棋谱管理功能。

(8)排行榜模块通过对游戏玩家的游戏数据进行统计,根据玩家的胜率排行。

2 游戏实现

2.1 游戏开发和运行环境

操作系统:Windows 7 64-bit,内存:4 GB RAM;开发工具:eclipse + jdk1.8+mysql2005;存储空间: 1GB 可用空间;环境需求:jdk1.8+mysql2005。

2.2 游戏主要算法

2.2.1 着法实现

着法实现原理:根据当前点击棋子的坐标和棋子类型,通过当前棋子的行棋规则生成一个可行路径数组,该数组保存当前棋子所在位置的所有合法着法[17]。着法主要代码如下:

getMovePos(String selectPiece, int[] startPos, Board board){

switch(selectPiece.charAt(1)){//判断当前点击的棋子类型

case 'b':

return 当前棋子可行路径

default:

return 空数组;

}

}

2.2.2 Alpha_Beta搜索算法实现

Alpha_Beta搜索算法原理:首先判断叶子节点是否为0或是否有玩家获胜,如果是则通过局面评估函数[18]返回估值,否则生成所有合法着法,遍历所有着法并逐个执行。递归调用alphabetaSearch,最后保留最大值,撤销执行着法并剪枝。在搜索算法中需要传递两个值alpha和beta,其中alpha表示搜索到的最好值,beta表示对于对方来说最坏的值,通过判断这两个值的关系结束搜索,从而达到剪枝目的[19]。Alpha_Beta搜索算法实现主要代码如下:

int alphabetaSearch(int depth, int alpha, int beta,boolean flag){

if (depth == 0||board.isWin()!='N')// board.isWin()//判断输赢N表示没有玩家获胜

return new BoardEvaluation(board, board.player).eval();//返回估值

ArrayList moves = this.getMovesModel(flag);//生成所有着法

for (Node node : moves) {//遍历所有着法

UpdatePiece(node);//移动棋子

if (flag) {

alpha=Math.max(alpha,alphabetaSearch(depth - 1, alpha, beta, false));//递归调用

}else{

beta= Math.min(beta, alphabetaSearch(depth - 1, alpha, beta, true)); //递归调用

}

Black();//撤销移动棋子

if (beta <= alpha) {//剪枝

break;

}

}

}

2.2.3 人机博弈算法实现

人机博弈算法原理:人机博弈算法是人机对战的灵魂,因此人机博弈算法的实现是人机对战玩法的重要组成部分。要实现人机博弈算法首先要实现棋子的着法,其次需要设置一个局面评估函数BoardEvaluation实现对棋局的评价,最后使用Alpha_Beta搜索算法搜索出最优着法[20]。人机博弈算法流程如图3所示。

图3 人际博弈算法流程

2.2.4 语音聊天功能实现

语音聊天功能实现原理:语音聊天需要实现聊天双方一对一专线连接,该功能模块涉及到语音信息的实时采集、传输和播放,因此新建语音捕捉类CaptureSound和语音播放类PlaySound。语音捕捉类CaptureSound实现Runnable接口,通过run方法实现麦克风信息的实时采集和发送;语音播放类PlaySound实现Runnable接口,通过run方法实时接收语音信息并解析播放语音信息[21]。语音聊天功能实现代码如下:

AudioFormat format =new AudioFormat(8000,16,2,true,true);//设置音频格式

byte[] data = new byte[1024];

//语音捕捉及其发送

DataLine.Info info = new DataLine.Info(TargetDataLine.class,format);

BufferedOutputStream OutputStream=new BufferedOutputStream(SC. getOutputStream());//封装

TargetDataLine line = (TargetDataLine) AudioSystem.getLine(info);

line.open(format, line.getBufferSize());

line.start();

int num=line.read(data, 0, 1024);//将语音流写入byte数组

OutputStream.write(data, 0, num);//将数组写入网络流

//语音接收及其播放

InputStream=new BufferedInputStream(new AudioInputStream(SC.getInputStream(),

format,2147483647));

DataLine.Info info = new DataLine.Info(SourceDataLine.class,format);

line = (SourceDataLine) AudioSystem.getLine(info);

line.open(format, bufSize);

line.start();

int num = InputStream.read(data); //将解码后的音频流写入byte数组

line.write(data, 0,num);//播放音频

2.3 游戏系统运行测试

游戏客户端与服务端均在Window系统上对游戏基本功能、各功能模块运行状况进行测试,结果显示游戏运行状况良好、基本功能完善、各功能模块运行正常。

3 结语

本文国际象棋系统采用Java技术、SQL2005数据库实现。完成的主要功能有人机博弈、在线博弈、闯关模式、玩家互动、残局模式、棋盘的查看、分享和保存、文字聊天和语音聊天、多人聊天、排行榜、登录和注册等,为国际象棋玩家提供了一个具有丰富娱乐性和交友性的对战平台。游戏的实时语音聊天使玩家能在游戏中与对方进行语音对话,为游戏增添了趣味。但本国际象棋游戏还存在界面不够美观、消息提醒功能不够完善、玩家无法及时获取聊天信息等问题,后续需实现消息盒子功能,对人机博弈算法进行深入研究及完善。

猜你喜欢

服务端人机聊天
从内到外,看懂无人机
云存储中基于相似性的客户-服务端双端数据去重方法
新时期《移动Web服务端开发》课程教学改革的研究
在Windows Server 2008上创建应用
敞开门聊天
“人机大战”人类智慧遭遇强敌
未来深空探测中的人机联合探测
摸清黑客套路防范木马侵入