基于Java实现的五子棋小游戏

极端

发布日期: 2021-07-11 10:27:19 浏览量: 123
评分:
star star star star star star star star star star
*转载请注明来自write-bug.com

摘 要

子棋的起源

五子棋,是一种两人对弈的纯策略型棋类游戏,亦称“串珠”、“连五子”是中国民间非常熟知的一个古老棋种。相传,它起源于四千多年前的尧帝时期,比围棋的历史还要悠久。亦有传说,五子棋最初流行于少数民族地区,以后渐渐演变成围棋并在炎黄子孙后代中遍及开来。

五子棋发展于日本,流行于欧美。容易上手,老少皆宜,而且趣味横生,引人入胜﹔不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。

传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为 19X19,棋子放置于棋盘线交叉点上。两人对局,各执一色,轮流下一子,先将横、竖或斜线的 5 个或 5 个以上同色棋子连成不间断的一排者为胜。因为传统五子棋在落子后不能移动或拿掉,所以也可以用纸和笔来进行游戏。

子棋的基本常识

与任何一种竞技棋一样,五子棋的每一局棋也分为三个阶段:开局,中局和残局。五子棋的开始阶段称为开局,或称布局。其开局阶段是十分短暂的,大约在七着与十几着之间。在这一阶段的争夺中,双方的布局,应对将对以后的胜负起着极为关键的作用。在开局阶段取得的形势好坏,主动与被动,先手与后手的优劣程度,往往直接影响中局的战斗。因此积极处理好开局和开局向中局的过渡十分重要。

五子棋是从一至五,逐渐布子,发展连系,同时运用限制和反限制的智慧,在连子的过程中为自己的棋子争得相对的主动权和优势,逐步扩展优势,或者从劣势转化为优势,击溃对方的防线,最后连五取胜或抓禁手取胜或迫使对方投子认负。

关键词:五子棋,游戏设计,Java 语言,人工智能

一、系统分析

1.1 可行性分析

如果问题缺少可行的解决办法,那么开发此游戏系统所花费的任何时间、资源经费都是一种浪费。通过对“番茄炒鸡蛋”版的五子棋人机对战游戏系统进行可行性分析,验证本系统发的任何问题都含有可行的解决办法,系统的具体开发都是建立在可行性分析的基础上的。

1.1.1 技术可行性

计算机硬件和软件技术的飞速发展,为游戏系统的开发提供了设备条件。当前在网络上有许多的五子棋软件可供借鉴参考,而且我自己也熟练掌握了 Java 语言在 eclipse 环境下的基本应用,因此本游戏在技术上是完全可行的。

1.1.2 操作可行性

本游戏适用于 Windows 操作系统上,需要在 eclipse 环境下,添加 Easyx 图形库进行运行测试。该游戏使用 Java 语言编写,具有很强的移植性,使其可以运行很方便,用户运行程序时只需要通过点击鼠标和辅助以键盘操作,根据提示执行相应的操作即可。

1.2 需求分析

  • 实现网络五子棋对弈功能

  • 实现悔棋,认输,求和等功能

  • 实现多人同时游戏功能。一方可以创建比赛,另一方加入比赛进行游戏

  • 实现输赢之后切换先后手的功能

用况描述

用况编号:001
用况名:用户登录
用况描述:用户根据自己的用户名和密码,登录到游戏
参与者:玩家,管理员
基本路径:;玩家登录游戏;输入用户名和密码;玩家提交输入信息;系统对用户的账号和密码进行有效性检查;系统记录并显示当前登录用户;玩家进行权限范围内的操作;系统允许进行系统权限内的相关操作
用况编号:002
用况名:五子棋
用况描述:网络五子棋对战
参与者:玩家
前置条件:五子棋系统正常运行
基本路线:;1.用户已登录;2.玩家创建比赛,进行对战;3.黑白子交替落子;4.一方连成五子即获得胜利;5.开始新的对局
用况编号:003
用况名:悔棋
用况描述:玩家在下棋过程中选择悔棋
参与者:玩家
前置条件:下棋中
基本路线:;双方玩家已进行游戏;一方玩家选择是否悔棋;另一方玩家同意或拒绝对方悔棋要求。;悔棋成功。退回到上一步或拒绝请求继续走子。
用况编号:004
用况名:求和
用况描述:玩家在下棋过程中选择求和
参与者:玩家
前置条件:下棋中
基本路线:;双方玩家已进行游戏;一方玩家选择是否求和;另一方玩家同意或拒绝对方求和要求。;求和成功回退上一步或拒绝请求继续走子。
用况编号:005
用况名:认输
用况描述:玩家在下棋过程中选择认输
参与者:玩家
前置条件:下棋中
基本路线:双方玩家已进行游戏;一方玩家选择是否认输;另一方玩家收到认输请求,获得胜利

