相比五子棋1.0增加开始游戏才可落子,结束对局自动清空棋盘和判断输赢的功能。
一、开始游戏才可落子,结束对局自动清空棋盘功能
在原来的GameListener中的动作监听器部分增加该功能。
public void actionPerformed(ActionEvent e) {
String ac = e.getActionCommand();
if (ac.equals("登录")) {
String name = nameIn.getText();
String pwd = pwdIn.getText();
if (name.equals("wky") && pwd.equals("123")){
gameUI.showgameUI();
gameUI.hideloginUI();
}
} else if (ac.equals("退出")) {
gameUI.hidegameUI();
gameUI.showloginUI();
}
//实现点击开始游戏后才可以落子和自动消除上局棋子功能。
else if (ac.equals("开始游戏")) {
//如果按下开始游戏,默认先下的时黑棋
chessstatus = 1;
//获取按下的按钮,将其文本内容改为“结束对局”,背景色改为粉色
JButton btn = (JButton)e.getSource();
btn.setText("结束对局");
btn.setBackground(Color.pink);
//将棋盘中每个位置的状态归为0
chess = new int[16][16];
//重绘棋盘,达到自动消除上局棋子的功能。
g.setColor(new Color(18, 253, 0, 255));
g.fillRect(X - SIZE/2 , Y - SIZE/2 ,(COL+1) * SIZE,(ROW + 1) * SIZE);
g.setColor(new Color(0xFF070707, true));
for (int i = 0; i <= COL; i++) {
g.drawLine(X,Y + i * SIZE,X +COL * SIZE,Y + i * SIZE);
g.drawLine(X + i * SIZE,Y,X + i * SIZE,Y + ROW * SIZE);
}
}
//实现点击结束对局后不可落子的功能。
else if (ac.equals("结束对局")) {
//如果按下结束对局,将棋子状态归为0,后续不可下棋
chessstatus = 0;
//获取按下的按钮,将其文本内容改为“开始游戏”,背景色改为天蓝色
JButton btn = (JButton)e.getSource();
btn.setText("开始游戏");
btn.setBackground(Color.cyan);
}
}
二、判断输赢
1、定义ToWin类
用于判断是否由五个相同颜色的棋子在相邻的直线上。
package gobangv2;
public class ToWin {
public boolean isWin(int[][] chessArray,int r,int c){
if (col(chessArray,r,c) >= 5 || row(chessArray,r,c) >= 5 || oblique(chessArray,r,c) >= 5){
return true;
}
return false;
}
}
2、分类进行判断输赢
注意:每次落子都要判断一次是否有一方输赢。所以需要在画出棋子的下一步就进行一次判断。因此,需要在GameListener中的画出棋子部分加上以下代码。
if (toWin.isWin(chess,r,c)){
JOptionPane.showMessageDialog(null,chessstatus == 1?"白棋胜利":"黑棋胜利");
//将棋子状态归为0,使得后续不能再下棋。
chessstatus =0;
}
(1)横向遍历
//横向遍历
public int col(int[][] chessArray,int r,int c){
int count = 1;
//向右找
for (int i = c+1; i <16 ; i++) {
if (chessArray[r][c] == chessArray[r][i]){
count++;
} else {
break;
}
}
//向左找
for (int i = c-1; i >= 0 ; i--) {
if (chessArray[r][c] == chessArray[r][i]){
count++;
} else {
break;
}
}
return count;
}
(2)纵向遍历
//纵向遍历
public int row(int[][] chessArray,int r,int c){
int count = 1;
//向下找
for (int i = r+1; i < 16 ; i++) {
if (chessArray[r][c] == chessArray[i][c]){
count++;
} else {
break;
}
}
//向上找
for (int i = r-1; i >= 0 ; i--) {
if (chessArray[r][c] == chessArray[i][c]){
count++;
} else {
break;
}
}
return count;
}
(3)斜向遍历
//斜向判断
public int oblique(int[][] chessArray,int r,int c){
int count = 1;
//左斜向上线
int i = r-1;
int j = c-1;
while(i >= 0 && j >= 0) {
if (chessArray[r][c] == chessArray[i][j]) {
count++;
i--;
j--;
} else {
break;
}
}
//左斜向下线
i = r+1;
j = c+1;
while (i < 16 && j < 16){
if (chessArray[r][c] == chessArray[i][j]){
count++;
i++;
j++;
}else {
break;
}
}
//右斜向上线
i = r-1;
j = c+1;
while (i >= 0 && j < 16){
if (chessArray[r][c] == chessArray[i][j]){
count++;
i--;
j++;
}else{
break;
}
}
//右斜向下线
i = r+1;
j = c-1;
while (i <16 && j>= 0){
if (chessArray[r][c] == chessArray[i][j]){
count++;
i++;
j--;
}else {
break;
}
}
return count;
}