精华内容
下载资源
问答
  • 户端提交MapReduce、Java、Shell、HDFS、SSH、SubWorkflow、Streaming、定时等任务。 请下载使用最新版本的客户端。 前提条件 Oozie组件及客户端已经安装,并且正常运行。 已创建或获取访问Oozie服务的人机用户帐号...

    户端提交MapReduce、Java、Shell、HDFS、SSH、SubWorkflow、Streaming、定时等任务。 请下载使用最新版本的客户端。 前提条件 Oozie组件及客户端已经安装,并且正常运行。 已创建或获取访问Oozie服务的人机用户帐号及密码。 Shell任务:

    user_manager.log 记录用户登录管理的日志。 hyper-tuner-java-profiler.log /工具安装目录/hyper_tuner/thor-server-xxx/log 记录Java性能分析运行日志。 说明: 可执行journalctl -u thor命令查看运行日志。

    v 认证集群用户(未启用kerberos的集群可跳过此步骤)。 人机用户:kinit kerberos用户 机机用户: kinit -kt 认证文件路径 kerberos用户 运行opentsdb样例程序。 java -cp /opt/opentsdb-example/conf:

    work_key_manager.log 记录机机工作密钥更新过程的日志。 certificate_manager.log /工具安装目录/hyper_tuner/user_management/logs/backend 记录读取人机接口证书的日志。 config.log 记录“系统配置”的日志。

    例如安装目录为“/opt/client”,以下操作的客户端目录只是举例,请根据实际安装目录修改。 各组件业务用户由系统管理员根据业务需要创建。安全模式下,“机机”用户需要下载keytab文件。“人机”用户第一次登录时需修改密码。普通模式不需要下载keytab文件及修改密码操作。 操作步骤 以客户端安装用户,登录安装客户端的节点。

    介绍几个Go语言及相关开源框架的插件机制 跟唐老师学习云网络 唐老师将自己对网络的理解分享给大家 智能客服 您好!我是有问必答知识渊博的的智能问答机器人,有问题欢迎随时求助哦! 社区求助 华为云社区是华为云用户的聚集地。这里有来自容器服务的技术牛人,为您解决技术难题。

    在MRS Manager界面选择“系统设置 > 用户管理 > 添加用户”,为样例工程创建一个用户。填写用户名例如flinkuser,用户类型为“人机”用户,加入用户组flinkgroup和hadoop,并绑定角色flinkrole取得权限,单击“确定”。 在客户端修改flinkuser密码后才能使用本用户。

    已安装HDFS客户端或者包括HDFS的客户端。例如安装目录为“/opt/client”。 各组件业务用户由系统管理员根据业务需要创建。安全模式下,“机机”用户需要下载keytab文件。“人机”用户第一次登录时需修改密码(普通模式不涉及)。 操作步骤 以客户端安装用户,登录安装客户端的节点。 执行以下命令,切换到客户端安装目录。

    什么是语音交互服务 语音交互服务(Speech Interaction Service,简称SIS)是一种人机交互方式,用户通过实时访问和调用API获取语音交互结果。例如用户通过语音识别功能,将口述音频、普通话或者带有一定方言的语音文件识别成可编辑的文本,同时也支持通过语音合成功

    语音交互目前支持Java SDK、Python SDK。 通过对语音交互提供的REST API进行的封装,以简化用户的开发工作。用户直接调用语音交互SDK提供的接口函数即可实现使用语音交互业务能力的目的。 Java接口与API对应关系 Java接口与API对应关系请参见表 Java接口与API对应关系表。

    语音交互服务使用简介 语音交互服务(Speech Interaction Service,简称SIS)是一种人机交互方式,用户通过实时访问和调用API获取语音交互结果。例如用户通过语音识别功能,将口述音频、普通话或者带有一定方言的语音文件识别成可编辑的文本,同时也支持通过语音合成

    语音交互服务使用简介 语音交互服务(Speech Interaction Service,简称SIS)是一种人机交互方式,用户通过实时访问和调用API获取语音交互结果。例如用户通过语音识别功能,将口述音频、普通话或者带有一定方言的语音文件识别成可编辑的文本,同时也支持通过语音合成

    如果集群启用了安全服务,按登录方式需要进行以下配置: keytab方式:需要从管理员处获取一个“人机”用户,用于登录FusionInsight Manager平台并通过认证,并且获取到该用户的keytab文件。 票据方式:从管理员处获取一个“人机”用户,用于后续的安全登录,开启Kerberos服务的renewa

    例如安装目录为“/opt/client”,以下操作的客户端目录只是举例,请根据实际安装目录修改。 各组件业务用户由系统管理员根据业务需要创建。安全模式下,“机机”用户需要下载keytab文件。“人机”用户第一次登录时需修改密码。(普通模式不涉及) 操作步骤 以客户端安装用户,登录安装客户端的节点。 执行以下命令,切换到客户端安装目录。

    如果集群启用了安全服务,按登录方式分为以下两种: keytab方式:需要从管理员处获取一个“人机”用户,用于登录FusionInsight Manager平台并通过认证,并且获取到该用户的keytab文件。 票据方式:从管理员处获取一个“人机”用户,用于后续的安全登录,开启Kerberos服务的renewa

    展开全文
  • 内容索引:JAVA源码,游戏娱乐,中国象棋,人机对战 Java版中国象棋人机对战源代码,作者将AI算法用得淋漓尽致,具有很高的学习研究价值。运行时如截图所示。  
  • java版中国象棋人机对战源代码

    热门讨论 2010-05-01 18:17:14
    java版中国象棋人机对战源代码,作者将ai算法用得淋漓尽致
  • 这是一款很不错的中国象棋人机对战游戏源码,该游戏的功能非常强大,Java版中国象棋人机对战源代码,作者将AI算法用得淋漓尽致,具有很高的学习研究价值。
  • cchess Java版中国象棋人机对战源代码
  • 《中国象棋人机对战java做的源代码《中国象棋人机对战java做的源代码
  • java象棋(人机对战)

    2007-12-26 20:10:26
    一个java做的象棋源代码,人机对战,不错的AI算法,超有学习价值
  • Java实现中国象棋(人机对战)

    千次阅读 多人点赞 2020-07-16 15:44:56
    人机对战 移动动画 我方永远是下方 成品视频 Java制作的中国象棋+简单AI 更多实战内容请进入我的实战专栏:https://blog.csdn.net/qq_41806966/category_9656338.html 点个关注吧~ 需要源码点这里:...

    目录

    简介

    成品视频

    实现思路

    界面实现分为了三块

    棋盘抽象类

    按钮组抽象类

    棋子绘制接口

    棋盘界面实现

    棋子的实现

    按钮组的实现

    监听工厂和监听类

    棋盘绘制类的实现

    开始游戏实现

    停止游戏实现

    游戏抽象类

    游戏实现类

    可走路线和吃棋判断实现

    车(ju)

    兵/卒

    相/象

    仕/士

    人机AI实现

    实现思路

    结尾



    简介

    Hello,I'm Shendi

    花了五天时间用 Java 写了一个中国象棋.

    拥有大概如下功能

    1. 象棋基本功能
    2. 可走路线点显示
    3. 人机对战
    4. 移动动画
    5. 我方永远是下方

    成品视频

    Java制作的中国象棋+简单AI

     

    更多实战内容请进入我的实战专栏https://blog.csdn.net/qq_41806966/category_9656338.html

    点个关注吧~

    需要源码点这里: https://github.com/1711680493/Application

    右上角有个小星星(star),点一下~


    实现思路

    刚开始写的时候没想太多,想得很简单(于是最终我写了五天才写完)

    如往常一样,我写桌软喜欢用两个类,一个类用于启动,一个代表窗体

    于是启动类代码就如下

    我们初始化都在构造方法中完成,初始化完成后在显示.

    但是有一些东西是不能在构造方法内使用的(比如需要在类初始化完成在用的东西)

    所以我格外写了一个onCreate函数,在类创建完后调用此函数


    界面实现分为了三块

    为了扩展,我将界面实现分为了三块

    1. 棋盘
    2. 绘制棋子
    3. 按钮组

    这三大界面在 MainView 中创建初始化,并以静态的方式提供出去(因为不需要运行时改变)

    通过反射+配置文件形式获取到对应的三个类(对扩展开放)

     

    窗体布局为绝对布局,设置了棋盘颜色和按钮组颜色,并给三块都进行了初始化

    既然分了三块,那就需要三个接口/抽象类


    棋盘抽象类

    棋盘继承JPanel,所以需要是抽象类.

    主要功能是绘制棋盘

    代码如下


    按钮组抽象类

    按钮组就是右边那一块,用于显示和实现功能按钮

    代码如下


    棋子绘制接口

    主要功能是绘制和保存棋子,以及开始游戏和结束游戏逻辑实现,里面包含具体游戏逻辑类

    代码如下


    棋盘界面实现

    因为三大界面都是可扩展的,所以我只做了一套默认的

    绘制其实没什么难度,棋盘如下

    不管背景颜色(背景颜色是设置JPanel的),具体的就是画线条

    棋盘是 9*10的

    有十条横线,所以可以直接循环

    竖线也是,但是要在和中间停一次,下面继续绘制

    中间的文字就是直接写上去的,设置一下字体,位置

    代码如下


    棋子的实现

    棋子也容易实现

    通过观察象棋,其实就是两个实心圆+一个空心圆+一个字

    我做了可以自适应大小的象棋,有一段测试代码,在 ChessFactory 类里,我没有删掉,运行起来结果是这样的

    并且改一下大小,绘制的棋子也会跟着改变大小

    测试的代码如下

    /**
     * 测试 棋子.
     * @author Shendi <a href='tencent://AddContact/?fromId=45&fromSubId=1&subcmd=all&uin=1711680493'>QQ</a>
     * @param args null
     */
    public static void main(String[] args) {
    	JFrame frame = new JFrame("Test");
    	JLabel chess = new JLabel();
    	chess.setBounds(0, 0, 200, 200);
    	int width = 100;
    	int height = 100;
    	BufferedImage img = new BufferedImage(200,200,BufferedImage.TYPE_INT_ARGB);
    	Graphics g = img.getGraphics();
    	g.setColor(Color.BLACK);
    	g.fillRoundRect(0, 0, width, height, 180, 180);
    	g.setColor(Color.YELLOW);
    	int backgroundX = (int)(width - width * 0.9) / 2;
    	int backgroundWidth = (int)(width * 0.9);
    	int backgroundHeight = (int)(height * 0.8);
    	g.fillRoundRect(backgroundX, 0, backgroundWidth, backgroundHeight, 180, 180);
    	g.setColor(Color.RED);
    	g.drawRoundRect(backgroundX << 1, backgroundX, backgroundHeight, backgroundHeight - (backgroundX << 1), 180, 180);
    	g.setFont(new Font("仿宋", Font.BOLD, (width + height) >> 2));
    	g.drawString("车", width >> 2, (int)(height * 0.6));
    	g.dispose();
    	chess.setIcon(new ImageIcon(img));
    	
    	BufferedImage img2 = new BufferedImage(200,200,BufferedImage.TYPE_INT_ARGB);
    	Graphics g2 = img2.getGraphics();
    	g2.setColor(Color.RED);
    	g2.fillRoundRect(0, 0, 200, 200, 180, 180);
    	g2.drawString("車", 0, 0);
    	
    	chess.addMouseListener(new MouseAdapter() {
    		
    		@Override
    		public void mouseClicked(MouseEvent e) {
    			chess.setIcon(new ImageIcon(img2));
    		}
    		
    	});
    	
    	frame.setLayout(null);
    	frame.add(chess);
    	frame.setVisible(true);
    	frame.setSize(300, 300);
    	frame.setDefaultCloseOperation(3);
    }

    因为象棋绘制都是一样的,除了个别颜色不同,所以我做了一个工厂类.

    这个工厂类专门生产象棋,有一个生产默认象棋的方法如下

    至于除了棋子的文字为什么还需要另外两个文字则是游戏所需


    按钮组的实现

    按钮组就两个按钮,一个开始,一个停止.


    监听工厂和监听类

    因为后期需要很多监听

    所以做了一个监听工厂类,用于方便的获取对应监听

     

    其中ButtonActionListener是专门处理按钮事件的监听

    目前的按钮只包含开启和停止按钮,停止按钮默认灰色,当点击开始按钮的时候就将状态改变(开始灰,停止亮)

    并且开启和停止对应于棋子绘制类的start和stop

    代码如下

    上面的开启完成后需要重新绘制是因为我之前写的时候在 start 方法中将棋子添加进棋盘,后面改进了,在init初始化的时候就将棋子添加进棋盘,所以重新绘制这两行代码可以舍去

     

    LabelMouseListener是label的鼠标监听,我们的象棋都是一个JLabel,所以这个类很重要,但是因为除了我们的棋子,可能还有其他JLabel来使用此类,所以我们没有进行处理的点击事件丢给另外一个类进行处理---Game

    代码如下

    只有玩家才会有点击事件


    棋盘绘制类的实现

    这个类是游戏中最重要的一部分.

    在初始化方法 init() 的时候会创建对应棋子保存起来(享元模式)

    并且包含很多操作,实现... 主要用于管理游戏数据

    代码四百多行

    说下游戏思路,我们的游戏场景实际上是一个二维数组,里面每一个棋子都在一个具体的位置.

    我将数组空白地方的每一个点做成了一个JLabel,并且是一个小红点,name和text中都包含 冒号:,所以我们可以通过这个来实现当前棋子可走路线,并且可以知道是吃棋还是走棋

    并且还有四个JLabel用于表示棋子是否是可吃的(每次可吃的棋子不会超过四个),不存入数组,而是直接移动位置

    通过界面上的x,y来进行一定计算得到具体数组的位置,所以封装了一个方法在这个类里

    因为位置都是固定的,为了节省开销,避免每次计算,所以将计算结果保存起来,直接获取即可

    获取不到需要用近似值获取(因为计算的时候可能损失精度 -1,+1)

    以及还有选择框

    此类处理开始和停止游戏,所以会将初始状态进行保存.

    这里上一部分代码

    定义的一些变量

    构造方法,初始化选择框,位置和可走路线图片

    可走路线图片就是一个小圆点,通过上面这种计算可以保持位置在组件的中间

    init 方法,创建所有的棋子,因为使用的HashMap,所以棋子名都必须唯一(人机也需要用到)

     

     

    对应的小圆点组件

     

     


    开始游戏实现

    在开始游戏的时候我们会随机分配队伍,并且我方队伍永远在下方

    如何让我方队伍永远在棋盘的下方?

    只需要做一个判断,然后对y轴取反就ok了

    代码如下,redBlack=true代表我方是红队反之黑队

    停止游戏实现

    将一些状态恢复.

    代码如下


    游戏抽象类

    在开始游戏后,我们的棋子就有了对应的监听,并且我们制作的是人机对战的,红棋先走

    所以我们需要一个游戏抽象类,除了用户使用之外,人机AI也需要使用

     

    游戏类里具体干嘛的?

    具体实现游戏逻辑,比如棋子的点击事件,吃棋行走等,因为有人机,所以游戏类里需要知道人机是什么阵营,玩家是什么阵营

    并且点击事件需要传递这个阵营过去(比如自己方不能吃自己方)

    抽象类有以下属性

    在被创建的时候就将对应AI也创建了出来,从配置文件中使用反射获取(我用的自己写的类获取配置文件内容)

    在抽象类中也需要初始化,游戏开始的时候就进行初始化,需要知道玩家是什么阵营,然后定义人机是什么阵营

    并且我们实现此抽象类的子类可能也需要初始化,所以提供一个抽象无参方法init

    只有玩家才有点击事件,只有玩家的回合才可以执行点击事件

    我们人机也需要模仿点击事件,所以新增一个抽象方法,多了一个阵营参数

    我们游戏结束的时候需要调用一下Game的stop方法

    我们在执行完一次有效操作后棋子都会移动,所以在移动后我们就知道某一方下完了,如果是玩家下完我们就要让人机去下棋

    并且移动的时候做了个动画(不是干巴巴的瞬移),具体动画效果给子类实现


    游戏实现类

    此类代码有1300多行,包含所有棋子的逻辑...

    首先,我们在点击棋子的时候需要显示可走路线(这一点人机也用到了),然后点击可走路线进行操作,或者直接点击棋子进行吃棋

    一个有效的操作必须是最少执行了两次 onClick 方法(选棋和执行操作)

    所以我们有一段代码如下

    如果不是选棋则执行了这段代码后就不会往下执行

    每一个棋子都有不同的走法,所以我们需要一个个去实现

    我们在场景中通过判断数组元素是否带 冒号 : 来区分是否为棋子(不带冒号为棋子)

    所以不是选棋默认为走棋

    然后移动的动画代码实现如下


    可走路线和吃棋判断实现

    因为代码过多,所以这里着重思路

    我们的可走路线都在场景中,并且是隐藏的,当点击棋子后,会显示出来

    吃棋方法的共有参数

    车(ju)

    车只能走直线,直线吃,不能越棋子,所以这个可走路线比较好实现

    只要循环,左,右,上,下

    上面这部分代码是左边的可走路线,一个for循环一个方向(这里只贴出一个方向,其余的类似)

    场景中带冒号的为空点,所以循环到不带冒号的就停下,并且如果这个棋子是地方的,就要用格外的点来显示出来(可以吃的,上面说过,有四个格外的点用于显示可以吃的路线)

    在吃棋的时候我们要判断是否走斜线了(不判断就可以飞),并且是否中间有棋子

    炮和车差不多,不同的是炮不能直线吃,但是可以隔子吃.

    实现思路就是就是循环...碰到一个子的时候就继续循环,看还有没有下一个子,如果有那就是可以打的

    这里也只上左边的代码

    在吃棋的时候我们只用计算目标棋子和当前棋子中隔了几个棋子

    将军只能走一格,并且只能在对应格子内出不去,将军如果碰面可以直接吃

    上面的代码左右走是这样的,上下走就需要判断是人机还是玩家(玩家的在下方,人机的在上方)

    并且需要判断是否碰面

    // 玩家上下[y|7 <= y <= 9]
    if (redBlack == dChess.redBlack) {
    	if (y > 7) {
    		var text = scene[y - 1][x];
    		if (!text.contains(":")) {
    			if (isShowNullChess(text)) {
    				JLabel nullChess = dChess.getNullChess(String.valueOf(eatChess));
    				eatChess++;
    				nullChess.setLocation(chess.getX(), dChess.getPos(y - 1));
    				nullChess.setVisible(true);
    				nullChesses.add(nullChess);
    			}
    		} else {
    			JLabel nullChess = dChess.getNullChess(text);
    			nullChess.setVisible(true);
    			nullChesses.add(nullChess);
    		}
    		// 先看对方将是否和己方在同一直线上,是则看中间有无别的棋子.
    		F:for (int i = 0;i < 3;i++) {
    			var chessName = scene[i][x];
    			if ("红帅".equals(chessName) || "黑将".equals(chessName)) {
    				for (int j = i + 1;j < y;j++) {
    					if (!scene[j][x].contains(":")) {
    						break F;
    					}
    				}
    				JLabel eatNullChess = dChess.getNullChess(String.valueOf(eatChess));
    				eatChess++;
    				eatNullChess.setLocation(chess.getX(), dChess.getPos(i));
    				eatNullChess.setVisible(true);
    				nullChesses.add(eatNullChess);
    				break;
    			}
    		}
    	}
    	if (y < 9) {
    		var text = scene[y + 1][x];
    		if (!text.contains(":")) {
    			if (isShowNullChess(text)) {
    				JLabel nullChess = dChess.getNullChess(String.valueOf(eatChess));
    				eatChess++;
    				nullChess.setLocation(chess.getX(), dChess.getPos(y + 1));
    				nullChess.setVisible(true);
    				nullChesses.add(nullChess);
    			}
    		} else {
    			JLabel nullChess = dChess.getNullChess(text);
    			nullChess.setVisible(true);
    			nullChesses.add(nullChess);
    		}
    	}
    // 人机上下[y|0 <= y <= 2]
    } else {
    	if (y < 2) {
    		var text = scene[y + 1][x];
    		if (!text.contains(":")) {
    			if (isShowNullChess(text)) {
    				JLabel nullChess = dChess.getNullChess(String.valueOf(eatChess));
    				eatChess++;
    				nullChess.setLocation(chess.getX(), dChess.getPos(y + 1));
    				nullChess.setVisible(true);
    				nullChesses.add(nullChess);
    			}
    		} else {
    			JLabel nullChess = dChess.getNullChess(text);
    			nullChess.setVisible(true);
    			nullChesses.add(nullChess);
    		}
    		// 先看对方将是否和己方在同一直线上,是则看中间有无别的棋子.
    		F:for (int i = 9;i > 6;i--) {
    			var chessName = scene[i][x];
    			if ("红帅".equals(chessName) || "黑将".equals(chessName)) {
    				for (int j = i - 1;j > 0;j--) {
    					if (!scene[j][x].contains(":")) {
    						break F;
    					}
    				}
    				JLabel eatNullChess = dChess.getNullChess(String.valueOf(eatChess));
    				eatChess++;
    				eatNullChess.setLocation(chess.getX(), dChess.getPos(i));
    				eatNullChess.setVisible(true);
    				nullChesses.add(eatNullChess);
    				break;
    			}
    		}
    	}
    	if (y > 0) {
    		var text = scene[y - 1][x];
    		if (!text.contains(":")) {
    			if (isShowNullChess(text)) {
    				JLabel nullChess = dChess.getNullChess(String.valueOf(eatChess));
    				eatChess++;
    				nullChess.setLocation(chess.getX(), dChess.getPos(y - 1));
    				nullChess.setVisible(true);
    				nullChesses.add(nullChess);
    			}
    		} else {
    			JLabel nullChess = dChess.getNullChess(text);
    			nullChess.setVisible(true);
    			nullChesses.add(nullChess);
    		}
    	}
    }

    吃棋的时候同样也要判断

    // 将/帅 只走一格,碰面可直接吃
    case "红帅":
    case "黑将":
    	// 左右吃,要在指定格子内只能在指定范围 [x|3 <= x <= 5]
    	if (xOffset != 0 && yOffset != 0) return;
    	if (yOffset == 0) {
    		if (xOffset != -1 && xOffset != 1 || (x < 3 || x > 5)) return;
    	} else {
    		// 判断有无碰面
    		boolean isEat = true;
    		if (redBlack == dChess.redBlack) {
    			if (yOffset < 0) {
    				for (int i = upY - 1;i >= y;i--) {
    					if (!scene[i][x].contains(":")) {
    						var chessName = scene[i][x];
    						if ("红帅".equals(chessName) || "黑将".equals(chessName)) {
    							isEat = false;
    						}
    						break;
    					}
    				}
    			}
    			// 上下吃,在指定范围内[y|7 <= y <= 9]
    			if (isEat)
    				if (yOffset != -1 || yOffset != 1 && (y < 7 || y > 9)) return;
    		} else {
    			if (yOffset > 0) {
    				for (int i = upY + 1;i <= y;i++) {
    					if (!scene[i][x].contains(":")) {
    						var chessName = scene[i][x];
    						if ("红帅".equals(chessName) || "黑将".equals(chessName)) {
    							isEat = false;
    						}
    						break;
    					}
    				}
    			}
    			// 上下吃,在指定范围内[y|0 <= y <= 2]
    			if (isEat)
    				if (yOffset != -1 || yOffset != 1 && (y < 0 || y > 2)) return;
    		}
    	}
    	break;

    马的可走路线代码比较多,马可以走八个点,左边两个(左上左下),右边两个,上边两个,下边两个

    被拦住不能走,比如说往上面跳,马上面有棋就不能跳

    下面是左边两个点的代码,其余几个方向都是差不多

    private void selectMa(JLabel chess,String[][] scene) {
    	// 马跳日,路前不能有棋子.
    	int x = dChess.getPos(chess.getX());
    	int y = dChess.getPos(chess.getY());
    	
    	// 左右上下,每一边都有两个点,左边的话,棋子左边不能有棋,右上下同样.
    	if (x >= 2 && scene[y][x - 1].contains(":")) {
    		// 左边的上面
    		if (y > 0) {
    			var text = scene[y - 1][x - 2];
    			if (isShowNullChess(text)) {
    				if (!text.contains(":")) {
    					JLabel nullChess = dChess.getNullChess(String.valueOf(eatChess));
    					eatChess++;
    					nullChess.setLocation(dChess.getPos(x - 2), dChess.getPos(y - 1));
    					nullChess.setVisible(true);
    					nullChesses.add(nullChess);
    				} else {
    					JLabel nullChess = dChess.getNullChess(text);
    					nullChess.setVisible(true);
    					nullChesses.add(nullChess);
    				}
    			}
    		}
    		// 左边的下面,竖排有十格
    		if (y < 9) {
    			var text = scene[y + 1][x - 2];
    			if (isShowNullChess(text)) {
    				if (!text.contains(":")) {
    					JLabel nullChess = dChess.getNullChess(String.valueOf(eatChess));
    					eatChess++;
    					nullChess.setLocation(dChess.getPos(x - 2), dChess.getPos(y + 1));
    					nullChess.setVisible(true);
    					nullChesses.add(nullChess);
    				} else {
    					JLabel nullChess = dChess.getNullChess(text);
    					nullChess.setVisible(true);
    					nullChesses.add(nullChess);
    				}
    			}
    		}
    	}

    马吃棋就是一堆判断了.只能吃指定的点

    兵/卒

    兵和卒只能往前走,过河可以横着走

    过河需要分人机和玩家进行对应处理(判断格子)

    这里是玩家过河左边可走路线显示的代码

    吃棋的时候判断是不是离自己一个格子,并且是不是上方,过河了可以左右

    相/象

    相飞田,田中间不能有棋子,并且不能过河,所以也要区分玩家和人机进行分别处理

    代码如下

     吃棋判断如下

    仕/士

    士和将军一样只能在对应格子里,所以也要区分人机和玩家,并且士走斜线

     吃棋判断就比较简单了,只要不出格就行


    人机AI实现

    首先为了代码的扩展性肯定需要写一个接口,所以AI接口代码如下

    实现思路

    上面我们写的代码已经可以让ai使用我们的onClick了,我们现在只需要让ai下棋即可

    这里我的思路非常简单(不那么聪明的 AI)

    有棋则吃棋,无棋则随机行走.

    在实现这种ai的时候需要把我方棋子和对方棋子存起来

    然后循环遍历我方棋子,并且每一个棋子遍历对方棋子判断是否可以吃(棋子是否消失)

    不能吃就随机行走(使用递归)


    结尾

    亲手制作了象棋后才知道象棋和贪吃蛇,推箱子这种不是一个级别的

    第一次做这种游戏会踩很多坑,以至于浪费很多宝贵的时间去修复bug(比如我的棋子莫名其妙的就飞了,棋子不能吃什么的...

    在人机AI方面可以优化一下,将所有棋子设置对应权重,比如将军最高,其他棋子需要保护...等

    需要源码的可以盗我的github中,ChineseChess项目,github链接在顶端

    点击关注,进我专栏有惊喜.

    展开全文
  • 随着人工智能及计算机硬件的发展,计算机象棋程序的下棋水平也不断地得到提高。20世纪60年代初,麦卡锡提出了alpha-beta修剪算法,把为决定下一个走步而需对棋盘状态空间的搜索量从指数级减少为指数的平方根,大大地...
  • java实现的人机博弈中国象棋,对象棋算法有兴趣的可下载来学习
  • Java制作五子棋人机对战

    千次阅读 2020-07-20 22:38:58
    人机对战 游戏思路 五子棋相比其他棋牌游戏比较简单 我们判断胜负只需要在玩家/人机下棋处循环遍历 上下是不是连起来到了指定点数 左右... 左斜 右斜 源码 github:https://github.com/1711680493/Applica..

    目录

     

    简介

    游戏思路

    源码

    效果视频

    代码片段


    简介

    Hello,I'm Shendi

    继上次写完象棋后又花了一天时间写了个五子棋,比较简单

    拥有大概如下功能

    1. 五子棋的基本功能
    2. 棋盘大小的自由设置
    3. 胜利棋数的自由设置
    4. 人机对战

    游戏思路

    五子棋相比其他棋牌游戏比较简单

    我们判断胜负只需要在玩家/人机下棋处循环遍历

    • 上下是不是连起来到了指定点数
    • 左右...
    • 左斜
    • 右斜

    源码

    github: https://github.com/1711680493/Application#gobang


    效果视频

    Java制作五子棋/连珠棋+简单AI


    代码片段

    棋盘,棋子绘制代码

    /**
     * 重新绘制棋盘.
     * @author Shendi <a href='tencent://AddContact/?fromId=45&fromSubId=1&subcmd=all&uin=1711680493'>QQ</a>
     * @param chessBoardNum 棋盘大小
     */
    public void repaint(int chessBoardNum) {
    	BufferedImage img = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
    	Graphics g = img.getGraphics();
    	
    	size = 380 / chessBoardNum;
    	first = size >> 1;
    	
    	// 棋子大小初始化
    	Game.getGame().getChesses().forEach((chess) -> chess.setSize(size,size));
    	
    	// 将棋盘上所有位置初始化
    	positions.clear();
    	for (int i = 0;i < chessBoardNum;i++) {
    		positions.put(i, first + size * i);
    	}
    	
    	// 绘制棋盘
    	for (int i = 1;i < chessBoardNum;i++) {
    		// 横线
    		g.drawLine(size, size * i, 380, size * i);
    		// 竖线
    		g.drawLine(size * i, size, size * i, 380);
    	}
    	g.drawLine(size, 380 , 380, 380);
    	g.drawLine(380, size, 380, 380);
    	g.dispose();
    	background.setIcon(new ImageIcon(img));
    	invalidate();
    	repaint();
    	
    	// 白色黑色棋子图
    	int imgPos = (size - size / 2) >> 1;
    	int imgSize = size >> 1;
    	
    	BufferedImage whiteChessImg = new BufferedImage(size,size,BufferedImage.TYPE_INT_ARGB);
    	g = whiteChessImg.getGraphics();
    	g.setColor(Color.WHITE);
    	g.fillRoundRect(imgPos, imgPos, imgSize, imgSize, 180, 180);
    	g.dispose();
    	
    	BufferedImage blackChessImg = new BufferedImage(size,size,BufferedImage.TYPE_INT_ARGB);
    	g = blackChessImg.getGraphics();
    	g.setColor(Color.BLACK);
    	g.fillRoundRect(imgPos, imgPos, imgSize, imgSize, 180, 180);
    	g.dispose();
    	
    	whiteChessIcon = new ImageIcon(whiteChessImg);
    	blackChessIcon = new ImageIcon(blackChessImg);
    }

     

    判断游戏逻辑代码

     

    /**
     * 执行下棋操作.
     * @author Shendi <a href='tencent://AddContact/?fromId=45&fromSubId=1&subcmd=all&uin=1711680493'>QQ</a>
     * @param chess 棋子
     * @param whiteBlack 白棋还是黑棋.
     */
    public void exec(JLabel chess,boolean whiteBlack) {
    	// 指定位置是否有棋子,有不做操作
    	int x = chessBoard.getScenePos(chess.getX());
    	int y = chessBoard.getScenePos(chess.getY());
    	if (scene[y][x] != 0) { return; }
    	// 下棋
    	int team = whiteBlack ? 1 : 2;
    	scene[y][x] = team;
    	
    //		for (int[] xScene : scene) System.out.println(Arrays.toString(xScene));
    	
    	if (whiteBlack) chess.setIcon(chessBoard.whiteChessIcon);
    	else chess.setIcon(chessBoard.blackChessIcon);
    	// 判断胜负,横竖斜有指定数量棋子则胜利,对方失败
    	int h = 1,v = 1,ld = 1,rd = 1;
    	
    	// 横,左右
    	int posX,posY;
    	for (int i = 1;i < chessBoardNum;i++) {
    		posX = x - i;
    		if (posX < 0) break;
    		if (scene[y][posX] == team) h++; else break;
    	}
    	for (int i = 1;i < chessBoardNum;i++) {
    		posX = x + i;
    		if (posX >= chessBoardNum) break;
    		if (scene[y][posX] == team) h++; else break;
    	}
    	
    	// 竖,上下
    	for (int i = 1;i < chessBoardNum;i++) {
    		posY = y - i;
    		if (posY < 0) break;
    		if (scene[posY][x] == team) v++; else break;
    	}
    	for (int i = 1;i < chessBoardNum;i++) {
    		posY = y + i;
    		if (posY >= chessBoardNum) break;
    		if (scene[posY][x] == team) v++; else break;
    	}
    	
    	// 左斜,上左下右 \
    	for (int i = 1;i < chessBoardNum;i++) {
    		posX = x - i;
    		posY = y - i;
    		if (posX < 0 || posY < 0) break;
    		if (scene[posY][posX] == team) ld++; else break;
    	}
    	for (int i = 1;i < chessBoardNum;i++) {
    		posX = x + i;
    		posY = y + i;
    		if (posX >=  chessBoardNum || posY >= chessBoardNum) break;
    		if (scene[posY][posX] == team) ld++; else break;
    	}
    	
    	// 右斜,上右下左 /
    	for (int i = 1;i < chessBoardNum;i++) {
    		posX = x + i;
    		posY = y - i;
    		if (posX >= chessBoardNum || posY < 0) break;
    		if (scene[posY][posX] == team) rd++; else break;
    	}
    	for (int i = 1;i < chessBoardNum;i++) {
    		posX = x - i;
    		posY = y + i;
    		if (posX < 0 || posY >= chessBoardNum) break;
    		if (scene[posY][posX] == team) rd++; else break;
    	}
    	
    	if (h >= vectoryNum || v >= vectoryNum || ld >= vectoryNum || rd >= vectoryNum) {
    		stop(whiteBlack);
    		return;
    	}
    	
    	// 当前角色下棋完成,换一边
    	currentTeam = !currentTeam;
    	if (!currentTeam) AI.getAI().play();
    }

     

    展开全文
  • 可以用于玩家之间相互对战象棋源码。 可以进一步设计成人机对战象棋。 为了设计成人机对战象棋,相关的数据结构已经设计好。 这个程序时ox 系统下编写的,win下的用户请自行修改代码里面修改读取文件的路径名...
  • 该系统包括人人对战、人机对战等功能模块。人人对战规则明确,包含了中国象棋所有的招法;人机对战中电脑棋力,便了不同水平人群的不同选择。 .文档 │ │ 商品测试文档.docx │ │ 软件工程pk项目概要设计说

    点击查看:Java Swing中国象棋AI(人机和人人对战)

    文件大小:2.5M

    操作系统:Windows10旗舰版

    开发工具:Eclipse2021、JDK1.8

    开发语言:. java

    简要概述:

    结合在中国象棋机器博弈方面的实践经验,在分析了中国象棋游戏需求基础上,设计并实现了中国象棋系统。该系统包括人人对战、人机对战等功能模块。人人对战规则明确,包含了中国象棋所有的招法;人机对战中电脑棋力,便了不同水平人群的不同选择。
    在这里插入图片描述
    .文档
    │ │ 商品测试文档.docx
    │ │ 软件工程pk项目概要设计说明书.docx
    │ │ 软件工程pk项目详细设计说明书.docx
    │ └ 软件工程pk项目需求分析说明书.docx

    展开全文
  • 中国象棋java版,支持人机和网络对战,对学习java有极大地好处。。。。
  • Java中国象棋联机代码

    2017-12-28 18:54:17
    中国象棋,用java写的,还没写人机对战,不过已经内置了人机对战的接口。大学作业作品,主要是用java写的。目前可以实现局域网对战,本地双人对战。支持悔棋、认输功能。还有因为作业要求加入的数据库使用的方法。
  • java象棋,AI引擎

    2007-09-25 16:26:37
    1.人机对战(AI搜索,开局库) 2.网络对战(网络连接,观战) 3.计时规则 4.棋谱的读入与存储 请看"说明.txt" 这是打包的文件,源码请到 需要源码货设计文档请联系msn:acerge@163.com。源码是Eclipse的...
  • web版中国象棋源码java

    热门讨论 2011-10-28 23:16:35
    web版中国象棋,用jsp开发,分为大众厅和电脑厅,是为学习java而开发的,这是第一个release版本。其中人工智能感谢javry,《Java版中国象棋人机对战源代码》http://download.csdn.net/detail/javry/1305108
  • java版中国象棋设计

    2011-10-13 00:31:34
    java版中国象棋项目设计论文,详细描述了中国象棋的实现过程,实现了人机对战
  • java开发中国象棋游戏

    2011-08-12 20:59:49
    java开发中国象棋游戏,开发中国象棋游戏,其中实现了不同水平的人机对战,值得一看。
  • java编写的网络象棋

    2008-12-18 10:33:29
    是一个完整的java网络象棋游戏,有文档和论文,详细易懂,实现了人人对战,人机对战和网络对战
  • java简单实现中国象棋

    千次阅读 多人点赞 2020-05-17 22:39:43
    可以实现简单的人机对战功能,棋子移动会插入关键帧,可以悔棋等功能 运行效果 import java.awt.Canvas; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event....
  • 中国象棋java开源版

    2012-12-11 18:19:31
    中国象棋java开源版,拥有基本的AI,能够完成简单的人机对战,应该是可以学习下的!
  • 一些中国象棋程序Java版中国象棋人机对战源代码,acerge@163.com, QQ:554653408gmchess hoxchess
  • 1.利用网络编程模拟实现了象棋的双人对战(端口实现) 2.未增加人机对战模块 3.代码较为简单,仅供参考
  • 中国象棋(java版)

    2007-08-15 11:04:18
    就是一个java做的中国象棋 可是不能人机对战!!!!!!! 希望大家使用愉快!!!!!!!

空空如也

空空如也

1 2 3
收藏数 60
精华内容 24
关键字:

java象棋人机对战

java 订阅