基于java网络五子棋的设计与实现

摘 要

五子棋起源于中国,是我国古代黑白棋种之一,据考究,五子棋的出现时间早于围棋,是一种上手简单但却内藏玄机的游戏。
五子棋不但能够锻炼人的思维能力,和逻辑能力,而且我们通过下棋能领悟人生哲理。五子棋文化渊源流长,博大精深,经过几千年的传播,结合中西方文化,不仅活跃在国际比赛,更是各个年龄段都喜欢的大众游戏。
随着互联网的发展,方便,快捷已经成为了时代的主题,传统五子棋方式已经不能满足广大用户的需求,网络五子棋应运而生。本设计的实现采用B-S结构,以Spring-SpringMVC-MyBatis框架为主体,结合Websocket技术,实现了人机对战,网络双人对战两种游戏模式,人机对战侧重于AI算法,而双人对战侧重于网络通信。

关键词:五子棋;SSM;Websocket

Abstract

GoBang originated in China and is one of the ancient black and white chess species in China. According to the study, the appearance of GoBang is earlier than Go, which is a simple but hidden game.
GoBang can not only train people’s thinking ability, but also logical ability, and we can understand life philosophy by playing chess. The culture of GoBang has a long history and is profound and profound. After thousands of years of communication, combined with Chinese and Western culture, it is not only active in international competitions, but also popular games of all ages.
With the development of the Internet, convenience and speed have become the theme of the times. The traditional GoBang method can no longer meet the needs of the majority of users, and the network GoBang came into being. The implementation of this design adopts the B-S structure, with the Spring-SpringMVC-MyBatis framework as the main body, combined with Websocket technology, realizes the human-machine battle, the network double-play game mode, the man-machine battle focuses on the AI algorithm, and the double-player focuses on network communication.

Keywords: GoBang; SSM; Websocket

目录

第一章 绪论 1
第二章 开发工具、环境及技术支持 2
2.1 涉及到的关键技术 2
2.1.1 jsp 2
2.1.3 WebSocket 4
2.1.4 javascript 5
2.1.5 Maven 6
2.2 开发环境和开发工具 6
第三章 五子棋概要设计 7
3.1 需求分析 7
3.2 模块化 7
3.3 功能设计概述 9
第四章 详细设计和实现过程 12
4.1 登录注册具体实现过程 12
4.1.1 注册功能 12
4.1.2 登录功能 13
4.2 人机对战具体实现过程 15
4.2.1 人机对战棋盘画法 15
4.2.2 人机对战输赢的判定 17
4.2.3 人机AI算法 20
4.3 双人网络对战五子棋的实现过程 21
4.2.1 双人在线对战棋盘画法 21
4.2.2 双人在线对战输赢判定 23
4.2.3 将下棋过程存入数据库中 25
4.2.4 悔棋功能的实现 26
4.2.5 WebSocket通信功能: 26
4.4 数据库设计 27
第五章 程序测试 29
5.1 登陆、注册模块测试 29
5.2 人机模块测试 31
5.3 网络双人对战模式 31
5.4 用户注册信息和棋盘日志表查看 32
第六章 结论 33
致谢 34
参考文献 35

第一章 绪论

五子棋起源于古代中国,《汉书》记载名为连珠、连五子,魏晋南北朝时期传入日本,经日本改进后传入欧美,在欧美风靡一时。五子棋经过时间和异域文化的洗礼才变成今天我们熟知的五子棋。
五子棋不仅仅是作为一种娱乐大众的游戏出现我们生活中,五子棋吸收了古代数学,哲学的精华,五子棋的黑白代表着阴阳,自古便有阴阳和谐,五子棋的玩法很大程度上体现了这一思想。五子棋现在已经作为一种竞技类游戏活跃在世界赛场,由此可见其价值之高。
随着互联网时代的到来,游戏行业迎来了春天,各种类型的游戏层出不穷,客户端-服务器模式的游戏依然是时代的主流,但是仅限于那些画面精美,制作精良的大型动作游戏,现在许多休闲游戏不再需要下载客户端了,只需要打开浏览器,输入网址,登陆即可开始游戏,这就是浏览器-服务器模式的便捷之处,此次开发的目的就是实现基于浏览器-服务器模式下的网络五子棋。在完成课题的同时,也能够接触现在主流的WEB开发模式和开发工具,熟悉开发流程和开发技术,也是对自己也是一种锻炼。