抽象出三个具体的边界类

客户端

  • 用户主界面:用户登录游戏后的第一个界面,实现向其他功能界面的跳转

  • 游戏界面:关键界面,实现网络五子棋的功能

  • 说明界面:辅助界面,向玩家介绍有关游戏的相关情况及操作说明

  • 聊天界面:可与好友聊天

服务器端

  • 服务器界面:可以显示一些有关链接到本服务器上的客户端的一些信息

实体类

  • 棋子信息类:用于记录已下过棋子的信息

  • 服务器控制按钮类:其上只记录一些有关的功能按键。不参与具体操作,可进行自由修改

控制类

  • 客户端线程类:实现客户端与服务器之间通信

  • 棋子线程类:实现网络棋盘的绘制等有关棋盘的功能

  • 服务器线程类:实现服务器和客户端之间的通信信号处理

类的属性及方法

登录类
属性 描述
ID 用户账号
passward 用户账号密码
方法 描述
Check() 检验用户账号和密码是否正确
主页面
属性 描述
chessButton 跳转到象棋界面的按钮
chatButton 跳转到聊天界面的按钮
exitButton 退出程序的按钮
方法 描述
ChangeView 判断所点击的按钮转移到相对应的界面
游戏说明
属性 描述
gameInformation 游戏说明文字
backButton 返回到主页面的按钮
方法 描述
Back() 返回到主页面的方法
聊天
属性 描述
friendID 好友账号
chatString 聊天文本
chatButton 发送按钮
方法 描述
Connect() 连接到相应的账号进行聊天
客户端类
属性 描述
clientSocket 客户端套接口
inputStream 数据输入流
outputStream 数据输出流
chessClientName 用户名
host 主机地址
port 主机端口
isOnchess 判断是否在下棋
isGameConnected 判断是否在进行游戏
isCreator 判断是否为游戏创建者
isParticipant 判断是否为游戏加入者
userchessPad 用户下棋控制区
UserLIstPad 用户列表区
userControlPad 用户控制区
firpad 下棋区
方法 描述
client () 构建界面的构造方法
connectToServer() 连接服务器方法
actionPerformed() 客户端事件处理方法
客户端线程
属性 描述
firClient 子线程
方法 描述
ClientThread() 构造方法
dealWithMsg() 处理服务器发送来的信息并进行处理
run() 运行子线程
用户下棋控制区
属性 描述
regretButton 悔棋按钮
giveupButton 认输按钮
PeaceButton 求和按钮
方法 描述
ChessPad() 构造方法
用户控制区
属性 描述
ipInputted 服务器 IP 输入
connectButton 连接服务器按钮
createButton 创建游戏按钮
joinButton 加入游戏按钮
cancelButton 取消游戏按钮
exitButton 退出游戏按钮
方法 描述
UserControlPad() 构造方法
用户列表区
属性 描述
userList 用户列表区域
方法 描述
UserListPad() 构造方法
棋盘类
属性 描述
isMouseEnabled 悔棋按钮
isWinned 认输按钮
isGaming 求和按钮
chessX_POS 棋子的 X 轴坐标
chessY_POS 棋子的 Y 轴坐标
chessColor 棋子的颜色
chessBlackCount 白棋数量
chessWhiteCount 黑棋数量
chessSocket 棋子套接口
inputData 数据输入流
outputData 数据输出流
方法 描述
Pad() 构造方法
Connect Server() 连接到主机
SetVicStatus() 设置胜利棋盘状态
setLocation() 取得指定棋子位置
checkVicStatus() 判断一方获胜状态
Paint() 画棋盘
PaintFirPoint() 画棋子
paintNetFirPoint() 画网络棋盘
棋子类
属性 描述
padBelonged 棋子所属棋盘
方法 描述
Paint() 绘制棋子
棋子线程
属性 描述
curpad 子线程
方法 描述
dealWithMsg () 处理服务器发来信息
SendMessage() 向服务器发送消息

