java实现中国象棋4:悔棋及重新开始

news/2024/11/23 0:33:48/

在现实中,我们有可能手抖不小心点到错误的位置导致棋子下错了,这时就应该有个悔棋的功能,让我们能够回到上一步。当然这个功能也是非常容易实现的,下面我将大致地说一下思路。

思路

创建一个数组用来保存棋盘上所有移动。只需要添加以下代码即可。

int[][] lianbiao = new int[99999][6];// 棋子初始位置,现在的位置,棋子的编号,棋子占的位原来的棋子的编号

当我们点击“悔棋”按钮时,将最后一步撤回,即

  1. 将最后移动的棋子移动到的位置原来的棋子(空位)复原;
  2. 将最后移动的棋子返回前一步的位置。

如此,我们即可实现悔棋的功能。下面说一下具体步骤。

一、悔棋方法

按照刚才的思路写即可

	public void Regret_Chess(){r = -1;if (index > 0) {flag[lianbiao[index - 1][0]][lianbiao[index - 1][1]] = lianbiao[index - 1][4];flag[lianbiao[index - 1][2]][lianbiao[index - 1][3]] = lianbiao[index - 1][5];rechessflag();index--;}}

二、重新开始方法

这个比较简单,只需要将棋盘初始化以下即可。

	public void renew() {flag = new int[][] { { 1, 2, 3, 4, 5, 4, 3, 2, 1 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 6, 0, 0, 0, 0, 0, 6, 0 }, { 7, 0, 7, 0, 7, 0, 7, 0, 7 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 77, 0, 77, 0, 77, 0, 77, 0, 77 }, { 0, 66, 0, 0, 0, 0, 0, 66, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 11, 22, 33, 44, 55, 44, 33, 22, 11 } };chessflag = 1;r = -1;x1=0;y1=0;x2=0;y2=0;index=0;beindex=0;chessflag = 1;lianbiao = new int[99999][6];curchess = new int[3];beforechess = new int[3];}

三、按钮的回调函数

	public void actionPerformed(ActionEvent e) {// 获取按钮上的文字action = e.getActionCommand();if (action.equals("开始游戏")) {System.out.println("开始游戏");renew();ui.repaint();} else if (action.equals("重新开始")) {System.out.println("重新开始");renew();ui.repaint();} else if (action.equals("悔棋")) {System.out.println("悔棋");Regret_Chess();ui.repaint();}}

四、保存移动

每次棋子成功移动即可将移动的情况保存在 l i a n b i a o lianbiao lianbiao数组中,先创建一个 s e t L b ( ) setLb() setLb()方法,再将此方法添加到 w a l k ( ) walk() walk()方法中即可。

	// 更新悔棋列表public void setLb() {lianbiao[index][0] = beforechess[0];lianbiao[index][1] = beforechess[1];lianbiao[index][2] = r;lianbiao[index][3] = c;lianbiao[index][4] = beforechess[2];lianbiao[index][5] = flag[r][c];index++;}

更改后的 w a l k ( ) walk() walk()方法如下:

	public void walk(){setLb();// 把此棋子的前后位置保存下来flag[r][c] = beforechess[2];flag[beforechess[0]][beforechess[1]] = 0;ifwin();curchess = new int[3]; // 走完一步后curchess变为0beforechess = new int[3];c = -1;r = -1;rechessflag();ui.repaint();}

至此就完成了悔棋以及重新开始的实现。

关注微信公众号:图灵完备,回复中国象棋即可获得图片及代码资源。


http://www.ppmy.cn/news/430079.html

相关文章

人工智能:博弈--人机中国象棋

为了应付某人的毕设,研究过一段时间的人机象棋,现来谈谈详细的算法思路和流程。 注:本文没有任何干货源码,写过二层遍历、基本评价函数与所谓“深度学习”算法下的人机象棋,棋力之弱小,就不献丑了。 首先&…

使用 HTML、CSS 和 JS 制作一个中国象棋

💂 个人网站:【 摸鱼游戏】【萌怪大冒险】【2048】🤟 风趣幽默的前端学习课程:👉28个案例趣学前端💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼大军】 本文章为系列文章,共100个摸鱼小…

中国象棋AI算法研究

软件:象棋旋风6.2 设置一个困局,人很容易看出最优着法,测试象棋软件的局面评估算法 先上图: 如图:显然这是黑方的一个困局,虽然比红方多一个车和两个馬,但都被困住了, 此时人工对…

java实现中国象棋3:走棋规则的实现

前言 之前我们已经实现了棋子的移动,但是可以发现棋子可以任意移动,不遵循中国象棋的规则,这篇博客便是为了实现中国象棋的走棋规则。在这里默认大家都已经知道中国象棋走棋的规则,如果不知道请自行百度学习。 一、设计 findnum…

Java课程设计—中国象棋(源代码及视频)

你好,我是罡罡同学! 代码谱第一页忘掉心上人,最后一页。。。。。。 打赏一点钱,帮我买包辣条,继续创作,谢谢大家! 大家关注微信公众号 罡罡同学 回复中国象棋 就可以免费获得压缩包啦&#xf…

阿尔法贝塔剪枝——中国象棋人机对战

alpha-beta剪枝算法实现中国象棋人机对战 Github仓库:https://github.com/dick20/Artificial-Intelligence 问题介绍 本实验要求编写一个中国象棋博弈程序,使用alpha-beta剪枝算法,实现人机对弈。因为是人机博弈,因此我们需要使…

【C++】C++下的简易中国象棋

参考自Originum学长的博客,个人进行了一些小修改, 原博客地址:https://blog.csdn.net/Originum/article/details/80356452 联系邮箱:Originum126.com 本人博客地址:Megalomania 一个简单的中国象棋游戏,主要…

matlab识别中国象棋棋盘,一种基于图像处理的中国象棋识别系统及方法与流程

本发明涉及计算机图像识别技术,具体涉及一种基于图像处理的中国象棋识别系统及方法。 背景技术: 数字图像处理技术在机器感知领域应用十分广泛,主要目标是通过一些图像处理技术从图像中提取信息,该信息类似于人们采用语言和文字解释图像内容的过程,使用图像处理技术的典型…