第二章 开发工具、环境及技术支持

2.1 涉及到的关键技术
2.1.1 jsp
JSP全称Java Server Pages,JSP的全名叫做Java Server Pages,JSP属于一种动态网页脚本语言,可以跨多个平台进行实现系统功能,因此具备较好的兼容性,和ASP语言相比,JSP虽然也是基于HTML文件进行运行,但是可以更好地实现与系统用户之间的互动,让用户获得更好的体验。JSP语言的技术基础实际上为Java Servlet,Java Servlet可以结合JSP共同实现大型软件项目的开发。
JSP脚本语言的优势非常鲜明,首先JSP适用于多种编程语言,尤其非常适合搭配JAVA语言一起使用,结尾的标签内容为<%开头以%>,可以最大程度地体现出JAVA语言的优势和特点,并且JSP语言本身也具备JAVA语言的一些特征。JSP语言还可以实现对Java web的UI部分,结合HTML文件、XML文件以及XHTML文件,采用嵌入式开发来进行前端设计。
JSP语言还具备强大的兼容能力,只需要编辑一次,就可以在多个平台间反复利用,极大地缩短了开发人员的开发时间,并且可以在多个编译环境中进行开发,方便开发人员对系统进行部署,有利于对系统环境进行扩充。JSP脚本语言还具有较为可靠的稳定性和安全性,自带很多功能强大的工具,可以保证开发人员开发过程的顺畅和便利,并且系统具有较高的安全性,再加上JSP技术是可以免费下载的,这也让JSP技术的应用范围不断扩大。此外,JSP语言可以实现对数据库、用户操作和选择的相关信息以及JavaBeans组件来进行访问,并且实现多个网页间的信息传递和信息共享。
2.1.2 SSM框架
Spring
Spring是软件开发领域中一种常见的设计框架,其源代码是对外开放的,并且属于面向接口编程思维,主要用于处理和解决业务逻辑层和其他层次的问题。早在2003年,Spring就开始在开发领域被人们所熟知,一开始的主要应用在Java 语言的应用程序的开发上,创始人为Rod Johnson,因此,Spring框架不仅是JavaSE/EE分层,还是一种轻量级的全栈式框架[[] 明日科技. JavaWeb项目开发实战入门. 吉林大学出版社,2017.1]。
Spring设计框架的核心为是IOC和AOP,其中IOC的全称为Inversion of Control,表示控制反转,AOP的全称为Aspect Oriented Programming,表示面向切面的编程方式。控制反转,指的是对这些相互依赖对象的创建和协调工作都交由Spring容器来实现,当某个对象需要其他协作对象时,由Spring动态的通过依赖注入(DI, Dependency Injection)的方式来提供协作对象,其只需要关注业务本身的逻辑即可。
Spring从2004年的第一版发展到现在,已经成为了一个生态帝国,经过不断的改进发展,现如今的SpringMVC、SpringBoot、Spring Cloud等解决方案共同构成了Spring框架。有人亲切的称之为:Spring 全家桶。在本项目中我们后台选择了Spring,SpringMVC,MyBatis这一套框架,搭配Maven,开发效率成倍提高。
SpringMVC
SpringMVC框架主要基于web层的,其框架类型属于MVC模式,适合对Servlet进行配合,从而快速处理web层的响应和请求,还能快速获取表单内容,并且对表单进行校验[[] 杨静.基于JAVA WEB中MVC模式的研究和应用[J]. 电脑知识与技术,2014,9(28)68-71]。
SpringMVC的工作原理图如图1.1
在这里插入图片描述

图1.1

