上一篇博客我们已经将五子棋游戏的基本框架搭好了;但还有很多功能无法实现,如
1.五子棋黑白先手不能更改
2.无法根据已下的棋子来判断输赢
3.没有悔棋功能
......
本篇博客我们来解决1和2两个问题
黑白先手更改
1.实现功能
在窗体上添加两个单选框黑子先手/白子先手,点击选中后可以更改先手
在窗体类NewGo中添加单选框对象jrb_b和jrb_w,并添加到按钮组b1中,使两者只能选中一个
2.添加代码
JRadioButton jrb_b=new JRadioButton("黑子先手");
JRadioButton jrb_w=new JRadioButton("白子先手");
jrb_b.setBounds(850,120,100,35);//位置设置
jrb_w.setBounds(850,150,100,35);
ButtonGroup b1=new ButtonGroup();
b1.add(jrb_b);
b1.add(jrb_w);
add(jrb_b);
add(jrb_w);
同步两个类中的jrb_b和jrb_w
gol.jrb_b=jrb_b;
gol.jrb_w=jrb_w;
改善Golistener中的actionPerformed
public void actionPerformed(ActionEvent e){
String btnText=e.getActionCommand();
JButton btn=(JButton) e.getSource();
if(btnText.equals("开始游戏")){
if(jrb_b.isSelected()){//黑子先手被选中
chessflag=1;
} else if (jrb_w.isSelected()) {
chessflag=2;
}else{
JOptionPane.showMessageDialog (null, "请设置先手", "提示", JOptionPane.ERROR_MESSAGE);
return;
}
jrb_b.setEnabled(false);//不可选定
jrb_w.setEnabled(false);
btn.setText("结束游戏");
} else if (btnText.equals("结束游戏")){
chessArr=new int[ROWS+1][COLS+1];//重置记录
jrb_b.setEnabled(true);//可以选定
jrb_w.setEnabled(true);
btn.setText("开始游戏");
chessflag=0;
}
}
3.运行结果
判断输赢
实现功能
每下一子进行判断,若一方连成五子则输出那一方胜利,并结束游戏
分四步判断:水平、竖直、左上到右下、右上到左下
先创建一个类IsWin,分别计算四个方向所下子同色相邻个数,若有一个方向相邻同色棋子个数大于等于5,则判断那一方胜利
代码如下
public class IsWin {
public static boolean isWin(int r, int c ,int[][]chessArr) {
if(x(r, c, chessArr)>=5||y(r,c,chessArr)>=5||xy(r,c,chessArr)>=5||yx(r,c,chessArr)>=5){
return(true);//一方胜利isWin为true
}return(false);
}
//水平方向判断
private static int x(int r,int c,int[][]chessArr){
int count=1;
//从下的这一点向右遍历
for(int i=c+1;i<chessArr.length;i++){
if(chessArr[r][i]==chessArr[r][c]){
count+=1;
}else{
break;
}
}
//向左遍历
for(int i=c-1;i>=0;i--){
if(chessArr[r][i]==chessArr[r][c]){
count+=1;
}else{
break;
}
}
return count;
}
//竖直方向判断
private static int y(int r,int c,int[][]chessArr){
int count=1;
for(int i=r+1;i<chessArr.length;i++){
if(chessArr[i][c]==chessArr[r][c]){
count+=1;
}else{
break;
}
}for(int i=r-1;i>=0;i--){
if(chessArr[i][c]==chessArr[r][c]){
count+=1;
}else{
break;
}
}
return count;
}
//左上到右下判断
private static int xy(int r,int c,int[][]chessArr){
int count=1;
int j=c;//所下点的列
for(int i=r+1;i<chessArr.length;i++){
j+=1;
if(j< chessArr.length&&chessArr[i][j]==chessArr[r][c]){
count+=1;
}else{
j=c;
break;
}
}for(int i=r-1;i>=0;i--){
j-=1;
if(j>=0&&chessArr[i][j]==chessArr[r][c]){
count+=1;
}else{
break;
}
}
return count;
}
//左下到右上判断
private static int yx(int r,int c,int[][]chessArr){
int count=1;
int j=c;
for(int i=r+1;i<chessArr.length;i++){
j-=1;
if(j>=0&&chessArr[i][j]==chessArr[r][c]){
count+=1;
}else{
j=c;
break;
}
}for(int i=r-1;i>=0;i--){
j+=1;
if(j< chessArr.length&&chessArr[i][j]==chessArr[r][c]){
count+=1;
}else{
break;
}
}
return count;
}
}
这样判断的代码就完成了,接下来要实现的是在监听器GoListener中添加判断语句,实时监测结果,并在一方胜利时提示胜利方并将棋盘复原
在GoListener中mousePressed()末尾添加
boolean isWin= IsWin.isWin(r,c,chessArr);
if(isWin){
//如果chessflag==1即下一个下棋的为黑,提示白棋胜利,否则黑棋胜利
JOptionPane.showMessageDialog (null,chessflag==1?"白棋胜利":"黑棋胜利","提示",JOptionPane.ERROR_MESSAGE);
chessflag=0;
chessArr=new int[ROWS+1][COLS+1];
return;
}
运行结果