类图

类图说明

类名 描述 与其他类的关系
登录 输入用户名和密码登录 连接主面板
主面板 实现跳转到客户端,游戏说明,聊天等界面的中转界面 跳转到游戏说明,客户端,聊天
游戏说明 向用户介绍游戏步骤 连接到主页面
聊天 实现不同用户之间聊天 连接到主页面
客户端类 实现网络五子棋对战功能 使用用户下棋控制区,用户控制区,用户列表区,棋盘类,棋子类
客户端线程 实现客户端和服务器端的信息传递和相应处理 由客户端生成
用户下棋控制区 声明悔棋,求和,认输按钮 由客户端调用
用户控制区 声明创建游戏,加入游戏,放弃游戏,退出程序等按键 由客户端调用
用户列表区 显示连接到服务器的用户 由客户端调用
棋子类 声明有关棋子的信息 由客户端调用
棋盘线程类 处理有关传给棋盘的信息 由棋盘类生成
棋盘类 声明棋盘有关信息 由客户端调用

服务器端类图

登录类
属性 描述
ID 用户账号
passward 用户账号密码
方法 描述
Check() 检验用户账号和密码是否正确
服务器类
属性 描述
clearMsgButton 清空列表按钮
serverStatusButton 显示服务器状态按钮
closeServerButton 关闭服务器按钮
serverSocket 服务器端套接字
clientDataHash 将客户端套接口和输出流绑定
clientNameHash 将客户端套接口和客户名绑定
chessPeerHash 将游戏创建者和游戏加入者绑定
方法 描述
Server() 构造方法
createServer() 创建服务器方法
actionPerformed 服务器响应事件方法
服务器线程类
属性 描述
ClientSocket 服务器子线程
方法 描述
sendGamePermsg() 给客户端发送消息
DealMessage() 对用户端传来信息做出反应

类图说明

类名 描述 与其他类的关系
登录 登录界面 登录到服务器
服务器类 服务器面板相关控件 调用服务器线程
服务器线程 实现服务器和客户端之间信息传递 由服务器线程调用

1.2.1 数据流分析

结构化分析方法就是面向数据流自顶向下逐步求精进行需求分析的方法。通过可行性研究可以得到该系统的顶层数据流图。按照数据流图的层级划分,数据流图可以分为顶层数据流图,一层数据流图和二层数据流图。这里主要画出这三层数据流图。

玩家进入游戏界面之后根据执行相应的操作。首先是在在开始界面,玩家点击开始即可进入游戏界面,进入游戏界面后玩家需要进行连接 ip 服务器,之后玩家下棋再通过判断周围空的位置选择出落子的最优位置,进行下棋,获胜的一方分数就会自动先加 1 分。

1.2.2 系统功能需求

计分功能

计分功能主要是实现计算玩家和电脑分数的功能,在玩家和电脑进行对战时,双方每落一子对应的加 10 分。

判断输赢功能

判断输赢即玩家和电脑在游戏过程中累计得到的分数哪一方更高,最先连成五棋者,分数会比对方高 1 分,即高分者胜出。

输出分数功能

与计分功能不同的是,计分模块实现的是记录每落一子累计得所有分数,而输出函数功能是用来将玩家和电脑累计得所有分数在游戏界面上的对应位置显示出来。

二、2 系统设计

2.1 系统总体设计思想

玩家游戏顺序

  • 玩家首先登录到用户端主界面

  • 可通过用户端主界面进行网络对战

  • 通过用户端主界面进行查看游戏说明

  • 进入网络对战界面后开始对战,可以进行认输,悔棋,和棋等操作

  • 客户端对用户要求进行处理

  • 玩家退出登录

实现过程

使用 Java 语言进行编程。通过 gui 编程对边界类进行设计。添加响应事件处理。

其中 client 为用户端总体服务包。