SpringMVC框架根据配置来分,可以分为两个启动流程:
1、对ontextLoaderListener进行初始化,完成对IoC容器的实例化后,将实例化的内容注册在ServletContext中。
2、对DispatcherServlet进行始化,通过建立上下文,将上下文注册在ServletContext中。
由于本项目重点为算法和通信,故不再深究。
MyBatis
MyBatis 一开始只是一个开源项目,由Apache软件基金会推出,直到2010年,apache software foundation 将MyBatis 项目添加进入到google code中,正式更名为MyBatis,MyBatis因此而来。2013,再次将MyBatis添加进入到Github。iBATIS源于“internet”和“abatis”这两个意思,主要是基于Java语言的应用在持久层上的一种设计框架,因此,iBATIS开源提供多种持久层的框架,主要包括DAOs(Data Access Objects)、SQL Maps等[[] 王循. JavaWeb快速开发框架中部分关键技术初步研究[D] . 吉林大学,2015]。
很多开发人员习惯采用MyBatis中的ORM机制,因此MyBatis可以面对纯粹的Java对象,还可以根据Hibernate 来实现ORM,Hibernate 还可以基于数据操作生成相应的SQL语句,但是MyBatis 在对数据库进行处理时,其优势在于对SQL工作量、数据库具有较好的可移植性,从而保证系统在设计的过程中可以具备更高的灵活性。因此,MyBatis 可以对ORM 的功能进行有效补充和完善,具有非常重要的现实意义。
本课题的设计属于Maven项目,只需在pom.xml中引入依赖即可。
pom.xml中的配置如下

org.mybatis
mybatis
3.2.8

org.mybatis mybatis-spring 1.2.3

2.1.3 WebSocket
WebSocket主要基于一个独立的TCP连接,从而完成通信协议,协议的类型属于全双工模式。在2011年,WebSocket就被IET列入为标准RFC 6455,并且让RFC936不断对其内容进行补充,因此,W3C将WebSocketAPI列为标准[[] Chris Heilmann (December 8, 2010). “WebSocket disabled in Firefox 4”.Hacks.Mozilla.org. Retrieved 2011-05-09.]。
WebSocket可以简化服务器和客户端之间的数据交换和交互功能,让服务器主动给客户端发送数据内容,因此,WebSocket API的浏览器和服务器在完成首次握手后,就可以持续连接和通信,双向进行数据交互。
选用Websocket技术作为服务器和客户端交互手段的原因:
HTML页面早期是静态的,不能进行交互,后来出现了JavaScript,在一定程度上解决了交互问题,但是JS在刚出现的时候并不能和服务器进行交互,直到Ajax的出现。Ajax解决了页面和服务端进行交互的问题,但是Ajax所有的请求都必须由客户端发起,服务器端响应,如果服务器端有最新消息难以及时发送到客户端,在WebSocket出现之前,客户端和服务器的信息交互方法主要有以下三种方式:
1.轮询:客户端定期持续向服务器发送请求内容,从而判断服务器是否存在新数据,如果有新数据,需要传送到客户端进行显示。服务端如果没有就返回给一个空的json或者xml文档,此方法实现方式简单,但是会存在大量的无效请求,服务器端的资源占用过大[[] 洪世勇. 高Java中基于Socket的网络编程[J]. 软件工程师,2013(01):61-62]
2.长连接:类似于轮询,不同点在于服务器端不会每次都会响应客户端的请求,只有在服务器端有最新的数据时才会响应客户端的请求,这种方式解决了长连接存在无效请求的问题
3.Applet和Flash:实现了真正意义上的全双工通信,但存在安全问题,可移植性差
WebSocket的优势:
1.由于WebSocket与HTTP使用的端口相同,夸张的讲几乎所有防火墙都不会阻塞 Websocket连接。
2.WebSocket使用HTTP协议进行握手通信,因此它能够轻而易举的集成到浏览器中
3.使用WebSocket进行通信时,无论时服务器端还是客户端都可以知道消息的启动或者到达
4.WebSocket支持跨域,可以避免Ajax的限制
2.1.4 javascript
Javascript属于一种较为常见的脚本语言,主要用于Web的开发,为Web网页设置多种动态效果和相关功能,因为原始的HTML语言功能性很差,只能实现一些静态功能,而且界面单一。JavaScript的出现使得前端界面变得丰富多彩,通过精美的包装,给用户提供更流畅美观的浏览效果。通常JavaScript脚本语言是嵌入在HTML中来实现各种动态的功能。
Javascript的特点:
1.是一种解释类型的脚本语言,简单易懂,易编写修改。
2.基于对象
3.可跨平台,可移植性强
2.1.5 Maven
Apache Maven是一种常见的软件项目管理工具,主要基于POM模型,主要用户对项目的构建,从而对项目的相关文件进行管理。除此之外也能提供中央仓库,自动帮我们下载构件,省去了自己配置项目时,需要下载工具的麻烦,如果想要引入jar包,根本无需手动添加,只要在pom.xml下添加依赖即可。
上面已经提到了引入了MyBatis,本项目还引入了websocket等依赖,依赖较多故不一一说明。
2.2 开发环境和开发工具
开发环境:win10 64位操作系统
处理器:Intel® Core™ i5-4210U CPU @1.70GHz 2.40GHz
内存(RAM):12G
开发工具:
JDK 1.7
IntelliJ IDEA 2019.1.2版本
Mysql 5.7.25版本
Apache Tomcat 8.5.35版本
Navicat Premium12.0.18版本

