当前位置: 首页 > news >正文

【毕业设计】基于Java的五子棋游戏的设计(源代码+论文)

简介

五子棋作为一个棋类竞技运动,在民间十分流行,为了熟悉五子棋规则及技巧,以及研究简单的人工智能,决定用Java开发五子棋游戏。主要完成了人机对战和玩家之间联网对战2个功能。网络连接部分为Socket编程应用,客户端和服务器端的交互用Class Message定义,有很好的可扩展性,客户端负责界面维护和收集用户输入的信息,及错误处理。服务器维护在线用户的基本信息和任意两个对战用户的棋盘信息,动态维护用户列表。

在人机对弈中通过深度搜索和估值模块,来提高电脑棋手的智能。分析估值模块中的影响精准性的几个要素,以及提出若干提高精准性的办法,以及对它们搜索的节点数进行比较,在这些算法的基础上分析一些提高电脑AI方案,如递归算法、电脑学习等。算法的研究有助于理解程序结构,增强逻辑思维能力,在其他人工智能方面也有很大的参考作用。

点此免费下载源码+论文:https://download.csdn.net/download/inchat/87554834

在这里插入图片描述

程序结构说明

通过 Java Application,要实现网络对战,故采用C/S模式编写,程序包含7个独立的类文件-ChessWZQ.java、Group.java、Message.java、Player.java、ServerOneClient.java、Server.java、BoardPanel.java。

其中BoardPanel.java主要负责棋盘的初始化,鼠标事件的处理,以及判断胜负条件。ChessWZQ.java定义了面板上的其他元素,包括玩家列表,标题栏等。也包括了事件处理和人工智能。ServerOneClient.java则负责网络对战的处理。其他的类都是又这3个主类延伸出去的。在具体实现的时候再介绍其作用。见图。

在这里插入图片描述

棋盘及棋子的类

棋盘具体代码如下:

String line = "a b c d e f g h i j k l m n o";
char [] rowNum1 = {'1','2','3','4','5','6','7','8','9'};
char [] rowNum2={'1','0','1','1','1','2','1','3','1','4','1','5'};

这部分为棋盘的边界标识符,是必须要有的。用字符数组存储,最后确定位置放上去即可。

棋盘的绘制:

private static int xp;           // 棋子 X坐标private static int yp;           // 棋子Y坐标public void paint(Graphics gc){super.paint(gc);//this.setBackground(Color.gray);//this.invalidate();gc.setColor(Color.blue);//gc.setColor(new Color(255, 255, 240));//画横向标识符gc.drawString(line,25,15);// 画竖向标识符for(int i=0;i<9;i++){gc.drawChars(rowNum1,i,1,10,35+i*30);}for(int i=9,j=0;i<15;i++,j+=2){gc.drawChars(rowNum2,j,2,10,35+i*30);}// 画棋盘for (int i = 0; i < 15; i++) {gc.drawLine(30, 30 + i * 30, 450, 30 + i * 30); //行gc.drawLine(30 + i * 30, 30, 30 + i * 30, 450); //列}gc.drawLine(25, 25, 455, 25);gc.drawLine(25, 25, 25, 455);gc.drawLine(25, 455, 455, 455);gc.drawLine(455, 25, 455, 455);//面板初始化for(int i=0;i<15;i++){for (int j = 0; j < 15; j++) {xp=16+i*30;yp=16+j*30;if (board[i][j] == 1){gc.setColor(Color.black);gc.fillOval(xp,yp,28,28);//gc.drawImage(black, 16 + i * 30, 16 + j * 30, this);}if (board[i][j] == 2){gc.setColor(Color.white);gc.fillOval(xp,yp,28,28);//gc.drawImage(white, 16 + i * 30, 16 + j * 30, this);}}}}

确定下子的坐标(xp,yp)画特定大小的椭圆,这里的坐标指棋子相对棋盘的绝对坐标。

private static int xp;           // 棋子 X坐标
private static int yp;           // 棋子Y坐标if(col==1) g.setColor(Color.black);else g.setColor(Color.white);g.fillOval(xp,yp,10,28,28);

胜负判断条件

要判断四个方向,横向、竖向、以及2个斜向。思想还是比较简单,相同颜色连成五子即胜利,网上有些网友评论说完整的判断胜负条件包括连五和活四,我觉得完全没必要,活四还要检查两边的棋子,虽然运算量不大,但五子棋的标准就是连五即胜,一步之差,我们既要遵守规则,也要简化代码实现尽完整的功能。

我们要事先建立一个盘面数组board[ ][ ],即棋型表,数组的每一个元素对应棋盘上的一个交叉点,用‘0’表示空位,‘1’表示黑棋,‘2’表示白棋。由于代码太多,下面给出了一般状况的判断胜负函数,及以坐标(x,y)为中心的9X9矩形,只能在棋盘的内部,如果超过棋盘,就要另外考虑。下面的代码就是一般情况,整个矩形在棋盘内部的时候的判断胜负条件,如图。

在这里插入图片描述

胜负判断条件以下为X方向的代码:

