java五子棋源代码.docx
- 文档编号:20195652
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:24
- 大小:20.40KB
java五子棋源代码.docx
《java五子棋源代码.docx》由会员分享,可在线阅读,更多相关《java五子棋源代码.docx(24页珍藏版)》请在冰豆网上搜索。
java五子棋源代码
/*AWT是AbstractWindowToolKit(抽象窗口工具包)的缩写,
包含用于创建用户界面和绘制图形图像的所有类
Swing是在AWT的基础上构建的一套新的图形界面系统,
它提供了AWT所能够提供的所有功能,
并且用纯粹的Java代码对AWT的功能进行了大幅度的扩充。
类的结构
-ChesssFrame
-MainPanel
-ChessBoard
*/
importjava.awt.*;
importjava.awt.Color;
importjava.awt.Graphics;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.MouseEvent;
importjava.awt.event.MouseListener;
importjavax.swing.ButtonGroup;
importjavax.swing.JFrame;
importjavax.swing.JMenu;
importjavax.swing.JMenuBar;
importjavax.swing.JMenuItem;
importjavax.swing.JOptionPane;
importjavax.swing.JPanel;
importjavax.swing.JRadioButtonMenuItem;
importjavax.swing.SwingUtilities;
importjavax.swing.UIManager;
/*
main方法创建了GameFrame类的一个实例对象(win),
并启动屏幕显示显示该实例对象。
**/
publicclassFiveChessAppletDemo{
publicstaticvoidmain(Stringargs[]){
GameFramewin=newGameFrame();//生成一个游戏窗体
win.setVisible(true);
}
}
/*
GameFrame主要功能是创建五子棋游戏主窗体和菜单
JFrame是Swing技术中的窗体类,在开发应用程序时可以通过继承java.swing.JFrame类创建一个窗体
ActionListener用于接收操作事件的侦听器接口。
对处理操作事件感兴趣的类可以实现此接口
**/
classGameFrameextendsJFrameimplementsActionListener{
publicstaticbooleanmanMachine=true;//人机对弈
privateintframeCol,frameRow;//面板中格子的行列数
privateMainPanelMainPanel;//面板
//构造五子棋游戏的主窗体
publicGameFrame(){
setTitle("五子棋游戏");
//默认棋盘20x15
frameCol=20;
frameRow=15;
setSize(frameCol*20+50,frameRow*20+100);
//将窗体置于屏幕中央
setLocationRelativeTo(null);
//创建一个面板
MainPanel=newMainPanel(frameCol,frameRow);
//初始化MainPanel
panelInit(frameCol,frameRow);
//将MainPanel加入framne中(居中)
add(MainPanel,"Center");
//创建一个菜单条
JMenuBarmbar=newJMenuBar();
//将菜单条mbar加入到framne中
setJMenuBar(mbar);
//创建一个游戏一级菜单
JMenugameMenu=newJMenu("游戏");
//创建游戏的二级菜单,并将游戏菜单加入到菜单条中。
mbar.add(makeMenu(gameMenu,newString[]{"开局","棋盘","模式",null,"退出"},this));
//创建一个视图一级菜单
JMenuviewMenu=newJMenu("视图");
//创建视图的二级菜单,并将视图菜单加入到菜单条中
mbar.add(makeMenu(viewMenu,newString[]{"Metal","Motif","Windows"},this));
//创建一个帮助一级菜单
JMenuhelpMenu=newJMenu("帮助");
//创建帮助的二级菜单,并将帮助菜单加入到菜单条中
mbar.add(makeMenu(helpMenu,newString[]{"关于"},this));
}
//构造五子棋游戏的主菜单
publicJMenumakeMenu(JMenumenu,Stringitems[],Objecttarget){
for(inti=0;i if(items[i]==null) menu.addSeparator();//分隔符 elseif(items[i]=="棋盘"){ //创建棋盘二级子菜单 JMenuchessBoardSubmenu=newJMenu("棋盘"); //创建一个多选一按钮组 ButtonGroupgroup=newButtonGroup(); //单选按钮 JRadioButtonMenuItemradioMenu; finalString[]size={"20x15","30x20","40x30"}; for(intj=0;j radioMenu=makeRadioButtonMenuItem(size[j],target); if(j==0)//第一个单选按钮默认选中 radioMenu.setSelected(true); //棋盘二级子菜单中加入单选按钮 chessBoardSubmenu.add(radioMenu); //将按钮加入多选一按钮组 group.add(radioMenu); } //将棋盘二级子菜单加入到游戏一级菜单中 menu.add(chessBoardSubmenu); }elseif(items[i]=="模式"){ //创建模式二级子菜单 JMenumodeSubmenu=newJMenu("模式"); //创建一个多选一按钮组 ButtonGroupgroup=newButtonGroup(); //单选按钮 JRadioButtonMenuItemrmenu; finalString[]mode={"人机对弈","人人对弈"}; for(intj=0;j rmenu=makeRadioButtonMenuItem(mode[j],target); if(j==0)//第一个单选按钮默认选中 rmenu.setSelected(true); //模式二级子菜单中加入单选按钮 modeSubmenu.add(rmenu); //将按钮加入多选一按钮组 group.add(rmenu); } //将模式二级子菜单加入到游戏一级菜单中 menu.add(modeSubmenu); }else //创建其它二级子菜单 menu.add(makeMenuItem(items[i],target)); returnmenu; } //构造五子棋游戏的菜单项 publicJMenuItemmakeMenuItem(Stringitem,Objecttarget){ JMenuItemr=newJMenuItem(item); r.addActionListener((ActionListener)target); returnr; } //构造五子棋游戏的单选按钮式菜单项 publicJRadioButtonMenuItemmakeRadioButtonMenuItem(Stringitem,Objecttarget){ JRadioButtonMenuItemr=newJRadioButtonMenuItem(item); r.addActionListener((ActionListener)target); returnr; } //重新开局 publicvoidpanelInit(intframeCol,intframeRow){ //设置面板中棋盘的行列 MainPanel.setColRow(frameCol,frameRow); MainPanel.ClearChessMap(); //MainPanel类继承了Jpanel类,Jpanel类有一个repaint方法,在repaint中调用paint方法。 MainPanel.repaint(); } publicvoidactionPerformed(ActionEvente){ //.getActionCommand()返回和动作相连的命令字符串 Stringarg=e.getActionCommand(); try{ if(arg.equals("Windows")) //UIManager.setLookAndFeel()设置桌面的外观 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"); //当改变程序的LookAndFeel外观时,通过调用SwingUtilities.updateComponentTreeUI方法来刷新整个UI SwingUtilities.updateComponentTreeUI(this); }catch(Exceptionee){} if(arg.equals("20x15")){//改变棋盘大小 frameCol=20; frameRow=15; //设置frame高度、宽度 setSize(frameCol*20+50,frameRow*20+100); //初始化panel,格子的行列发生变化 panelInit(frameCol,frameRow); } if(arg.equals("30x20")){//改变棋盘大小 frameCol=30; frameRow=20; //设置frame高度、宽度 setSize(frameCol*20+50,frameRow*20+100); //初始化panel,格子的行列发生变化 panelInit(frameCol,frameRow); } if(arg.equals("40x30")){//改变棋盘大小 frameCol=40; frameRow=30; //设置frame高度、宽度 setSize(frameCol*20+50,frameRow*20+100); //初始化panel,格子的行列发生变化 panelInit(frameCol,frameRow); } if(arg.equals("人机对弈")){ GameFrame.manMachine=true; } if(arg.equals("人人对弈")){ GameFrame.manMachine=false; } if(arg.equals("开局")){ //初始化panel panelInit(frameCol,frameRow); } if(arg.equals("关于")) JOptionPane.showMessageDialog(this,"五子棋游戏测试版本","关于",0); if(arg.equals("退出")) System.exit(0); } } /* *类MainPanel主要完成如下功能: *1、构建一个面板,在该面板上画上棋盘; *2、处理在该棋盘上的鼠标事件(如鼠标左键点击、鼠标右键点击、鼠标拖动等) **/ classMainPanelextendsJPanelimplementsMouseListener{ privateintpanelCol,panelRow;//面板中棋盘的列、行 //棋盘方格的横向、纵向坐标所对应的棋子颜色, //数组chessMap只有3个值: 1,2,0其中: 1有黑子,2有白子,0没有棋子, privateint[][]chessMap; privatebooleanisManDo;//true: 轮到人下,false: 轮到机器下 //根据棋盘行列设定面板的大小 MainPanel(intcol,introw){ panelCol=col; panelRow=row; ClearChessMap();//清空棋盘 addMouseListener(this); } voidsetColRow(intframeCol,intframeRow){ panelCol=frameCol; panelRow=frameRow; } //构建棋盘 //按照棋盘模式构建棋盘大小 publicvoidClearChessMap(){ isManDo=true; chessMap=newint[panelCol+1][panelRow+1]; for(inti=0;i<=panelCol;i++){ for(intj=0;j<=panelRow;j++){ chessMap[i][j]=0;//清空棋盘 } } } // //MainPanel的repaint方法中调用paint方法,重写父类JPanel的paint方法 publicvoidpaint(Graphicsg){ //调用父类Jpanel的paint方法 super.paint(g); //画棋盘格子 g.setColor(Color.white);//设置画笔颜色灰色 for(inti=0;i<=panelCol;i++)//画panelCol+1条竖线 g.drawLine(20*i+20,20,20*i+20,20*panelRow+20); for(intj=0;j<=panelRow;j++)//画panelRow+1条横线 g.drawLine(20,20*j+20,20*panelCol+20,20*j+20); for(intj=0;j<=panelRow;j++){ for(inti=0;i<=panelCol;i++){ intcolor=chessMap[i][j]; intx=20*i+20; inty=20*j+20; //画黑色棋子 if(color==1){ g.setColor(Color.black);//设置画笔颜色黑色 g.fillOval(x-8,y-8,16,16);//画实心椭圆(园) } //画白色棋子 if(color==2){ g.setColor(Color.gray);//设置画笔颜色灰色 g.drawOval(x-8,y-8,16,16);//画空心椭圆(园) g.setColor(Color.white);//设置画笔颜色白色 g.fillOval(x-8,y-8,16,16);//画实心椭圆(园) } } } } //判断下子的横向、纵向坐标是否越界 publicbooleanoverBorder(intx,inty){ if(x>=panelCol+20||x<0) returntrue; returny>=panelRow+20||y<0; } //判断(i,j)位置上是否有棋子 publicbooleanchessExist(inti,intj){ if(this.chessMap[i][j]==1||this.chessMap[i][j]==2) returntrue; returnfalse; } //人在鼠标位置下棋子 publicbooleanmanPlay(intx,inty){ if(overBorder(x,y))//越界 returnfalse; if(chessExist(x,y))//该位置有棋子 returnfalse; if(isManDo){ isManDo=false; this.chessMap[x][y]=1; }else{ isManDo=true; this.chessMap[x][y]=2; } returntrue; } /*计算机下棋 说明: 用穷举法判断每一个坐标点的四个方向的的连成一线的最大棋子数 最后得出棋子数最大值的坐标,下子 */ publicvoidcomputerPlay(intposition[]){ intmax_black,max_white,max_temp,max=0,max_x=0,max_y=0; isManDo=true; for(inti=0;i<=panelCol;i++){ for(intj=0;j<=panelRow;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; max_x=i; max_y=j; } } } } chessMap[max_x][max_y]=2; position[0]=max_x; position[1]=max_y; } //判断八个方向连成一线的最大棋子数 publicintcheckMax(intx,inty,intblack_or_white){ intcount=0,max=0; intx_temp=x,y_temp=y; //向右 for(inti=1;i<5;i++){ x_temp=x_temp+1; if(x_temp>panelCol) break; if(this.chessMap[x_temp][y_temp]==black_or_white) count++; else break; } //向左 x_temp=x; for(inti=1;i<5;i++){ x_temp=x_temp-1; if(x_temp<0) break; if(chessMap[x_temp][y_temp]==black_or_white) count++; else break; } max=count; //向上 x_temp=x; y_temp=y; count=0; for(inti=1;i<5;i++){ y_temp=y_temp-1; if(y_temp<0) break; if(chessMap[x_temp][y_temp]==black_or_white) count++; else break; } //向下 y_temp=y; for(inti=1;i<5;i++){ y_temp=y_temp+1; if(y_temp>panelRow) break; if(chessMap[x_temp][y_temp]==black_or_white) count++; else break; } if(count>max) max=count; //左上 x_temp=x; y_temp=y; count=0; for(inti=1;i<5;i++){ x_temp=x_temp-1; y_temp=y_temp-1; if(y_t
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 五子棋 源代码
![提示](https://static.bdocx.com/images/bang_tan.gif)