第三章 五子棋概要设计

3.1 需求分析
通过分析,根据需求,要求实现以下功能:
1.账号的登陆、注册、退出、密码修改等功能
2.人机对战功能
3.双人网络对战功能
4.重开对局功能
5.悔棋功能
6.认输功能
通过将用户要求转化为具体功能,目的更加明确,将功能模块化,以便更快更好的完成该项目。
3.2 模块化
系统分为3个主要模块
1.登陆、注册模块
2.人机对战模块
3.双人网络对战
各个模块功能结构图:
1.登陆、注册模块如图3.1

在这里插入图片描述

图3.1登陆模块

2.人机对战模块如图3-2
在这里插入图片描述
图3.2 人机模块

3.双人网络对战如下图3-3
在这里插入图片描述
图3.3
3.3 功能设计概述
本系统是基于浏览器—服务器模式下网络五子棋程序,能够实现人机对战,双人网络对战,完成了五子棋游戏的一些基础操作,如落子、胜负判定、认输、悔棋、棋盘保存等功能。游戏界面简洁,逻辑性较强。
1.服务器端设计:
处理用户的登陆、注册、密码修改等信息,将用户信息及时同步到数据库中。
2.浏览器端设计:
对表单进行正确填写,及时反馈给客户端信息,使得用户能够进行正常的登陆和游戏,并且点击相应的button发出鼠标点击请求事件,服务器通过不同的事件,进行不同的反应
3.用户注册:首次游戏的用户需要填写注册信息,并将数据存入数据库中。用户通过注册来创建自己的账号,以便登录后进行游戏。
4.用户登录:用已有的账号信息登录,通过和数据库表User内信息进行比较,验证登录,如果信息正确进入主页面,否则弹出信息错误提示。
5.人机对战:选择先手、后手,棋子颜色,重新开始等功能
人机对战模式的系统流程图如下图3.4[[] 宁淑荣 杨国兴. Java五子棋游戏制作. 清华大学出版社,2017.5]
在这里插入图片描述

图3.4
6.双人网络对战:认输、悔棋、重开功能
双人网络对战模式系统流程图如下图3-5
在这里插入图片描述
图3.5

7.修改密码功能:输入两次新密码即可修改密码,将新密码同步到数据库User表中

第四章 详细设计和实现过程

4.1 登录注册具体实现过程
4.1.1 注册功能
注册功能是由前台的register.jsp页面的form表单来实现的,通过点击注册提交form表单,再由controller接受表单信息,并作出响应。代码如下。

此时发出去的请求会被web.xml拦截下来,进而将请求内容添加到相应的@RequestMapping中,@RequestMapping属于一种常见的注解方法,根据传入的参数User 中的username判断用户是否存在并注册,代码如下: UserController.java: @RequestMapping(value = "register.action") public String register(HttpServletRequest request, Model model, User user) {
    User user1 = userService.selectUser(user);
    if (user1 != null) {
        request.setAttribute("error", "该用户已经存在,请重新注册!");
        return "register";
    } else {
        userService.saveUser(user);
        return "login";
    }
}

