rmenu=makeRadioButtonMenuItem(strmode[h],target);
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
returnnull;
if(targetinstanceofActionListener)
r.addActionListener((ActionListener)target);
returnr;
}
//构造五子棋游戏的单选按钮式菜单项
publicJRadioButtonMenuItemmakeRadioButtonMenuItem(
Objectitem,Objecttarget){
JRadioButtonMenuItemr=null;
if(iteminstanceofString)
r=newJRadioButtonMenuItem((String)item);
elseif(iteminstanceofJRadioButtonMenuItem)
r=(JRadioButtonMenuItem)item;
else
returnnull;
if(targetinstanceofActionListener)
r.addActionListener((ActionListener)target);
returnr;
}
publicvoidMapSize(intw,inth){
setSize(w*20+50,h*20+100);
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>=1){
cm=newChessModel(modeChess);
MapSize(cm.getWidth(),cm.getHeight());
}else{
System.out.println("\u81EA\u5B9A\u4E49");
}
}
publicvoidactionPerformed(ActionEvente){
Stringarg=e.getActionCommand();
try{
if(arg.equals("Windows"))
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
elseif(arg.equals("Motif"))
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("20x15")){
this.width=20;
this.height=15;
cm=newChessModel
(1);
MapSize(this.width,this.height);
SwingUtilities.updateComponentTreeUI(this);
}
if(arg.equals("30x20")){
this.width=30;
this.height=20;
cm=newChessModel
(2);
MapSize(this.width,this.height);
SwingUtilities.updateComponentTreeUI(this);
}
if(arg.equals("40x30")){
this.width=40;
this.height=30;
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("人人对弈")){
this.checkcomputer=false;
this.iscomputer=false;
cm=newChessModel(cm.getModeChess());
MapSize(cm.getWidth(),cm.getHeight());
SwingUtilities.updateComponentTreeUI(this);
}
if(arg.equals("开局")){
restart();
}
if(arg.equals("关于"))
JOptionPane.showMessageDialog(this,"五子棋游戏测试版本","关于",0);
if(arg.equals("退出"))
System.exit(0);
}
}
/*
*类ChessModel实现了整个五子棋程序算法的核心
*/
classChessModel{
//棋盘的宽度、高度、棋盘的模式(如20×15)
privateintwidth,height,modeChess;
//棋盘方格的横向、纵向坐标
privateintx=0,y=0;
//棋盘方格的横向、纵向坐标所对应的棋子颜色,
//数组arrMapShow只有3个值:
1,2,3,-5,
//其中1代表该棋盘方格上下的棋子为黑子,
//2代表该棋盘方格上下的棋子为白子,
//3代表为该棋盘方格上没有棋子,
//-5代表该棋盘方格不能够下棋子
privateint[][]arrMapShow;
//交换棋手的标识,棋盘方格上是否有棋子的标识符
privatebooleanisOdd,isExist;
publicChessModel(){}
//该构造方法根据不同的棋盘模式(modeChess)来构建对应大小的棋盘
publicChessModel(intmodeChess){
this.isOdd=true;
if(modeChess==1){
PanelInit(20,15,modeChess);
}
if(modeChess==2){
PanelInit(30,20,modeChess);
}
if(modeChess==3){
PanelInit(40,30,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]=-5;
}
}
}
//获取是否交换棋手的标识符
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;
//judgeright
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;
}
//judgeleft
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;
//judgeup
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;
}
//judgedown
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;
//judgeleft_up
x_temp1=x_temp;
y_temp1=y_temp;
num=0;
for(inti=1;i<5;i++){
x_temp1-=1;
y_temp1-=1;
if(y_temp1<0||x_temp1<0)
break;
if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)
num++;
else
break;
}
//judgeright_down
x_temp1=x_temp;
y_temp1=y_temp;
for(inti=1;i<5;i++){
x_temp1+=1;
y_temp1+=1;
if(y_temp1>this.height||x_temp1>this.width)
break;
if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)
num++;
else
break;
}
if(num>max_temp&&num<5)
max_temp=num;
//judgeright_up
x_temp1=x_temp;
y_temp1=y_temp;
num=0;
for(inti=1;i<5;i++){
x_temp1+=1;
y_temp1-=1;
if(y_temp1