java五子棋人机.docx
- 文档编号:8052602
- 上传时间:2023-05-12
- 格式:DOCX
- 页数:14
- 大小:34.34KB
java五子棋人机.docx
《java五子棋人机.docx》由会员分享,可在线阅读,更多相关《java五子棋人机.docx(14页珍藏版)》请在冰点文库上搜索。
java五子棋人机
介绍:
这是一款很简单的人机对战五子棋,只实现了简单的防守功能,适合刚开始设计五子棋的朋友参考。
程序执行结果:
框架程序:
packagewuziqi;
importjava.awt.BorderLayout;
importjava.awt.Color;
importjavax.swing.JFrame;
/**
*五子棋
*/
publicclassMainFrameextendsJFrame{
publicstaticvoidmain(String[]args){
MainPanelpanel=newMainPanel();
MainFrameframe=newMainFrame("五子棋");
frame.setSize(680,680);
panel.setBackground(Color.LIGHT_GRAY);
frame.add(panel,BorderLayout.CENTER);
panel.addMouseListener(panel);
frame.setVisible(true);
frame.setDefaultCloseOperation(3);
frame.setLocationRelativeTo(null);
}
publicMainFrame(){
super();
}
publicMainFrame(Stringstr){
super(str);
}
}
面板设计:
packagewuziqi;
importjava.awt.*;
importjava.awt.event.MouseEvent;
importjava.awt.event.MouseListener;
/**
*JFrame中的层次分布及相对关系是:
最底层是:
JRootPane;
*第二层是:
JlayerPane;最上层就是ContentPane,也正是我们常说的内容面板。
*所以一般我们拖放的控件就是在ContentPane层上。
*/
importjavax.swing.JOptionPane;
/**
*五子棋的面板设计
*/
publicclassMainPanelextendsPanelimplementsMouseListener{
privatestaticfinalintCOLUMN=16;//列数
privatestaticfinalintROW=16;//行数
privatestaticfinalintGAP=40;//间距
privatestaticbooleanisBlack=true;//判断是否是黑棋
privatestaticintclick_X;//点击时候的x坐标
privatestaticintclick_Y;//点击时候的y坐标
privatechar[][]allChess=newchar[ROW][COLUMN];//存下了旗子的位置
publicMainPanel(){
super();
for(inti=0;i for(intj=0;j allChess[i][j]='*';//初始化数组allChess,*表示没有棋子存在 } } } /*****************画棋盘要放在paint(Graphicsg)里面***************/ publicvoidpaint(Graphicsg){ for(inti=0;i g.setColor(Color.BLACK);//画线为黑色, g.drawLine(20,20+i*GAP,640-20,20+i*GAP);//棋盘间隔分布 } for(inti=0;i g.setColor(Color.BLACK); g.drawLine(20+i*GAP,20,20+i*GAP,640-20);//棋盘间隔分布 } //画棋子w表示白棋b表示黑棋 for(inti=0;i for(intj=0;j if(allChess[i][j]=='w'){ g.setColor(Color.WHITE); g.fillOval(5+i*40,5+j*40,30,30); } if(allChess[i][j]=='b'){ g.setColor(Color.BLACK); g.fillOval(5+i*40,5+j*40,30,30); } } } } //判断黑棋是否已经有连续连在一起了,有则开始拦截 publicvoidisCon(intx,inty){ charch=allChess[x][y]; /*横向判断*/ intRLastX=x; //横向判断有多少个连在一起了 while(RLastX>=0&&allChess[RLastX][y]==ch){ RLastX--; } intLRLastX=RLastX;//标记最左边的位置 intRNum=0;//统计横向相同的棋子数 RLastX++; while(RLastX RNum++; RLastX++; } /*纵向判断*/ //横向判断有多少个连在一起了 intLLastY=y; while(LLastY>=0&&allChess[x][LLastY]==ch){ LLastY--; } intLLLastY=LLastY;///标记最上面棋盘的位置 intLNum=0;//统计纵向相同的棋子数 LLastY++; while(LLastY LLastY++; LNum++; } /*左下右上判断*/ intLDLastX=x; intRULastY=y; //横向判断有多少个连在一起了 while(LDLastX>=0&&RULastY LDLastX--; RULastY++; } intLLDLastX=LDLastX;//记录左下方棋盘的x坐标 intDRULastY=RULastY;//记录左下方棋盘的y坐标 intLDNum=0; LDLastX++; RULastY--; while(RULastY>=0&&LDLastX &&allChess[LDLastX][RULastY]==ch){ LDNum++; LDLastX++; RULastY--; } /*左上右下判断*/ intRULastX=x; intLDLastY=y; //横向判断有多少个连在一起了 while(RULastX>=0&&LDLastY>=0&&allChess[RULastX][LDLastY]==ch){ RULastX--; LDLastY--; } intLRULastX=RULastX;//记录左上棋子的横坐标 intULDLastY=LDLastY;//记录左上棋子的横坐标 intRUNum=0; RULastX++; LDLastY++; while(RULastX>=0&&RULastX &&allChess[RULastX][LDLastY]==ch){ RULastX++; LDLastY++; RUNum++; } //取最大值也就是最危险的状况 intmax=0; if(max if(max if(max if(max //在最危险的地方放置棋子 if(max==RNum){ if(max==1){ if(x>0){ allChess[x-1][y]='w'; isBlack=true; return; } else{ if(allChess[x+1][y]=='*'){ allChess[x+1][y]='w'; isBlack=true; return; } else{ do{ x=(int)(Math.round((float)(Math.random()*15))); y=(int)(Math.round((float)(Math.random()*15))); }while(allChess[x][y]! ='*'); allChess[x][y]='w';//令棋盘(x,y)设置为白棋isBlack=true; isBlack=true; return; } } } else{ if(allChess[LRLastX][y]=='*'){ allChess[LRLastX][y]='w'; isBlack=true; return; } elseif(allChess[RLastX][y]=='*'){ allChess[RLastX][y]='w'; isBlack=true; return; } } } //上下判断 elseif(max==LNum){ if(allChess[x][LLLastY]=='*'){//最上方的棋盘是否是空的 allChess[x][LLLastY]='w'; isBlack=true; return; } elseif(allChess[x][LLastY]=='*'){//最下方棋盘是否为空 allChess[x][LLastY]='w'; isBlack=true; return; } } //左上右下 elseif(max==LDNum){ if(allChess[LLDLastX][DRULastY]=='*'){//最上方的棋盘是否是空的 allChess[LLDLastX][DRULastY]='w'; isBlack=true; return; } elseif(allChess[LDLastX][RULastY]=='*'){//最下方棋盘是否为空 allChess[LDLastX][RULastY]='w'; isBlack=true; return; } } //左下右上 elseif(max==RUNum){ if(allChess[LRULastX][ULDLastY]=='*'){//最上方的棋盘是否是空的 allChess[LRULastX][ULDLastY]='w'; isBlack=true; return; } elseif(allChess[RULastX][LDLastY]=='*'){//最下方棋盘是否为空 allChess[RULastX][LDLastY]='w'; isBlack=true; return; } } } //判断是否为5个相同的棋子,是返回true,否返回false publicbooleanisWin(intx,inty,booleanisColor){ charch=allChess[x][y]; /*横向判断*/ intRLastX=x; //横向判断是否到达5个相同的棋子,先向左回溯相同颜色,再向右搜索是否有连续5个 while(RLastX>=0&&allChess[RLastX][y]==ch){ RLastX--; } intRNum=0;//统计横向相同的棋子数 RLastX++; intitemRLastx=RLastX+5; while(RLastX &&allChess[RLastX][y]==ch){ RNum++; RLastX++; } /*纵向判断*/ //纵向判断是否到达5个相同的棋子,先向上回溯连续的同一颜色棋子,再向下连续搜索5颗棋子看是否连续 intLLastY=y; while(LLastY>=0&&allChess[x][LLastY]==ch){ LLastY--; } intLNum=0;//统计纵向相同的棋子数 LLastY++; intitemLLastY=LLastY+5; while(LLastY &&allChess[x][LLastY]==ch){ LLastY++; LNum++; } /*左下右上判断*/ intLDLastX=x; intRULastY=y; //往左下回溯相同颜色的旗子,再往右上连续搜索5颗看看是否颜色相同 while(LDLastX>=0&&RULastY &&allChess[LDLastX][RULastY]==ch){ LDLastX--; RULastY++; } intLDNum=0; LDLastX++; RULastY--; intitemLDLastX=LDLastX+5; while(LDLastX &&LDLastX &&allChess[LDLastX][RULastY]==ch){ LDNum++; LDLastX++; RULastY--; } /*左上右下判断*/ intRULastX=x; intLDLastY=y; //往左上回溯相同颜色的旗子,再往右下连续搜索5颗看看是否颜色相同 while(RULastX>=0&&LDLastY>=0&&allChess[RULastX][LDLastY]==ch){ RULastX--; LDLastY--; } intRUNum=0; RULastX++; LDLastY++; intitemLDLastY=LDLastY+5; while(RULastX>=0&&RULastX &&LDLastY &&allChess[RULastX][LDLastY]==ch){ RULastX++; LDLastY++; RUNum++; } if(RNum==5||LNum==5||RUNum==5||LDNum==5){ returntrue; } returnfalse; } @Override publicvoidmouseClicked(MouseEvente){ } //鼠标按下时候画出棋子 publicvoidmousePressed(MouseEvente){//鼠标点击事件处理过程 //获取点击位置坐标 intclick_x=e.getX(); intclick_y=e.getY(); /* *返回x最接近的整数,如果x的小数部分大于等于0.5,返回值是大于x的最小整数,否则round函数返回小于等于x的最大整数 */ intchess_x=Math.round((float)(click_x-20)/GAP); intchess_y=Math.round((float)(click_y-20)/GAP); click_X=chess_x;//获得点击后的横坐标 click_Y=chess_y;//获得点击后的纵坐标 //玩家执黑棋 if(isBlack==true&&allChess[chess_x][chess_y]=='*'){ allChess[chess_x][chess_y]='b';//令棋盘(x,y)设置为黑棋 isBlack=false; } repaint(); if(isWin(chess_x,chess_y,isBlack)){ if(isBlack){//弹出对话框 JOptionPane.showMessageDialog(null,"白棋赢了"); System.exit(0); }else{ JOptionPane.showMessageDialog(null,"黑棋赢了"); System.exit(0); } } if(isBlack==false){//防止再次点击已有棋子区域时下了白棋 isCon(chess_x,chess_y); /* *do{chess_x=(int)(Math.round((float)(Math.random()*15))); *chess_y=(int)(Math.round((float)(Math.random()*15))); *System.out.println(chess_x+""+chess_y);}while *(allChess[chess_x][chess_y]! ='*'); *System.out.println(allChess[chess_x][chess_y]); *allChess[chess_x][chess_y]='w';//令棋盘(x,y)设置为白棋isBlack=true; * */*if(isBlack==false&&allChess[chess_x][chess_y]=='*'){ *allChess[chess_x][chess_y]='w';isBlack=true;//令棋盘(x,y)设置为白棋 *} */ //刷新页面 repaint(); if(isWin(chess_x,chess_y,isBlack)){ if(isBlack){//弹出对话框 JOptionPane.showMessageDialog(null,"白棋赢了"); }else{ JOptionPane.showMessageDialog(null,"黑棋赢了"); } } } } publicvoidmouseReleased(MouseEvente){ } publicvoidmouseEntered(MouseEvente){ } publicvoidmouseExited(MouseEvente){ } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 五子棋 人机