UserMapper.xml中用户注册的sql:

insert into user (username, password, createtime, phone, states) values (#{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{createtime,jdbcType=TIMESTAMP}, #{phone,jdbcType=BIGINT}, #{states,jdbcType=VARCHAR})

4.1.2 登录功能
登录功能起始是由前台的login.jsp页面的form表单开始,点击登录提交form表单




      </form>

此时发出去的请求会在web.xml中被拦截,并且由相应的@RequestMapping方法来进行处理,参数username 主要用来对用户的登录状态进行判断,如果用户已经登录成功,user将被添加到session中。
所谓session,在软件开发领域,主要是指会话控制,因此,Session 的对象一般就是对用户会话相关信息的存储,当用户在网页中进行操作,从而让网页跳转时,Session 对象对象依然存在,不会造成丢失的情况,如果用户还没有创建会话,在对web进行操作时, Web 服务器会自动为用户进行创建,值得注意的是,如果Session 过期, Web 服务会将其终止掉。
代码如下:
@RequestMapping(value = “login.action”)
public String login(HttpServletRequest request, HttpServletResponse response, User user) {
response.setHeader(“Content-type”, “text/html;charset=UTF-8”);

                User user1 = userService.selectUser(user);
                if (user1 == null) {
                    request.setAttribute("erro", "密码错误");
                    return "login";
                } else {
                    request.getSession().setAttribute("user", user1);
                    return "redirect:main.action";
                }
}

有了session,我们便可配置拦截器,根据session中User信息是否存在来判断用户的登录状态,如果用户处于登陆状态登录,则通过,否则将自动将其拦截到登录页面
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
String url = request.getRequestURI();
User user = (User) request.getSession().getAttribute(“user”);
if (user != null) {//如果用户已经登录 直接放行
return true;
} else {//如果用户访问的是登录 注册就放行,其他的拦截到登录页面
if (url.contains(“login.action”) || url.contains(“register.action”)|| url.contains(“index.action”)) {
return true;
} else {
response.sendRedirect(“login.jsp”);
return false;
}
}

}

以下是修改密码的sql,流程基本如上,故不详细说明
update user set password = #{password,jdbcType=VARCHAR}, createtime = #{createtime,jdbcType=TIMESTAMP}, phone = #{phone,jdbcType=BIGINT}, states = #{states,jdbcType=VARCHAR} where username = #{username,jdbcType=VARCHAR}

4.2 人机对战具体实现过程
4.2.1 人机对战棋盘画法
导入背景图片,根据图片像素大小,将背景图片分割成15*15的正方形网格作为棋盘
棋盘的边框,每个小格子的长,宽像素设置如下:
div.chessboard {
margin: 30px 0 0 50px;
width: 542px;
background: url(img/chessboard.png) no-repeat 14px 14px rgb(250, 250, 250);
overflow: hidden;
box-shadow: 2px 2px 8px #888;
-webkit-box-shadow: 2px 2px 8px #888;
-moz-box-shadow: 2px 2px 8px #888;
}

div.chessboard div {
float: left;
width: 36px;
height: 36px;
border-top: 0px solid #ccc;
border-left: 0px solid #ccc;
border-right: 0;
border-bottom: 0;
cursor: pointer;
}
棋盘画法:
重复topline的画法依次将背景图片分割成15*15的网格


