java五子棋人机.docx

上传人:b****5 文档编号:11671509 上传时间:2023-03-30 格式:DOCX 页数:14 大小:34.34KB
下载 相关 举报
java五子棋人机.docx_第1页
第1页 / 共14页
java五子棋人机.docx_第2页
第2页 / 共14页
java五子棋人机.docx_第3页
第3页 / 共14页
java五子棋人机.docx_第4页
第4页 / 共14页
java五子棋人机.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

java五子棋人机.docx

《java五子棋人机.docx》由会员分享,可在线阅读,更多相关《java五子棋人机.docx(14页珍藏版)》请在冰豆网上搜索。

java五子棋人机.docx

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=0

&&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){

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1