其中 Main.java 为用户登录主界面,用户可通过该界面实现跳转到任意其他功能界面。Inform.java 为游戏说明界面。用户可以在此查阅有关该五子棋的操作说明。FIRClient.java 为用户下棋界面。通过调用 gui 包下三个界面以及 pad 包下的 FIRPad.java 类创建用户下棋界面。同时实现按键响应事件的功能。Chat.java 为用户聊天界面。可以在此与自己好友聊天并约一起下五子棋。ChatThread.java 为聊天线程,将聊天信息传递给服务器后再传递给好友,实现信息传递功能。FIRSocket.java 实现套接字功能,将用户的棋盘信息通过套接字传递给服务器,将整个传递的过程抽象化。

FIRClientThread.java 主要用来和服务器端相连并处理服务器传来的信号事件并向服务器端发出一些信息以实现和服务器端的交互功能。

Gui 为用户服务器功能控制面板。其中 UserchessPad.java 类为用户下棋功能控制区。在此面板上有实现悔棋,认输,求和功能的按键。UserControlPad.java 类为用户控制区。在此面板上有输入服务器 ip 地址的文本框,连接服务器按钮。创建游戏按键,加入游戏按键,放弃游戏按键和结束程序按键。用来实现客户端和服务器端连接的功能。UserListPad.java 类为用户目录类。在该区域显示连接至服务器的客户。

Pad 包实现了下棋的有关功能。其中 Pad.java 类绘制了棋盘和棋子。并实现了判断获胜条件的函数。实现了悔棋功能的相关函数。PointBlack.java 类为黑棋类,记录了黑棋下棋的信息。PointWhite.java 类为白棋类,记录了白棋的有关信息。Thread.java 实现了处理从服务器端收到信息的处理过程。Chess 类记录了所有棋子的相关信息,方便悔棋时重绘棋盘。

Server 包为服务器端。其中 Sever.java 为服务器端界面,其上实现了有关服务器的信息和连接至服务器的客户端的一些信息。SeverThread.java 为服务器线程类。实现了处理从客户端收到的信息和想向客户端发送信息的功能。ServerMsgPanel.java 为服务器功能类。实现了服务器的一些按键。

2.2 系统模块设计

本系统分为玩家和玩家两个角色,这两个角色有公用的功能模块也有着各自独立的功能模块。

2.2.1 系统功能分析

玩家和玩家角色的共用模块分为界面设计模块,棋盘布置模块,计分功能以及判断输赢功能。玩家角色有选择最优落子位置功能模块。具体内容如下:

界面设计模块

玩家运行游戏时首先见到的就是界面设计显示,进入游戏界时先选择电脑和玩家谁先下棋,之后按照正常的下棋规则进行人机对战。

棋盘布置模块

通过代码实现棋盘的绘制,可以自行控制棋盘的大小。

计分功能模块

计分功能模块主要是实现计算玩家和电脑分数的功能,在玩家和电脑进行对战时,双方每落一子对应的加 10 分。

判断输赢功能模块

电脑和玩家哪一方首先实现五子连接,方向不限,即表示胜利,即当前游戏结束,会提示相应的胜利或失败的文字提示,点击任意键还可以进行下一次游戏。

选择电脑下棋功能模块

进入游戏界面后玩家根据提示框选择是否先让电脑先下棋,选择是则电脑会在棋盘上的任意一个位置落下一子,之后玩家可以跟据自己的想法在任何位置下棋。

2.2.2 系统功能模块结构图

通过上述该系统的模块划分和功能分析,作出系统总体结构图,如图 2.1 所示:

具体编程过程由 Java 语言编写。总计四个包,十五个类。由于个人能力有限,只实现了部分功能。

有关类的说明