4.2.2 人机对战输赢的判定 根据最后的落子来判断输赢,依次从X轴方向、Y轴方向、左斜方向、和右斜方向统计同一方向上的相同颜色连续棋子数目,如果在同一方向上相同连续棋子的数目等于5时持该颜色棋子的一方获胜具体实现的代码如下: playerWinOrNot: function (i, j) { var nums = 1, //连续棋子个数 chessColor = this.humanPlayer === "black" ? this.BLACK_CHESS : this.WHITE_CHESS, m, n; //x方向 for (m = j - 1; m >= 0; m--) { if (this.chessArr[i][m] === chessColor) { nums++; } else { break; } } for (m = j + 1; m < 15; m++) { if (this.chessArr[i][m] === chessColor) { nums++; } else { break; } } if (nums >= 5) { this.playerWin(); return; } else { nums = 1; } //y方向 for (m = i - 1; m >= 0; m--) { if (this.chessArr[m][j] === chessColor) { nums++; } else { break; } } for (m = i + 1; m < 15; m++) { if (this.chessArr[m][j] === chessColor) { nums++; } else { break; } } if (nums >= 5) { this.playerWin(); return; } else { nums = 1; } //左斜方向 for (m = i - 1, n = j - 1; m >= 0 && n >= 0; m--, n--) { if (this.chessArr[m][n] === chessColor) { nums++; } else { break; } } for (m = i + 1, n = j + 1; m < 15 && n < 15; m++, n++) { if (this.chessArr[m][n] === chessColor) { nums++; } else { break; } } if (nums >= 5) { this.playerWin(); return; } else { nums = 1; } //右斜方向 for (m = i - 1, n = j + 1; m >= 0 && n < 15; m--, n++) { if (this.chessArr[m][n] === chessColor) { nums++; } else { break; } } for (m = i + 1, n = j - 1; m < 15 && n >= 0; m++, n--) { if (this.chessArr[m][n] === chessColor) { nums++; } else { break; } } if (nums >= 5) { this.playerWin(); return; } this.AImoveChess(); }, 4.2.3 人机AI算法 各个玩家每下一步棋时,AI算法会遍历整个棋盘,通过计算出每个位置的权重值,再将权重值进行比较,根据不同权重比,确定棋局的形式,规定固定棋型的分数,根据棋型,确定棋盘每个位置空子的分值,然后就下分值最高的那个点[[] 裴博文. 五子棋人工智能权重估值算法[J].电脑编程技巧与维护, 2008 (06):69-73 ]。 computeWeight: function (i, j) { var weight = 14 - (Math.abs(i - 7) + Math.abs(j - 7)), //基于棋盘位置权重 pointInfo = {}, //某点下子后连子信息 chessColor = this.AIPlayer === "black" ? this.BLACK_CHESS : this.WHITE_CHESS; //x方向 pointInfo = this.putDirectX(i, j, chessColor); weight += this.weightStatus(pointInfo.nums, pointInfo.side1, pointInfo.side2, true);//AI下子权重 pointInfo = this.putDirectX(i, j, -chessColor); weight += this.weightStatus(pointInfo.nums, pointInfo.side1, pointInfo.side2, false);//player下子权重 //y方向 pointInfo = this.putDirectY(i, j, chessColor); weight += this.weightStatus(pointInfo.nums, pointInfo.side1, pointInfo.side2, true); pointInfo = this.putDirectY(i, j, -chessColor); weight += this.weightStatus(pointInfo.nums, pointInfo.side1, pointInfo.side2, false); //左斜方向 pointInfo = this.putDirectXY(i, j, chessColor); weight += this.weightStatus(pointInfo.nums, pointInfo.side1, pointInfo.side2, true); pointInfo = this.putDirectXY(i, j, -chessColor); weight += this.weightStatus(pointInfo.nums, pointInfo.side1, pointInfo.side2, false); //右斜方向 pointInfo = this.putDirectYX(i, j, chessColor); weight += this.weightStatus(pointInfo.nums, pointInfo.side1, pointInfo.side2, true); pointInfo = this.putDirectYX(i, j, -chessColor); weight += this.weightStatus(pointInfo.nums, pointInfo.side1, pointInfo.side2, false); return weight; }, 4.2 双人网络对战五子棋的实现过程 4.2.1 双人在线对战棋盘画法 根据图片像素大小,将背景图片分割成15*25的正方形网格作为棋盘背景,具体实现过程: 样式:

画棋盘:
var XX=0;
var YY=0;
var str = “

”;
for (var i = 0; i < 15; i++) {
str += “”;
for (var j = 0; j < 25; j++) {
str += “”;
}
str += “”;
}

利用WebSocket建立连接并进行通信:

Websocket的接口类:
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
4.2.2 双人在线对战输赢判定
双人对战游戏胜利的判定和人机对战相同都是统计X轴方向、Y轴方向、左斜方向、和右斜方向同一方向上的相同颜色连续棋子数目
private static int isSuccess(int x, int y, int f, int[][] oriData) {
//y的范围在0-14之间,x的范围在0-24之间
int count = 0;
for (int i = x - 1; i > -1; i–) {
if (oriData[y][i] != f) {
break;
}
count++;
}
for (int i = x + 1; i < 25; i++) {
if (oriData[y][i] != f) {
break;
}
count++;
}
if (count > 3) {
return f;
}
count = 0;
for (int i = y + 1; i < 15; i++) {
if (oriData[i][x] != f) {
break;
}
count++;
}
for (int i = y - 1; i > -1; i–) {
if (oriData[i][x] != f) {
break;
}
count++;
}
if (count > 3) {
return f;
}
count = 0;
for (int i = x + 1, j = y + 1; i < 25; i++, j++) {
if (j < 15) {
if (oriData[j][i] != f) {
break;
}
count++;
} else
break;
}
for (int i = x - 1, j = y - 1; i > -1; i–, j–) {
if (j > -1) {
if (oriData[j][i] != f) {
break;
}
count++;
} else
break;
}
if (count > 3) {
return f;
}
count = 0;
for (int i = x + 1, j = y - 1; i < 25; i++, j–) {
if (j > -1) {
if (oriData[j][i] != f) {
break;
}
count++;
} else
break;
}
for (int i = x - 1, j = y + 1; i > -1; i–, j++) {
if (j < 25) {
if (oriData[j][i] != f) {
break;
}
count++;
} else
break;
}
if (count > 3) {
return f;
}
return -1;
}

4.2.3 将下棋过程存入数据库中
数据库驱动字符
private String dbDriver=“com.mysql.jdbc.Driver”;
游戏结束后遍历存储五子棋坐标的集合,将其按照先后顺序依次导入数据库中。
for (int i1 = 0; i1 < list.size(); i1++) {
String bushu=(i1+1)+“”;
String XX=list.get(i1).x+“”;
String YY=list.get(i1).y+“”;
try {
String sql=“insert into rizhi (logid,bushu,x,y,blackuser,whiteuser) " +”
values (‘“+id+”’,‘“+bushu+”’,‘“+XX+”’,‘“+YY+”’,‘“+lastUser+”’,‘“+nickname+”’)";
Class.forName(dbDriver).newInstance();
connect = DriverManager.getConnection(sConnStr,“root”,“123456”);
stmt=connect.createStatement();
rs=stmt.executeUpdate(sql);

                }

4.2.4 悔棋功能的实现
将运算后的上次的坐标在集合里面删除,然后将上次传进来的坐标返回出去
关键代码如下:
if (message.equals(“悔棋”) && list.size() > 0 && backname.equals(“”)) {//悔棋功能
System.out.println(“用户悔棋”);
list.remove(list.size() - 1);
sendText(XX + “=” + YY + “=悔棋”);
backname = “下棋”;
return;
}
4.2.5 WebSocket通信功能:
创建WebSocket连接:

webSocket = new WebSocket(“ws://127.0.0.1:8080/gobang/game/” + nickname);

WebSocket的几种常用方法:

1.webSocket.onopen=function (event) {
//连接成功时触发
}
2.webSocket.onclose=function (event) {
//连接关闭时触发
}
3.webSocket.οnerrοr=function (event) {
//连接出错时触发
}
4.webSocket.onmessage=function (event) {
//收到消息时触发
}
4.3 数据库设计
用户表User用来存储用户信息,如账号、密码详细信息见下表4-1
表4-1 User表
User表 存储登录信息
列名 描述 功能
Username 登录Id 主键
password 登录用户名
createtime 创建时间
States 登录用户类型
phone 用户电话

日志表rizhi用来存储棋盘信息,步数、落子时间、落子位置详细信见下表4-2

表4-2 rizhi表
rizhi表 存储登录信息
列名 描述 功能
logid 唯一标识 主键
bushu 下棋的步数
x 横坐标
y 纵坐标
whiteuser 白棋棋使用者
blackuser 黑棋使用者
datatime 存储数据的时间

第五章 程序测试

5.1 登陆、注册模块测试
登陆界面如图5.1
在这里插入图片描述
图5.1 用户登陆界面
填写账号密码登陆成功后进入主界面如下图5.2:
在这里插入图片描述
图5.2主界面图
注册界面如下图5.3
在这里插入图片描述
图5.3 用户注册界面图
5.2 人机模块测试
人机对战测试结果如下图5.4
在这里插入图片描述
图5.4 人机对战图
经过反复测试,发现与人机AI对战时,下子数量越多,取胜的概率越大。
5.3 网络双人对战模式
双人模式测试悔棋的功能结果如下图5.5、5.6、所示
在这里插入图片描述
图5.5悔棋前的棋盘
在这里插入图片描述

图5.6 悔棋功能
5.4 用户注册信息和棋盘日志表查看
用户注册信息表如下图5.7所示
在这里插入图片描述
图5.7 用户信息表
日志表如下图5.8所示
在这里插入图片描述
图 5.8日志

第六章 结论

经过了几个月的设计和开发,网络五子棋项目基本完成。
此五子棋游戏的开发采用浏览器-服务器模式,相对传统的客户端-服务器模式下的网络五子棋来说,更加便捷,安全。不需要客户端程序,只需要一个浏览器就可以实现五子棋对战。
该程序实现了如下具体功能:
1.用户登陆、注册、密码修改等功能
2.人机对战
3.双人在线对战
4.添加了悔棋功能
虽然实现了大部分的功能但还存在着一些问题。该程序并没有实现真正的“双人对战”,如果使用ngnork内网穿透工具可将本机的IP地址暴露在公网上,可真正实现双人对战。
人机对战的AI算法并非AI必胜算法,通过测试中人机对战玩家的胜利截图就可以知道,该算法的核心时通过遍历整个棋盘寻找权重最大的点,但是每次都需要遍历整个棋盘找到权值最大的点,在面对复杂的棋局时,该算法的准确性就降低了许多,而且该算法不具备“学习能力”,不能提高其估值的精准度。
综合以上,该程序可以满足用户的一些简单对战要求,能够实现网络对战。

致谢

本次论文能够顺利完成,多亏了杨鸣导师的指点和教导,因此,我不但深感杨鸣老师的负责和认真,让我明白了论文研究的态度和责任,就是需要不停地研究和深入,才能更好的解决问题。杨鸣老师渊博的知识和专业的作风也是我奋斗的目标。本课题的每个环节,能够一次又一次的客服困难,离不开导师的耐心指导,老师您不厌其烦的为我解答一个又一个问题,并且给了我很多的指导和建议,才使得论文得以顺利完成。对于导师的默默付出,不求回报的精神。学生无以回报,只能在这里对您说声:老师,谢谢您,您辛苦了
时光荏苒,仿佛一切都在昨日,一想到离开学校,步入社会。心中百感交集,是对学校的不舍,同时也有对未来的期待。从开题到论文的顺利完成,中间的忙碌,辛苦现在回想起来都显得那么微不足道,是在老师、同学、热情的帮助下,克服重重难关,在此请接受我诚挚的谢意!在此我向计算机学校计算机科学与技术专业的所有老师表示衷心的感谢,感谢四年间各位老师的细心栽培,感谢辅导员老师的热心帮助,感谢学院领导为我们创造这么好的条件。
四年的时光匆匆,我在这期间所收获的除了老师传授给我的知识外,我还收获了友情,同学情,师生情。我很感激在这四年来我结交的好友,认识的同学和老师,他们在各个方面都给予了我很大的帮助,让我度过了一个幸福快乐又充满收获的大学四年时光。
此外我觉得我最应该感谢的是我的父母,你们在这20几年来为我付出的汗水与心血,夜以继日的工作,岁月在你们的眼角和发丝留下时间的印记。在以后的日子里,你们不必再如此辛苦,
最后再次感谢学院的老师和同学们,感谢你们的一路陪伴,即使即将分离,亦难忘这四载光阴。

参考文献

  • 27
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值