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*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.updateComponentTreeUI(this);
}
if(arg.equals("改进棋盘")){
this.width=18;
this.height=18;
cm=newChessModel
(2);
MapSize(this.width,this.height);
SwingUtilities.updateComponentTreeUI(this);
}
if(arg.equals("扩大棋盘")){
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("人人对战")){
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(null,"第一版","版本",JOptionPane.PLAIN_MESSAGE);
if(arg.equals("退出"))
System.exit(0);
}
}
用类ChessModel实现了整个五子棋程序算法的核心
importjava.awt.*;
import.*;
importjava.applet.*;
importjavax.swing.*;
import;
import;
importjavax.swing.JPanel;
classChessModel{
规定棋盘的宽度、高度、棋盘的模式
privateintwidth,height,modeChess;
规定棋盘方格的横向、纵向坐标
privateintx=0,y=0;
棋盘方格的横向、纵向坐标所对应的棋子颜色,
数组arrMapShow只有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;
if(y_temp1<0||x_temp1<0)
break;
if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)
num++;
else
break;
}
判断右下方
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;
判断右上方
x_temp1=x_temp;
y_temp1=y_temp;
num=0;