类名 描述 与其他类的关系
Client.java 创建用户端下棋主界面 使用 Chess.java 和 ChessPad.java 和 UserControlPad.java 和 UserListPad.java 创建界面,创建 ClientThread.java 处理用户端和服务器之间的信息。
ClientThread.java 向服务器端发送信息并接受服务器端传来的信息并向其他功能类使用相关操作 由 Client.java 类产生。
Inform.java 向用户介绍游戏步骤 由用户端主界面 Main.java 生成
Main.java 此为用户端登录主界面,实现向下棋端 Client,游戏说明 Inform 的跳转功能。 生成 Client.java 和 Inform.java
ChessPad.java 实现下棋过程中的功能按键 由 Client.java 调用
UserControlPad.java 实现玩家为下五子棋所作的功能界面。包括链接到服务器,创建游戏,加入游戏,放弃游戏,退出程序等功能按键。 由 Client.java 调用
UserListPad.java 声明悔棋,求和,认输按钮 由客户端调用
Chess.java 记录有关下棋过程中已经下过的棋子的信息,供悔棋过程中重绘界面做准备 由 Pad.java 调用。
ChessThread.java 处理来自服务器端生成另一方下棋等功能的类 由 Pad.java 生成。
Pad.java 实现下五子棋的绘画界面 由 Client.java 调用生成下五子棋的部分。
PointBlack.java 声明有关白子的属性 由棋盘类生成
PointWhite.java 声明有关黑子的属性 由客户端调用
Server.java 声明有关服务器界面的相关信息并设置按钮响应事件 调用 ServerMsgPanel.java 类和 ServerThread.java 类
ServerMsgPanel.java 设置一些有关服务器的功能按键 由 Server.java 调用
ServerThread.java 接受并处理一些由客户端发来的信息 由 Server.java 调用

2.2.3 系统流程图

五子棋人机对战的流程设计使用的是树状结构,系统流程图如图 2.3 所示:

三、3 系统实现

3.1 玩家下棋功能的实现

那么玩家下棋。之后每次轮到玩家下棋都是使用着一个函数。玩家下完一棋之后,电脑会立刻寻找周围最高分位置,实现落子。

效果截图

程序流程图

程序代码如下

3.2 判断下棋位置功能的实现

五子棋人机对战只要就是电脑人工智能方面的实现,当玩家下完一棋轮到电脑的时候,电脑需要计算出周围所有空位置的分数,找到最高分的那个位置下棋,有子的地方上下左右以及左斜右斜方向上都要计算,这样既可以做到防守,有可以做到进攻。每当玩家快要实现五子的时候电脑就会抢占他的位置,同样电脑会主动寻找最有利于他胜利的位置,如下图所示电脑对玩家时刻做到了“防守”,同时也做到了 “进攻”。

这里用到的函数是估值函数,这是对于下子的重要性评分,可以从四个方向来考虑当前棋局的情况,分别为:水平,垂直,左斜,右斜。实际上需要考虑在这四个方向上某一方所形成的子的布局情况,对于在还没有子的地方落子以后的当前局面的评分,主要是为了说明在这个地方下子的重要性程度,在此设定了一个简单规则来表示当前局面电脑方和玩家方的分数。

最后,根据当前最后一个落子的情况来判断胜负。需要从四个位置判断,以该子为出发点的水平,竖直和两条分别为 45 度角和 135 度角的线,目的是看在这四个方向是否最后落子的一方构成连续五个的棋子,如果是的话,就表示胜负已分。

效果截图

程序代码如下

3.3 判断输赢功能的实现

双方的输赢是根据最后一个落子的情况来判断胜负。要结合选择最优落子位置的代码功能实现。要从四个位置判断,以当前棋子为出发点的水平,竖直和两条分别为 45 度角和 135 度角的线,目的是看在这四个方向是否最后落子的一方构成连续五个的棋子,如果是的话,就表示胜负已分。

判断输赢功能功能截图

程序代码如下

3.4 计分功能的实现

计分是在实现玩家和电脑落子的语句后添加语句实现分数加 10。首先是在代码开始定义全局变量,定义一个成绩结构体,定义两个整数变量用来表示玩家和电脑的各自分数,在 main 函数中进行初始化,初始值为 0,当玩家选择电脑先下棋时,在 decide1()函数中实现语句 count+10;同样在玩家下棋的函数代码部分也编写同样的语句,实现分数加 10。在电脑和玩家下棋的函数中还要调用输出分数函数 printscore(),保证分数可以实时根据玩家和电脑落子个数进行分数更新。

运行结果

黑棋

白棋

四、4 测试

系统测试的目的是为了确定系统是否满足用户的各种需求,找出预期目标与实际结果之间的差别]。

4.1 测试方法和测试计划

确定测试方法和测试计划是实现测试的第一步,明确了测试方法以及计划,对之后的测试进度就会有所帮助。

4.1.1 测试方法

本系统实现的是五子棋人机对战的功能,测试方法采用的是黑盒和白盒相结合的方法,先使用黑盒测试查看系统的效果,有无差错或者不符合要求的内容,如果有差错,则在采用白盒测试,研读代码中的错误并进行修改。采用黑盒测试主要进行的是系统的功能性测试,健壮性测试。

