if(h==0)rmenu.setSelected(true);
jm.add(rmenu);
group.add(rmenu);
}
m.add(jm);
}else
m.add(makeMenuItem(items[i],target));
returnm;
}
构造五子棋游戏的菜单项
publicJMenuItemmakeMenuItem(Objectitem,Objecttarget){JMenuItemr=null;
if(iteminstanceofString)r=newJMenuItem((String)item);
elseif(iteminstanceofJMenuItem)
r=(JMenuItem)item;
else
return
null
if(targetinstanceofActionListener)r.addActionListener((ActionListener)target);
returnr;
)
构造五子棋游戏的单选按钮式菜单项
publicJRadioButtonMenuItemmakeRadioButtonMenuItem(Objectitem,Objecttarget){JRadioButtonMenuItemr=null;
if(iteminstanceofString)
r=newJRadioButtonMenuItem((String)item);
elseif(iteminstanceofJRadioButtonMenuItem)r=(JRadioButtonMenuItem)item;
elsereturnnull;
if(targetinstanceofActionListener)
r.addActionListener((ActionListener)target);
returnr;
)
publicvoidMapSize(intw,inth){setSize(w*24,h*27);
if(this.checkcomputer)this.iscomputer=true;
else
this.iscomputer=false;
mp.setModel(cm);
mp.repaint();
)
publicbooleangetiscomputer(){returnthis.iscomputer;
)
publicvoidrestart(){
intmodeChess=cm.getModeChess();
if(modeChess<=3&&modeChess>=0){
cm=newChessModel(modeChess);
MapSize(cm.getWidth(),cm.getHeight());
)
)
publicvoidactionPerformed(ActionEvente)(
Stringarg=e.getActionCommand();
try(
if(arg.equals("类型三"))
UIManager.setLookAndFeel(
com.sun.java.swing.plaf.windows.WindowsLookAndFeel”
);
elseif(arg.equals("类型二"))
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.motif.MotifLookAndFeel”else
);
UIManager.setLookAndFeel(
"javax.swing.plaf.metal.MetalLookAndFeel");
SwingUtilities.updateComponentTreeUI(this);
}catch(Exceptionee)(}
if(arg.equals("标准棋盘”)){this.width=14;
this.height=14;
cm=newChessModel
(1);
MapSize(
this.width,this.height);
SwingUtilities.
}
if(arg.equals(
updateComponentTreeUI
"改进棋盘")){
(this);
this.width=18;
this.height=18;
cm=newChessModel
(2);
MapSize(
this.width,this.height);
SwingUtilities.
}
if(arg.equals(
updateComponentTreeUI
"扩大棋盘")){
(this);
this.width=22;
this.height=22;
cm=newChessModel(3);
MapSize(this.width,this.height);
SwingUtilities.updateComponentTreeUI(this);
}
if(arg.equals("人机对战”)){
this.checkcomputer=true;
this.iscomputer=true;cm=newChessModel(cm.getModeChess());
MapSize(cm.getWidth(),cm.getHeight());
SwingUtilities.updateComponentTreeUI(this);
if(arg.equals(
"人人对战")){
MapSize(SwingUtilities.}
this.checkcomputer=false;
this.iscomputer=false;
cm=newChessModel(cm.getModeChess());
cm.getWidth(),cm.getHeight());
(this);
updateComponentTreeUI
if(arg.equals(restart();
}
if(arg.equals(JOptionPane.
",JOptionPane.
if(arg.equals(
System.exit
}
"关于"))
showMessageDialog(null
PLAIN_MESSAGE);
"退出"))
(0);
"第一版","版本
用类ChessModel实现了整个五子棋程序算法的核心
importjava.awt.*;
importjava.awt.event.*;
importjava.applet.*;
importjavax.swing.*;
importjava.io.PrintStream;
importjavax.swing.JComponent;
importjavax.swing.JPanel;
classChessModel{
规定棋盘的宽度、高度、棋盘的模式
privateintwidth,height,modeChess;
规定棋盘方格的横向、纵向坐标
privateintx=0,y=0;
棋盘方格的横向、纵向坐标所对应的棋子颜色,
数组arrMapSho*有3个值:
1,2,3,-1,
其中1代表该棋盘方格上下的棋子为黑子,
2代表该棋盘方格上下的棋子为白子,
3代表为该棋盘方格上没有棋子,
-1代表该棋盘方格不能够下棋子
privateint[][]arrMapShow;
交换棋手的标识,棋盘方格上是否有棋子的标识符
privatebooleanisOdd,isExist;
publicChessModel(){}
该构造方法根据不同的棋盘模式(modeChess来构建对应大小的棋盘
publicChessModel(intmodeChess){this.isOdd=true;if(modeChess==1){
PanelInit(14,14,modeChess);}
if(modeChess==2){PanelInit(18,18,modeChess);
}if(modeChess==3){
PanelInit(22,22,modeChess);}}
按照棋盘模式构建棋盘大小
privatevoidPanelInit(intwidth,intheight,intmodeChess){this.width=width;this.height=height;this.modeChess=modeChess;arrMapShow=newint[width+1][height+1];for(inti=0;i<=width;i++){
for(intj=0;j<=height;j++){arrMapShow[i][j]=-1;
}}}
获取是否交换棋手的标识符
publicbooleangetisOdd(){returnthis.isOdd;
设置交换棋手的标识符
publicvoidsetisOdd(booleanisodd)(if(isodd)
this.isOdd=true;
else
this.isOdd=false;
}
获取某棋盘方格是否有棋子的标识值
publicbooleangetisExist(){returnthis.isExist;
}
获取棋盘宽度
publicintgetWidth(){returnthis.width;
}
获取棋盘高度
publicintgetHeight(){returnthis.height;
}
获取棋盘模式
publicintgetModeChess(){
returnthis.modeChess;
}
获取棋盘方格上棋子的信息
publicint[][]getarrMapShow(){returnarrMapShow;
}
判断下子的横向、纵向坐标是否越界
privatebooleanbadxy(intx,inty){
if(x>=width+20||x<0)
returntrue
returny>=height+20||y<0;
计算棋盘上某一方格上八个方向棋子的最大值,
这八个方向分别是:
左、右、上、下、左上、左下、右上、右下
publicbooleanchessExist(inti,intj)(
if(this.arrMapShow[i][j]==1||this.arrMapShow[i][j]==2)
returntrue;
returnfalse;
)
判断该坐标位置是否可下棋子
publicvoidreadyplay(intx,inty)(if(badxy(x,y))
return;
if(chessExist(x,y))return;
this.arrMapShow[x][y]=3;
)
在该坐标位置下棋子
publicvoidplay(intx,inty)(if(badxy(x,y))
return;
if(chessExist(x,y))(
this.isExist=true;
return;
)else
this.isExist=false;
if(getisOdd()){
setisOdd(false);
this.arrMapShow[x][y]=1;
)else{
setisOdd(true);
this.arrMapShow[x][y]=2;
)
)
计算机走棋
说明:
用穷举法判断每一个坐标点的四个方向的的最大棋子数,
最后得出棋子数最大值的坐标,下子
publicvoidcomputerDo(intwidth,intheight)(intmax_black,max_white,max_temp,max=0;
setisOdd(true);
System.out.println("计算机走棋...");
for(inti=0;i<=width;i++)(for(intj=0;j<=height;j++){
算法判断是否下子
if(!
chessExist(i,j)){
判断白子的最大值
max_white=checkMax(i,j,2);
判断黑子的最大值
max_black=checkMax(i,j,1);max_temp=Math.max(max_white,max_black);
if(max_temp>max){max=max_temp;
this.x=i;
this.y=j;
}
}
}
}
setX(this.x);
setY(this.y);
this.arrMapShow[this.x][this.y]=2;
}
记录电脑下子后的横向坐标
publicvoidsetX(intx){this.x=x;
}
记录电脑下子后的纵向坐标
publicvoidsetY(inty){
this.y=y;
获取电脑下子的横向坐标
publicintgetX()(returnthis.x;
)
获取电脑下子的纵向坐标
publicintgetY()(returnthis.y;
)
计算棋盘上某一方格上八个方向棋子的最大值,
这八个方向分别是:
左、右、上、下、左上、左下、右上、右下
publicintcheckMax(intx,inty,intblack_or_white){intnum=0,max_num,max_temp=0;intx_temp=x,y_temp=y;intx_temp1=x_temp,y_temp1=y_temp;
判断右边
for(inti=1;i<5;i++){x_temp1+=1;
if(x_temp1>this.width)break;
if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)
num++;
else
break;
)
判断左边
x_temp1=x_temp;
for(inti=1;i<5;i++){x_temp1-=1;
if(x_temp1<0)break;
if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)
num++;
else
break;
if(num<5)max_temp=num;
判断上面
x_temp1=x_temp;
y_temp1=y_temp;
num=0;
for(inti=1;i<5;i++)(
y_temp1-=1;
if(y_temp1<0)break;
if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)num++;
else
break;
}
判断下面
y_temp1=y_temp;
for(inti=1;i<5;i++)(
y_temp1+=1;
if(y_temp1>this.height)break;
if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)
num++;
else
break;
}
if(num>max_temp&&num<5)max_temp=num;
判断左上方
x_temp1=x_temp;
y_temp1=y_temp;
num=0;
for(inti=1;i<5;i++)(
x_temp1-=1;
y_temp1-=1;