當(dāng)前位置:首頁(yè) > IT技術(shù) > 編程語(yǔ)言 > 正文

java實(shí)現(xiàn)中國(guó)象棋4:悔棋及重新開始
2021-12-01 23:10:02


在現(xiàn)實(shí)中,我們有可能手抖不小心點(diǎn)到錯(cuò)誤的位置導(dǎo)致棋子下錯(cuò)了,這時(shí)就應(yīng)該有個(gè)悔棋的功能,讓我們能夠回到上一步。當(dāng)然這個(gè)功能也是非常容易實(shí)現(xiàn)的,下面我將大致地說(shuō)一下思路。

思路

創(chuàng)建一個(gè)數(shù)組用來(lái)保存棋盤上所有移動(dòng)。只需要添加以下代碼即可。

int[][] lianbiao = new int[99999][6];// 棋子初始位置,現(xiàn)在的位置,棋子的編號(hào),棋子占的位原來(lái)的棋子的編號(hào)

當(dāng)我們點(diǎn)擊“悔棋”按鈕時(shí),將最后一步撤回,即


  1. 將最后移動(dòng)的棋子移動(dòng)到的位置原來(lái)的棋子(空位)復(fù)原;
  2. 將最后移動(dòng)的棋子返回前一步的位置。

如此,我們即可實(shí)現(xiàn)悔棋的功能。下面說(shuō)一下具體步驟。

一、悔棋方法

按照剛才的思路寫即可

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--;
}
}

二、重新開始方法

這個(gè)比較簡(jiǎn)單,只需要將棋盤初始化以下即可。

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];
}

三、按鈕的回調(diào)函數(shù)

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();
}
}

四、保存移動(dòng)

每次棋子成功移動(dòng)即可將移動(dòng)的情況保存在 l i a n b i a o lianbiao lianbiao數(shù)組中,先創(chuàng)建一個(gè) 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();// 把此棋子的前后位置保存下來(lái)
flag[r][c] = beforechess[2];
flag[beforechess[0]][beforechess[1]] = 0;
ifwin();
curchess = new int[3]; // 走完一步后curchess變?yōu)?
beforechess = new int[3];
c = -1;
r = -1;
rechessflag();
ui.repaint();
}

至此就完成了悔棋以及重新開始的實(shí)現(xiàn)。

關(guān)注微信公眾號(hào):圖靈完備,回復(fù)中國(guó)象棋即可獲得圖片及代碼資源。


本文摘自 :https://blog.51cto.com/u

開通會(huì)員,享受整站包年服務(wù)立即開通 >