4.1.2 测试计划

登录界面

游戏说明界面

游戏面板

一方获胜

先后弹出弹窗显示胜利信息,待确认后开始新的一局对局。败方先行。

悔棋功能

一方下完后,发现另一方四子连珠,此时可以悔棋,回到前两步。

悔棋前棋局

一方悔棋

另一方弹出悔棋请求框

若拒绝

请求悔棋方弹出确认框收到对方拒绝回应

若同意,回退到上一步

前后对比:

求和功能

一方求和:

求和大致流程与悔棋一致,若最后求和成功。双方显示“恭喜您获得胜利”后开始下一局。

认输功能

一方认输,另一方直接获胜。开始新的一局。

服务器端窗口

4.2 测试过程和结果分析

游戏流程

  • 先打开服务器端

  • 打开两个用户端,点击网络对战后,弹出对战页面窗口

  • 输入服务端 ip 地址,点击连接服务器按钮,连接到服务器

  • 一方玩家创建游戏,一方玩家加入游戏

  • 开始互相走子

  • 若一方玩家走子失误,则可以点击悔棋按钮进行悔棋

  • 若一方玩家发现已经失败,可以点击认输按钮直接进行下一局

  • 若双方走子你来我往,互不相让,可以点击求和按钮,若对方同意,可直接双方获胜,开启下一局

  • 一方因为出现临时事故,可以直接点击放弃按钮,结束游戏。此时对方直接获胜

有一些遗憾的地方

观战功能:观战功能尚未实现。

悔棋功能

在进行该功能实现的过程中进行了客户端和服务器端的信息传递,但始终无法实现回退到上一步的界面设计功能。试了很多方法最后都失败了。最后利用了页面的重绘机制。利用一个结构体数组将所走步数存起来。然后在按下悔棋按钮后将最后一步归 0,回退到上一步的界面,将界面重绘一遍。借此实现悔棋的功能。但有时候悔棋仍会出现一些问题。

页面优化问题

在要求功能实现之后着手进行页面优化工作。添加了游戏主界面和游戏说明界面的背景图片设计。游戏大厅的功能还没能够实现。

结论与展望

开发心得和结论

本次面向对象实习,我做的课题是有关网络五子棋游戏的实现。前期主要体验了有关面向对象的分析过程。全面分析有关课题的用况,画出用况图,分析有关类,抽象出实习类和抽象类。前期的设想功能很多,但等到真正的编程过程中,真正实现的功能却更设想的有很大的差距。在使用 Java 语言进行编程的过程中。我的题目主要就是为了实现多个用户互相连接。实现网络功能,为此使用了 Java 的网络编程方法,套接字,多线程等功能。在整个编程过程中加深了我对于 Java 编程语言的理解和运用情况。总而言之,此次实习过程使得我较为全面的了解了有关面向对象编程的思路。基本实现了题目关于网络五子对战的要求。但是由于个人知识水平的局限性,整个程序在运行的过程中有时会出现一些小问题。在此过程中十分感谢实习老师和其他同学对我的帮助。总体来说,这次实习过程是较为成功的。接下来,我会继续努力。加强有关知识的了解和学习。希望可以做出一个更加完善的五子棋系统。

不足之处及未来展望

虽然本系统相较于一般用户来说基本上可以实现娱乐消遣,满足了他们的基本需求,但是由于时间有限,个人的经验缺乏,本系统仍然存在一些问题,还需要继续完善,实现更详细的功能,存在问题有如下:

开始界面的设计

可以在进行美化以及加工,再添加两个按钮,一个是退出系统按钮,一个是游戏帮助按钮,当用户进入到游戏开始界面的时候,用户只需要点击退出游戏按钮,就可以直接退出游戏,添加按钮看起来更为的直观便用户使用。而添加游戏帮助按钮,是为了那些不熟悉游戏规则的人群所设计的,在规则界面的显示方面不够好,没有完全的将他展示出来,所有做的不够号。只有手动拉才可以将他拉开。

上传的附件 cloud_download javagui五子棋+报告.rar ( 11.59mb, 9次下载 )

发送私信

3
文章数
0
评论数
最近文章
eject