protected boolean judge(int x,int y,int clr){int i=0,j=0,count=0;// x方向for(i=0,count=0;x-i>=0&&i<5;i++){if (clr==board[x-i][y]){count++;}else{break;}// System.out.println("( "+x+" , "+y+" )"+"count = "+count);if(count==5)return true;}for(i=1;x+i<15&&i<5;i++){if(clr==board[x+i][y]){count++;}else{break;}if(count==5)return true;}return false;
}

为保证公平,先下子的就有禁手。但是我们一般没有这个规则限制,都是轮流先下子。理论上是这样的。但很多专家表明,先下子有很大的几率获胜,即使有禁手,先下子的一方还是有很大的优势,我觉得对于我们一般玩家而言,这些规定可以不考虑。

判断胜负的不管是单机还是玩家相互游戏,都必须开服务端,因为判断胜负是放在里面的。如果有一方获胜,弹出提示框,如果确认则清空棋盘继续新游戏。

public void getVictory(Message msg){JOptionPane.showMessageDialog(null,"You  Win  The  Game","Congratulations",JOptionPane.INFORMATION_MESSAGE);//继续新游戏label3.setText("Player2");newGame();}

需要注意的一点是落下的棋子如果离任何一方的边界小于4,则以边界为限制判断是否有一方获胜,这样的话也要考虑多种方向,但原理还是和基本情况是一样的。

点此免费下载源码+论文:https://download.csdn.net/download/inchat/87554834

相关文章:

【毕业设计】基于Java的五子棋游戏的设计(源代码+论文)

简介 五子棋作为一个棋类竞技运动&#xff0c;在民间十分流行&#xff0c;为了熟悉五子棋规则及技巧&#xff0c;以及研究简单的人工智能&#xff0c;决定用Java开发五子棋游戏。主要完成了人机对战和玩家之间联网对战2个功能。网络连接部分为Socket编程应用&#xff0c;客户端…...

C#:Krypton控件使用方法详解(第十四讲) ——kryptonSeparator

今天介绍的Krypton控件中的kryptonSeparator。下面介绍控件的外观属性如下图所示&#xff1a;Cursor属性&#xff1a;表示鼠标移动过该控件的时候&#xff0c;鼠标显示的形状。属性值如下图所示&#xff1a;DrawMoveIndicator属性&#xff1a;表示确定移动分隔符时是否绘制移动…...

Java的jar包打包成exe应用

将springboot项目使用maven打出的jar包&#xff0c;打成windows平台下exe应用程序包&#xff08;自带jre环境&#xff09;。 工具&#xff1a;1、exe4j 2、Inno Setup 工具放到网盘&#xff0c;链接&#xff1a;https://pan.baidu.com/s/1ZHX8P7u-7GBxaC6uaIC8Ag 提取码&#x…...

Latex学习笔记

Latex 学习笔记 快速入门 编译软件: TeX Live TexStudio, Ctex, 线上: Overleaf第一个示例代码&#xff1a; \documentclass{article} % 设置文档使用的文档类 % 导言区 \title{my first Latex document} \author{Jclian91} \date{\today} \begin{document} % 正文区\maket…...

【c++复习】C++的基础知识(常用关键字、缺省参数、函数重载、引用)

C基础写在开头C基础常用关键字using namespace流插入和流提取操作符内联函数(inline)宏auto关键字 (c11nullptr (c11缺省参数函数重载引用写在开头 C基础部分我想介绍如下几个关键点&#xff1a; 常见关键字命名空间的定义和使用缺省参数函数重载引用、指针和引用的区别内联函…...

Docker入门建议收藏 第二部分

二、Docker 容器技术与虚拟机的区别 Docker 到底是个什么东西呢&#xff1f;我们在理解 Docker 之前&#xff0c;首先得先区分清楚两个概念&#xff0c;容器和虚拟机。 虚拟机 虚拟机&#xff08;Virtual Machine&#xff09;指通过软件模拟的具有完整硬件系统功能的、运行在…...

蓝桥杯三月刷题 第7天

文章目录&#x1f4a5;前言&#x1f609;解题报告&#x1f4a5;三角回文数&#x1f914;一、思路:&#x1f60e;二、代码&#xff1a;&#x1f4a5;数数&#x1f914;一、思路:&#x1f60e;二、代码&#xff1a;&#x1f4a5;数组切分&#x1f914;一、思路:&#x1f60e;二、…...

面试官问百万数据excel导出功能如何实现?

文章目录 背景实现1.异步处理1.1 使用job1.2 使用mq2.使用easyexcel4.多个sheet5.计算limit的起始位置6.文件上传到OSS7.通过WebSocket推送通知8.总条数可配置9.order by商品编号总结背景 用户在UI界面上点击全部导出按钮,就能导出所有商品数据。 咋一看,这个需求挺简单的。…...

理解HTTPS及配置

HTTP的弊端及HTTPS的由来 众所周知HTTP协议是以TCP协议为基石诞生的一个用于传输Web内容的一个网络协议,在“网络分层模型”中属于“应用层协议”的一种.那么在这里我们并不研究该协议标准本身,而是从安全角度去探究使用该协议传输数据本身存在的安全问题:(1)、通信使用明文(不…...

IP-guard浏览器上传下载智能加解密,让管理更省心省力

现在员工日常工作中经常会通过浏览器访问公司的业务系统&#xff08;OA、JIRA等&#xff09;&#xff0c;或者访问其他外部系统&#xff0c;访问下载服务器的文档变得更便捷&#xff0c;工作地点也不再局限于办公室中。为确保应用系统机密安全且又不影响员工的正常工作&#xf…...

leetcode day22 位运算

位运算咋这么老难 剑指 Offer 56 - I. 数组中数字出现的次数 借评论区大佬答案&#xff1a;nums [1,2,10,4,1,4,3,3] a^a0a^0aa^b^ca^c^ba&(-a)最低位为1的二进制&#xff08;从又到左&#xff09;所有的异或结果得到sum2^108flag-8&88可分为两组&#xff0c;一组为与…...

java中如何判断map是否为空

java中判断map是否为空的方法是&#xff1a;利用isEmpty()函数来判断。函数介绍&#xff1a;isEmpty()是Java中用于判断某种容器是否有元素的系统库函数。如用来判断ArrayList&#xff0c;HashSet&#xff0c;HashMap是否有元素等。在Java中&#xff0c;可以用isEmpty();判断一…...

C语言数据结构:链表的增删改查及动态创建

目录 一&#xff0c;链表与数组 ① 定义区别 ② 实现区别 二&#xff0c;链表遍历和计算链表中节点数量 ① 链表遍历 ② 计算节点数量 三&#xff0c;查找链表节点 四&#xff0c;增加节点到链表中 ① 在节点后方插入 ② 在节点前方插入 ● 在头节点前方插入 ● 在…...

「Python 基础」I/O 编程、正则表达式

文章目录1. I/O 编程文件读写StringIO 和 BytesIO操作文件和目录序列化2. 正则表达式进阶re 模块1. I/O 编程 I/O指Input/Output&#xff1b; Input Stream 从外面&#xff08;磁盘、网络&#xff09;流进内存&#xff1b; Output Stream 从内存流到外面&#xff1b; 同步 …...

java 把pdf图片文档和文章文档转成文字的方法

java 提供了一些库和工具可以用来把 PDF 文档和图片文档转成文本。 Apache PDFBox&#xff1a;这是一个开源的 PDF 库&#xff0c;可以用来提取 PDF 文件中的文本内容。 iText&#xff1a;这是一个用于创建和处理 PDF 文件的库&#xff0c;可以用来提取 PDF 文件中的文本内容。…...

JavaScript 中的全部对象

宿主对象&#xff08;host Objects&#xff09;&#xff1a;由 JavaScript 宿主环境提供的对象&#xff0c;它们的行为完全由宿主环境决定。 【 浏览器环境宿主&#xff0c;全局对象window&#xff0c;window 上又有很多属性&#xff0c;如 document。 全局对象 window 上的属…...

【教学典型案例】23.部分服务总是频繁出现掉线情况

目录一&#xff1a;背景介绍问题描述解决二&#xff1a;问题分析过程解决过程设计到的知识1、nacos的data目录作用。2、nacos data目下的protocol目录3、nacos ip混乱问题三&#xff1a;总结一&#xff1a;背景介绍 问题描述 因为某些特殊原因需要把nacos迁移到另一个版本的n…...

线程安全 List 效率测试

List 常见类以及各自优缺点可自行参考 https://blog.csdn.net/weixin_39883065/article/details/111197724 本机环境 java 版本&#xff1a;1.8.0_161 window 信息&#xff1a; 测试代码 下面通过代码测试 List 线程安全类 Vector、Collections.synchronizedList(List lis…...

LeetCode 热题 C++ 581. 最短无序连续子数组 617. 合并二叉树

581. 最短无序连续子数组 给你一个整数数组 nums &#xff0c;你需要找出一个 连续子数组 &#xff0c;如果对这个子数组进行升序排序&#xff0c;那么整个数组都会变为升序排序。 请你找出符合题意的 最短 子数组&#xff0c;并输出它的长度。 示例 1&#xff1a; 输入&am…...

鉴源论坛 · 观模丨模型检查综述

作者 | 李建文 华东师范大学软件工程学院博导 版块 | 鉴源论坛 观模 01 模型检查的历史 模型检查是一种起源于20世纪70年代末的形式化验证技术。该技术最初由Edmund M. Clarke、E. Allen Emerson和Joseph Sifakis提出&#xff0c;他们因在模型检查领域的贡献而获得了2007年的…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

恶补电源:1.电桥

一、元器件的选择 搜索并选择电桥&#xff0c;再multisim中选择FWB&#xff0c;就有各种型号的电桥: 电桥是用来干嘛的呢&#xff1f; 它是一个由四个二极管搭成的“桥梁”形状的电路&#xff0c;用来把交流电&#xff08;AC&#xff09;变成直流电&#xff08;DC&#xff09;。…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...