我写五子棋界面与画图板的方法相类似,也是用到了JFrame中创建窗体的方法,并且用JButton创建“悔棋”按键对象,添加到窗体上(我在窗体右边添加了一个JPanel对象来放置按键)。既然要实现下棋,那就需要用到监听器,我创建了一个Listener类,继承了MouseListener 和ActionListener(获得按钮的名字),分别添加到窗体上和按键上。也是因为重绘的原因,需要重写重绘的方法(里面包括重绘棋盘和棋子的方法)。当然为了保存棋子,也需要一个数组队列,与画图板保存图形的方法相似,创建了一个包含了棋子颜色,位置的类,并用这个类创建数组队列。下棋子的同时还需要标志已下棋子的位置,避免同一个位置可以重复下棋。
上述的都是和画图板类似的,因为实践过一次了,所以感觉难度不大。而困难的地方还是在于判断输赢的方法。我曾经设想过一些判断方法,譬如从判断所下的那颗棋子的哪一行(列)的第一颗开始判断是否有相连的五颗,或者把黑棋(1)白棋(-1)的值相加,如果大于等于±5,就获胜,但是这些都没能实现,最后还是参照了书上的方法,并自己做了一些调整
//判断输赢
public int win(int r ,int c){
int win = 0;
int count = 0;
//判断行
for(int i=c+1;i<qu.chesses.length;i++){
if(qu.chesses[r][i]==qu.chesses[r][c]){
count++;
}
else{
break;
}
}
for(int i=c;i>0;i--){
if(qu.chesses[r][i]==qu.chesses[r][c]){
count++;
}
else{
break;
}
}
if(count>=5){
win=1;
count=0;
}
else{
count=0;
}
//判断列
for(int i=r+1;i<qu.chesses.length;i++){
if(qu.chesses[i][c]==qu.chesses[r][c]){
count++;
}
else{
break;
}
}
for(int i=r;i>0;i--){
if(qu.chesses[i][c]==qu.chesses[r][c]){
count++;
}
else{
break;
}
}
if(count>=5){
win=1;
count=0;
}
else{
count=0;
}
//判断左上到右下
for(int i=r+1,j=c+1;i<qu.chesses.length&&j<qu.chesses.length;i++,j++){
if(qu.chesses[i][j]==qu.chesses[r][c]){
count++;
}
else{
break;
}
}
for(int i=r,j=c;i>0&&j>0;i--,j--){
if(qu.chesses[i][j]==qu.chesses[r][c]){
count++;
}
else{
break;
}
}
if(count>=5){
win=1;
count=0;
}
else{
count=0;
}
//判断左下到右上
for(int i=r-1,j=c+1;i>0&&j<qu.chesses.length;i--,j++){
if(qu.chesses[i][j]==qu.chesses[r][c]){
count++;
}
else{
break;
}
}
for(int i=r+1,j=c-1;i<qu.chesses.length&&j>0;i++,j--){
if(qu.chesses[i][j]==qu.chesses[r][c]){
count++;
}
else{
break;
}
}
if(count>=4){
win=1;
count=0;
}
else{
count=0;
}
return win;
}
我将判断输赢写成了一个方法,并且会返回一个值,如果值为真就是赢。这样做也更方便在每一次下棋后调用,不用重复写代码。
悔棋对我来说也是一个难点,之前我一直不懂如何才能正确识别“悔棋”按钮,加入使用MouseListener,每次点击都会和下棋一样判断按键的坐标,但是按键的坐标从右上角(0,0)算起,由于是与画板添加同一个监听器的缘故,都会误下棋子。后来雄哥教我说为只需要为按键添加ActionListener就行方才恍然大悟,并且把悔棋的方法也写进了ActionListener的方法里头。其实悔棋的方法并不难,只需要在数组队列里面添加一个删除最后一个元素的方法,并在点击“悔棋”后调用,然后使用窗体的repaint方法来重绘画图板即可。
通过这几天的学习,觉得学得比以前的都要多,虽然五子棋仅仅是写了一个简简单单的界面,而且还没有人机算法,但是我希望通过以后的学习,能够不断地完善这个五子棋这个工程和掌握相关的知识点。