五子棋.docx
- 文档编号:29274421
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:20
- 大小:16.88KB
五子棋.docx
《五子棋.docx》由会员分享,可在线阅读,更多相关《五子棋.docx(20页珍藏版)》请在冰豆网上搜索。
五子棋
packagetest;
importjava.awt.event.ActionEvent;
importjava.awt.Graphics;
importjava.awt.Color;
importjava.awt.Graphics;
importjava.awt.event.MouseAdapter;
importjava.awt.event.MouseEvent;
importjavax.swing.JOptionPane;
importjavax.swing.JPanel;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjavax.swing.JFrame;
importjavax.swing.JMenu;
importjavax.swing.JMenuBar;
importjavax.swing.JMenuItem;
publicclassT1extendsJFrame{
publicstaticintWIDTH=700;//窗口的宽
publicstaticintHEIGHT=700;//窗口的高
publicstaticbooleanisComputer=true;//是否与电脑对战
publicT1(){
this.setSize(WIDTH,HEIGHT);//设置窗口的宽度高度
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置默认窗体关闭
ChessModelcm=newChessModel();//下棋的模式类
finalChessPanelcp=newChessPanel(cm);//创建棋盘的面板
this.setContentPane(cp);//将窗口的面板设置为棋盘的面板
cp.setFocusable(true);//设置面板焦点
setTitle("简易版的五子棋5.0");//设置标题
//添加菜单
JMenuBargameMenuBar=newJMenuBar();//创建菜单栏
this.setJMenuBar(gameMenuBar);//给窗体设置菜单
JMenugame=newJMenu("游戏");//游戏菜单
JMenuhelp=newJMenu("帮助");//帮助菜单
gameMenuBar.add(game);//菜单栏中添加游戏菜单
gameMenuBar.add(help);//菜单栏中添加帮助菜单
JMenuItemperson=newJMenuItem("人人对弈");//子菜单人人对弈
person.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
isComputer=false;
cp.restart();
cp.repaint();
}
});
JMenuItemcomputer=newJMenuItem("人机对弈");//子菜单人机对弈
computer.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
isComputer=true;
cp.restart();
cp.repaint();
}
});
game.add(person);//在游戏菜单中添加子菜单人人对弈
game.add(computer);//在游戏菜单中添加人机对弈子菜单
JMenuItemversion=newJMenuItem("版本");//创建版本子菜单
//给菜单添加ActionListener的事件监听
version.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
//弹出消息框
JOptionPane
.showMessageDialog(T1.this,"作者:
徐柏华,版本:
5.0,五子棋");
}
});
help.add(version);//帮助菜单中添加子菜单版本
}
publicstaticvoidmain(String[]args){
//创建游戏窗口并显示
newT1().setVisible(true);
}
}
classChessPanelextendsJPanel{
//代表每个下棋坐标的二维数组
privateintarrMapShow[][];
//每个方格的边长
publicstaticintsquare_width=30;
//棋子的宽度
publicstaticintchess_width=25;
//棋盘的行数,列数
privateintwidth;
privateintheight;
ChessModelcm;//获取棋盘模式方便调用它的方法
publicChessPanel(ChessModelcm){
this.cm=cm;//获得模式
width=cm.getWidth();//获得行
height=cm.getHeight();//获得列
arrMapShow=cm.getArr();//获得棋盘二维数组
this.addMouseListener(newMouseAdapter(){
@Override
publicvoidmouseClicked(MouseEvente){
ChessModelcm=ChessPanel.this.cm;
intx=(e.getX()-square_width/2)/square_width;
inty=(e.getY()-square_width/2)/square_width;
if(e.getModifiers()==MouseEvent.BUTTON1_MASK)
if(cm.play(x,y))
return;
repaint();
if(!
cm.isOut(x,y)&&cm.isWin(x,y,ChessModel.BLACK_CHESS)
&&!
cm.isOdd()){
JOptionPane
.showMessageDialog(ChessPanel.this,"黑棋胜利,按[确定]");
ChessPanel.this.restart();
repaint();
return;
}
if(!
T1.isComputer&&!
cm.isOut(x,y)&&cm.isWin(x,y,2)
&&cm.isOdd()){
JOptionPane
.showMessageDialog(ChessPanel.this,"白棋胜利,按[确定]");
ChessPanel.this.restart();
repaint();
return;
}
if(!
T1.isComputer)
return;
puterTo();
repaint();
if(cm.isWin(cm.getX(),cm.getY(),ChessModel.WHITE_CHESS)){
JOptionPane
.showMessageDialog(ChessPanel.this,"白棋胜利,按[确定]");
ChessPanel.this.restart();
repaint();
return;
}
}
@Override
publicvoidmousePressed(MouseEvente){
intx=(e.getX()-square_width/2)/square_width;
inty=(e.getY()-square_width/2)/square_width;
if(ChessPanel.this.cm.play(x,y))
return;
repaint();
}
});
}
publicvoidrestart(){
this.cm=newChessModel();
this.arrMapShow=cm.getArr();
}
publicvoidpaint(Graphicsg){
super.paint(g);
g.setColor(newColor(190,150,40));
g.fillRect(0,0,T1.WIDTH,T1.HEIGHT);
for(inti=0;i<=height;i++)
for(intj=0;j<=width;j++){
draw(g,i,j,arrMapShow[i][j]);
}
}
publicvoiddraw(Graphicsg,intcol,introw,inttype){
intx=square_width*(col+1);
inty=square_width*(row+1);
g.setColor(Color.WHITE);
if(row!
=height&&col!
=width)
g.drawRect(x,y,square_width,square_width);
switch(type){
case0:
break;
case1:
g.setColor(Color.BLACK);
g.fillOval(x-chess_width/2,y-chess_width/2,chess_width,
chess_width);
g.setColor(Color.WHITE);
g.drawOval(x-chess_width/2,y-chess_width/2,chess_width,
chess_width);
break;
case2:
g.setColor(Color.WHITE);
g.fillOval(x-chess_width/2,y-chess_width/2,chess_width,
chess_width);
g.setColor(Color.BLACK);
g.drawOval(x-chess_width/2,y-chess_width/2,chess_width,
chess_width);
break;
}
}
}
classChessModel{
publicstaticintNO_CHESS=0;
publicstaticintBLACK_CHESS=1;
publicstaticintWHITE_CHESS=2;
privateint[][]arrMapShow;
privateintx,y;
privateintwidth;
privateintheight;
privatebooleanisOdd=true;
publicChessModel(){
width=20;
height=20;
arrMapShow=newint[width+1][height+1];
}
publicint[][]getArr(){
returnarrMapShow;
}
publicbooleanisOut(intx,inty){
returnx<0||x>width||y<0||y>height;
}
publicbooleanisOdd(){
returnisOdd;
}
publicintgetWidth(){
returnwidth;
}
publicvoidsetWidth(intwidth){
this.width=width;
}
publicintgetHeight(){
returnheight;
}
publicvoidsetHeight(intheight){
this.height=height;
}
//玩家点击开始下棋
publicbooleanisChess(intx,inty){
returnarrMapShow[x][y]==0?
false:
true;
}
publicbooleanplay(intx,inty){
if(isOut(x,y))
returnfalse;
if(isChess(x,y))
returnfalse;
if(isOdd){
isOdd=false;
arrMapShow[x][y]=BLACK_CHESS;
returntrue;
}else{
isOdd=true;
arrMapShow[x][y]=WHITE_CHESS;
returntrue;
}
}
//判断胜负
publicbooleanisWin(intx,inty,intblack_or_white){
inttemp_x;
inttemp_y;
intnum;
//判断左边的棋子数量
num=1;
temp_x=x;
temp_y=y;
for(inti=0;i<4;i++){
temp_x--;
if(temp_x<0)
break;
if(arrMapShow[temp_x][temp_y]==black_or_white)
num++;
else
break;
}
//判断右边的棋子数量
temp_x=x;
temp_y=y;
for(inti=0;i<4;i++){
temp_x++;
if(temp_x>width)
break;
if(arrMapShow[temp_x][temp_y]==black_or_white)
num++;
else
break;
}
if(num>=5)
returntrue;
//判断上边的棋子数量
num=1;
temp_x=x;
temp_y=y;
for(inti=0;i<4;i++){
temp_y--;
if(temp_y<0)
break;
if(arrMapShow[temp_x][temp_y]==black_or_white)
num++;
else
break;
}
//判断下边的棋子数量
temp_x=x;
temp_y=y;
for(inti=0;i<4;i++){
temp_y++;
if(temp_y>height)
break;
if(arrMapShow[temp_x][temp_y]==black_or_white)
num++;
else
break;
}
if(num>=5)
returntrue;
//判断左上边的棋子数量
num=1;
temp_x=x;
temp_y=y;
for(inti=0;i<4;i++){
temp_y--;
temp_x--;
if(temp_y<0||temp_x<0)
break;
if(arrMapShow[temp_x][temp_y]==black_or_white)
num++;
else
break;
}
//判断右下边的棋子数量
temp_x=x;
temp_y=y;
for(inti=0;i<4;i++){
temp_x++;
temp_y++;
if(temp_y>height||temp_x>width)
break;
if(arrMapShow[temp_x][temp_y]==black_or_white)
num++;
else
break;
}
if(num>=5)
returntrue;
//判断右上边的棋子数量
num=1;
temp_x=x;
temp_y=y;
for(inti=0;i<4;i++){
temp_y--;
temp_x++;
if(temp_y<0||temp_x>width)
break;
if(arrMapShow[temp_x][temp_y]==black_or_white)
num++;
else
break;
}
//判断左下边的棋子数量
temp_x=x;
temp_y=y;
for(inti=0;i<4;i++){
temp_x--;
temp_y++;
if(temp_y>height||temp_x<0)
break;
if(arrMapShow[temp_x][temp_y]==black_or_white)
num++;
else
break;
}
if(num>=5)
returntrue;
returnfalse;
}
publicintmaxChess(intx,inty,intblack_or_white){
inttemp_x;
inttemp_y;
intnum;
intmax=0;
//判断左边的棋子数量
num=0;
temp_x=x;
temp_y=y;
for(inti=0;i<4;i++){
temp_x--;
if(temp_x<0)
break;
if(arrMapShow[temp_x][temp_y]==black_or_white)
num++;
else
break;
}
//判断右边的棋子数量
temp_x=x;
temp_y=y;
for(inti=0;i<4;i++){
temp_x++;
if(temp_x>width)
break;
if(arrMapShow[temp_x][temp_y]==black_or_white)
num++;
else
break;
}
if(num>max)
max=num;
//判断上边的棋子数量
num=0;
temp_x=x;
temp_y=y;
for(inti=0;i<4;i++){
temp_y--;
if(temp_y<0)
break;
if(arrMapShow[temp_x][temp_y]==black_or_white)
num++;
else
break;
}
//判断下边的棋子数量
temp_x=x;
temp_y=y;
for(inti=0;i<4;i++){
temp_y++;
if(temp_y>height)
break;
if(arrMapShow[temp_x][temp_y]==black_or_white)
num++;
else
break;
}
if(num>max)
max=num;
//判断左上边的棋子数量
num=0;
temp_x=x;
temp_y=y;
for(inti=0;i<4;i++){
temp_y--;
temp_x--;
if(temp_y<0||temp_x<0)
break;
if(arrMapShow[temp_x][temp_y]==black_or_white)
num++;
else
break;
}
//判断右下边的棋子数量
temp_x=x;
temp_y=y;
for(inti=0;i<4;i++){
temp_x++;
temp_y++;
if(temp_y>height||temp_x>width)
break;
if(arrMapShow[temp_x][temp_y]==black_or_white)
num++;
else
break;
}
if(num>max)
max=num;
//判断右上边的棋子数量
num=0;
temp_x=x;
temp_y=y;
for(inti=0;i<4;i++){
temp_y--;
temp_x++;
if(temp_y<0||temp_x>width)
break;
if(arrMapShow[temp_x][temp_y]==black_or_white)
num++;
else
break;
}
//判断左下边的棋子数量
temp_x=x;
temp_y=y;
for(inti=0;i<4;i++){
temp_x--;
temp_y++;
if(temp_y>height||temp_x<0)
break;
if(arrMapShow[te
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 五子棋