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

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

思路

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

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 数组中,先创建一个 s e t L b ( ) setLb() 方法,再将此方法添加到 w a l k ( ) 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() 方法如下:

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

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

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

猜你喜欢

转载自blog.csdn.net/weixin_44547562/article/details/103467333
今日推荐