五子棋.docx
- 文档编号:30281153
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:19
- 大小:47.46KB
五子棋.docx
《五子棋.docx》由会员分享,可在线阅读,更多相关《五子棋.docx(19页珍藏版)》请在冰豆网上搜索。
五子棋
一、问题描述
简单描述和说明要解决的问题
1.绘制棋盘如何绘制。
2.棋盘中下棋功能
3.判断输赢功能;
4.重新开始功能
5.悔棋功能。
二、问题分析及程序设计思路
●绘制棋盘如何绘制
1.使用双重循环绘制棋盘,通过GUI方法绘制直线
●棋盘中下棋功能
1.使用二维存放棋盘每个位置,通过x,y坐标控制位置,判断在数组中,下棋位置是否存放棋子
●棋盘中下棋功能判断输赢功能
1.根据下棋6个方向,判断5颗棋子相连
●重新开始功能
1.清空棋盘的中棋子,让棋盘中变量恢复初始化时状态
●重新开始功能
1.清空棋盘的中棋子,让棋盘中变量恢复初始化时状态
三、设计与实现
1.用到的核心类:
importjava.awt.Graphics;
importjava.awt.event.MouseEvent;
importjava.awt.event.MouseListener;
importjava.io.File;
importjavax.swing.JOptionPane;
importjavax.swing.SwingConstants;
2.核心代码:
五子棋-主框架类,程序启动类:
/*
五子棋-主框架类,程序启动类
*/
publicclassStartChessJFrameextendsJFrame{
privateChessBoardchessBoard;//设置棋盘
privateJPaneltoolbar;//设置一个容器
privateJButtonstartButton,backButton,exitButton;
//设置开始键,返回键,退出键
privateJMenuBarmenuBar;//菜单条
privateJMenusysMenu,exitMenu;//菜单
privateJMenuItemstartMenuItem,backMenuItem;//菜单项
publicStartChessJFrame(){
setTitle("单机版六子棋");//窗口标题
chessBoard=newChessBoard();//新建一个棋盘
menuBar=newJMenuBar();//创建一个菜单条
sysMenu=newJMenu("系统");//创建一个菜单名叫“系统”
startMenuItem=newJMenuItem("重新开始");
//exitMenuItem=newJMenuItem("退出");
backMenuItem=newJMenuItem("悔棋");//创建一个菜单项名叫“悔棋”
sysMenu.add(startMenuItem);//添加菜单项“重新开始”到菜单中
sysMenu.add(backMenuItem);
//sysMenu.add(exitMenuItem);
exitMenu=newJMenu("退出");//鼠标监听退出
exitMenu.addMenuListener(newMenuListener(){
@Override
publicvoidmenuSelected(MenuEvente){
inta=JOptionPane.showConfirmDialog(null,"退出");
if(a==0){
System.exit(0);
}
}
@Override
publicvoidmenuDeselected(MenuEvente){
}
@Override
publicvoidmenuCanceled(MenuEvente){
}
});
MyItemListenerlis=newMyItemListener();//创建一个监听器
this.startMenuItem.addActionListener(lis);//当前开始菜单选项添加事件监听器
backMenuItem.addActionListener(lis);
menuBar.add(sysMenu);//把菜单添加到菜单条中
menuBar.add(exitMenu);
setJMenuBar(menuBar);//设置菜单
toolbar=newJPanel();//设置一个面板容器
//创建三个按钮名为“重新开始”“悔棋”“退出”
startButton=newJButton("重新开始");
backButton=newJButton("悔棋");
exitButton=newJButton("退出");
//toolbar.setLayout(newFlowLayout(FlowLayout.LEFT));//
//toolbar这个组件设置布局,是左对齐的flowlayout
toolbar.setLayout(newBorderLayout(100,100));
//把开始,悔棋,退出按钮添加到容器中去
toolbar.add(startButton,BorderLayout.WEST);
toolbar.add(backButton,BorderLayout.CENTER);
toolbar.add(exitButton,BorderLayout.EAST);
//在三个按钮上设置监听器
startButton.addActionListener(lis);
backButton.addActionListener(lis);
exitButton.addActionListener(lis);
add(toolbar,BorderLayout.SOUTH);//把含有三个按钮的容器添加到界面下方
add(chessBoard);//把棋盘添加到界面
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置退出按钮
setResizable(false);
setSize(700,700);//修改前为自动设置大小,修改后为700像素*700像素
//pack();//依据放置的组件设定窗口的大小,使之正好能容纳放置的所有组件
setLocationRelativeTo(null);//修改后窗口居中
}
privateclassMyItemListenerimplementsActionListener{//创建一个类MyItemListener继承ActionListener类(事件监听)
publicvoidactionPerformed(ActionEvente){
Objectobj=e.getSource();//获得事件监听的对象,即点击了什么按钮
if(obj==StartChessJFrame.this.startMenuItem
||obj==startButton){
//如果点击了开始按钮
//JFiveFrame.this内部类引用外部类
System.out.println("重新开始...");
chessBoard.restartGame();
}elseif(obj==exitButton){
inta=JOptionPane.showConfirmDialog(null,"退出");
if(a==0){
System.exit(0);
}
//System.exit(0);//如果点击退出,退出游戏
}elseif(obj==backMenuItem||obj==backButton){//如果点击悔棋,回退一步
System.out.println("悔棋...");
chessBoard.goback();
}
}
}
publicstaticvoidmain(String[]args){
StartChessJFramef=newStartChessJFrame();//开始五子棋游戏
f.setVisible(true);//数据模型已经构造好,允许JVM可以根据数据模型执行paint方法开始画图并显示到屏幕上
}
}
五子棋-棋盘类:
packageChess;
importjavax.swing.*;
importjava.awt.*;
importjava.awt.event.MouseListener;
importjava.awt.event.MouseMotionListener;
importjava.awt.event.MouseEvent;
/*
五子棋-棋盘类
*/
//a
publicclassChessBoardextendsJPanelimplementsMouseListener{
//publicstaticfinalintMARGIN=30;//边缘30
publicstaticfinalintMARGIN=80;//修改后边缘80
//publicstaticfinalintGRID_SPAN=35;//格子间距35
publicstaticfinalintGRID_SPAN=50;//修改后格子间距50
//publicstaticfinalintROWS=8;//行数为8
publicstaticfinalintROWS=9;//修改后行数为9
//publicstaticfinalintCOLS=9;//列数为9
publicstaticfinalintCOLS=10;//修改后列数为9
Point[]chessList=newPoint[(ROWS+1)*(COLS+1)];//可放置棋子的点数个数
booleanisBlack=false;//默认为黑棋,修改后把true该为false,变为白棋先行
booleangameOver=false;//默认游戏未结束
intchessCount;//步数
intxIndex,yIndex;//横坐标纵坐标
publicChessBoard(){
setBackground(Color.lightGray);//棋盘背景色为橙色,修改后为灰色
addMouseListener(this);//鼠标监听器
addMouseMotionListener(newMouseMotionListener(){//创建一个新的鼠标监听器
publicvoidmouseDragged(MouseEvente){
}
publicvoidmouseMoved(MouseEvente){
//鼠标移动监听
intx1=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN;
inty1=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;
//鼠标移到位置对应的可以放置棋子的点所在的行
//鼠标移到位置对应的可以放置棋子的点所在的列
//设置鼠标形状
if(x1<0||x1>ROWS||y1<0||y1>COLS||gameOver
||findChess(x1,y1))
setCursor(newCursor(Cursor.DEFAULT_CURSOR));//当在棋盘外时,鼠标为指针
else
setCursor(newCursor(Cursor.HAND_CURSOR));//当在棋盘内时,鼠标为手形
}
});
}
//画界面
publicvoidpaintComponent(Graphicsg){
super.paintComponent(g);
//画界面
for(inti=0;i<=ROWS;i++){//画横行
g.drawLine(MARGIN,MARGIN+i*GRID_SPAN,MARGIN+COLS
*GRID_SPAN,MARGIN+i*GRID_SPAN);
}
for(inti=0;i<=COLS;i++){//画纵列
g.drawLine(MARGIN+i*GRID_SPAN,MARGIN,MARGIN+i*GRID_SPAN,
MARGIN+ROWS*GRID_SPAN);
}
//先下的棋子
for(inti=0;i intxPos=chessList[i].getX()*GRID_SPAN+MARGIN;//横坐标 intyPos=chessList[i].getY()*GRID_SPAN+MARGIN;//纵坐标 g.setColor(chessList[i].getColor());//获取棋子的颜色 g.fillOval(xPos-Point.DIAMETER/2,yPos-Point.DIAMETER/2, Point.DIAMETER,Point.DIAMETER); //确定下的棋子 if(i==chessCount-1){//下的棋子量-1 g.setColor(Color.red); g.drawRect(xPos-Point.DIAMETER/2, yPos-Point.DIAMETER/2,Point.DIAMETER, Point.DIAMETER); } } } publicvoidmousePressed(MouseEvente){//鼠标点击时 //判断游戏是否结束 if(gameOver) return; //StringcolorName=isBlack? "黑棋": "白棋";修改前 StringcolorName=isBlack? "黄棋": "红棋";//修改后为黄红 xIndex=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//鼠标移到位置对应的可以放置棋子的点所在的行 yIndex=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//鼠标移到位置对应的可以放置棋子的点所在的列 //黑棋,不能下 if(xIndex<0||xIndex>ROWS||yIndex<0||yIndex>COLS) return; //白棋,不能下 if(findChess(xIndex,yIndex)) return; Pointch=newPoint(xIndex,yIndex,isBlack? Color.ORANGE : Color.magenta); //修改棋子颜色,前为黑白,修改后为黄红。 /* *Pointch=newPoint(xIndex,yIndex,isBlack? Color.black: *Color.white); */ chessList[chessCount++]=ch; repaint();//重绘组件 if(isWin()){ //判断黑棋或者是白棋赢了 Stringmsg=String.format("恭喜,%s赢了! ",colorName); JOptionPane.showMessageDialog(this,msg); gameOver=true; } isBlack=! isBlack; } //设置鼠标监听 publicvoidmouseClicked(MouseEvente){ }//鼠标点击时 publicvoidmouseEntered(MouseEvente){ }//鼠标进入时 publicvoidmouseExited(MouseEvente){ }//鼠标退出时 publicvoidmouseReleased(MouseEvente){ }//松开鼠标时 //判断是否落子 privatebooleanfindChess(intx,inty){ for(Pointc: chessList){ if(c! =null&&c.getX()==x&&c.getY()==y) returntrue; } returnfalse; } /* *修改为六子棋 */ privatebooleanisWin(){//判断是否赢了 intcontinueCount=1;//设置初始连子数为1 //横列向左查找 for(intx=xIndex-1;x>=0;x--){ Colorc=isBlack? Color.ORANGE: Color.magenta; if(getChess(x,yIndex,c)! =null){ continueCount++; }else break; } //向右查找 for(intx=xIndex+1;x<=ROWS;x++){ Colorc=isBlack? Color.ORANGE: Color.magenta; if(getChess(x,yIndex,c)! =null){ continueCount++; }else break; } if(continueCount>=6){ returntrue; }else continueCount=1; //纵列向左查找 for(inty=yIndex-1;y>=0;y--){ Colorc=isBlack? Color.ORANGE: Color.magenta; if(getChess(xIndex,y,c)! =null){ continueCount++; }else break; } //向右查找 for(inty=yIndex+1;y<=ROWS;y++){ Colorc=isBlack? Color.ORANGE: Color.magenta; if(getChess(xIndex,y,c)! =null){ continueCount++; }else break; } if(continueCount>=6){ returntrue; }else continueCount=1; //斜向左下相连向左查找 for(intx=xIndex+1,y=yIndex-1;y>=0&&x<=COLS;x++,y--){ Colorc=isBlack? Color.ORANGE: Color.magenta; if(getChess(x,y,c)! =null){ continueCount++; }else break; } //向右查找 for(intx=xIndex-1,y=yIndex+1;y<=ROWS&&x>=0;x--,y++){ Colorc=isBlack? Color.ORANGE: Color.magenta; if(getChess(x,y,c)! =null){ continueCount++; }else break; } if(continueCount>=6){ returntrue; }else continueCount=1; //斜向右下相连向右查找 for(intx=xIndex-1,y=yIndex-1;y>=0&&x>=0;x--,y--){ Colorc=isBlack? Color.ORANGE: Color.magenta; if(getChess(x,y,c)! =null){ continueCount++; }else break; } //向左查找 for(intx=xIndex+1,y=yIndex+1;y<=ROWS&&x<=COLS;x++,y++){ Colorc=isBlack? Color.ORANGE: Color.magenta; if(getChess(x,y,c)! =null){ continueCount++; }else break; } if(continueCo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 五子棋