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;ifor(intj=0;jallChess[i][j]='*';//初始化数组allChess,*表示没有棋子存在
}
}
}
/*****************画棋盘要放在paint(Graphicsg)里面***************/
publicvoidpaint(Graphicsg){
for(inti=0;ig.setColor(Color.BLACK);//画线为黑色,
g.drawLine(20,20+i*GAP,640-20,20+i*GAP);//棋盘间隔分布
}
for(inti=0;ig.setColor(Color.BLACK);
g.drawLine(20+i*GAP,20,20+i*GAP,640-20);//棋盘间隔分布
}
//画棋子w表示白棋b表示黑棋
for(inti=0;ifor(intj=0;jif(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(RLastXRNum++;
RLastX++;
}
/*纵向判断*/
//横向判断有多少个连在一起了
intLLastY=y;
while(LLastY>=0&&allChess[x][LLastY]==ch){
LLastY--;
}
intLLLastY=LLastY;///标记最上面棋盘的位置
intLNum=0;//统计纵向相同的棋子数
LLastY++;
while(LLastYLLastY++;
LNum++;
}
/*左下右上判断*/
intLDLastX=x;
intRULastY=y;
//横向判断有多少个连在一起了
while(LDLastX>=0&&RULastYLDLastX--;
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(maxif(maxif(maxif(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){
}
}
|