setChess函数有三个参数,前两个参数是将要“落子”的按钮数组的下标,用来实现在相应位置“落子”,第三个参数代表落子方,其中1代表电脑,2代表玩家,用于存储当前棋局。代码实现如下:
private void setChess(int i,int j,int chessID){
//落子
chess[i][j]=chessID; //把落子储存到当前棋局里
if(chess[i][j]==1){ //电脑落子
jb[i][j].setIcon(imgA);
jb[i][j].setDisabledIcon(imgA); //当按钮不可用时显示的图片,此处代码不可省,下同
}
else if(chess[i][j]==2){ //玩家落子
jb[i][j].setIcon(imgB);
jb[i][j].setDisabledIcon(imgB);
}
jb[i][j].setEnabled(false); //落子后,该按钮变为不可用
suanf.loadInfo(chess,i,j); //把下棋的相应信息传到suanfa类,后面会讲到
}
private final String localUrl=" F:\\qb\\image"; //记录图片根目录
private final ImageIcon imgA=new ImageIcon(localUrl+"\\whitechess.jpg"); //记录白子路径
private final ImageIcon imgB=new ImageIcon(localUrl+"\\blackchess.jpg"); //记录黑子路径
afterWin函数是处理赢棋后的工作的,它只有一个参数,即落子方。代码实现如下:
private void afterWin(int playerID){
//赢棋后处理
if(playerID==1){ //电脑赢了
JPstate.JLinfo.setIcon(imgWin1); //JPstate类是继承了JPanel类的状态类,后面会有介绍,下同
}
else if(playerID==2){ //玩家赢了
JPstate.JLinfo.setIcon(imgWin2);
}
}
private final ImageIcon imgWin1=new ImageIcon(localUrl+"\\shuqi.jpg");
private final ImageIcon imgWin2=new ImageIcon(localUrl+"\\yingqi.jpg");
读者可以根据自己的想法轻松地改变赢棋处理方式。
4.实现电脑智能
这里,将致力来研究算法的实现。希望所有爱好编程者都能看懂本算法,无论他懂不懂Java语言。因此,本着让读者容易理解的目的,尽量把算法写得细致些,并尽可能地脱离Java语言。
(1)基本思路
首先,需要定义权值,以便电脑根据棋盘上某一点在四个方向上的权值之和的大小来判断最佳落子位置。然后,给出权值算法,用于计算棋盘上某一点的利己(利于电脑)与堵敌(不利于玩家)权值之和。最后,就可以用一个循环来遍历整个棋盘以检测最佳权值点了。
(2)实现过程
1)为了实现实现人机对战,需要定义一个suanfa类。代码实现如下:
public class suanfa
2)下载棋局的当前信息。
第一步:复制当前棋局。这样做的目的是在实现电脑智能的过程中不影响CBboard中所存储的当前棋局。需要先在suanfa类中定义一个二维数组,具体代码如下:
private int[][] curChess=new int[Model.MaxlineY][Model.MaxlineX];//用于记录当前的棋局
|