您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > C/C++资料 > java五子棋源代码
packagechess;importjava.awt.Button;importjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics;importjava.awt.Toolkit;importjava.awt.event.MouseEvent;importjava.awt.event.MouseListener;importjava.awt.image.BufferedImage;importjava.io.File;importjava.io.IOException;importjavax.imageio.ImageIO;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JOptionPane;publicclassChessextendsJFrameimplementsMouseListener,Runnable{privatestaticfinallongserialVersionUID=1L;intwidth=Toolkit.getDefaultToolkit().getScreenSize().width;inthight=Toolkit.getDefaultToolkit().getScreenSize().height;//背景图片BufferedImagebjImage=null;//保存棋子坐标intx=0;inty=0;//保存之前下过的棋子坐标//其中数据:0:表示这个点没有棋子1:表示黑子2:表示白子int[][]allChess=newint[19][19];//标识当前是黑棋还是白旗下下一步booleanisBlack=true;//标识当前游戏是否可以继续booleancanPlay=true;//保存显示的提示信息Stringmessage=黑方先行;//保存最多拥有多少时间(秒)intmaxTime=0;//做倒计时的线程类Threadt=newThread(this);//保存黑方与白方的剩余时间intblackTime=0;intwhiteTime=0;//保存双方剩余时间的显示信息StringblackMessage=无限制;StringwhiteMessage=无限制;@SuppressWarnings(deprecation)publicChess(){this.setTitle(五子棋);this.setSize(500,500);this.setLocation((width-500)/2,(hight-500)/2);this.addMouseListener(this);//this.setResizable(false);this.setVisible(true);this.setLayout(null);t.start();t.suspend();//线程挂起//刚打开的时候刷新屏幕,防止开始游戏时无法显示的问题this.repaint();this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);try{bjImage=ImageIO.read(newFile(C:\\Users\\cwb\\Desktop\\timg.jpg));}catch(IOExceptione){e.printStackTrace();}}@Overridepublicvoidpaint(Graphicsg){//双缓存技术防止屏幕闪烁但不知道为什么,使用双缓存技术以后,效果特不好,所以没用,如果使用的话,下面的g改为g2就可以了//BufferedImagebi=new//BufferedImage(500,500,BufferedImage.TYPE_INT_ARGB);//Graphicsg=bi.createGraphics();g.drawImage(bjImage,0,20,this);g.setFont(newFont(黑体,Font.BOLD,20));g.drawString(游戏信息:+message,120,60);g.setFont(newFont(宋体,0,14));g.drawString(黑方时间:+blackMessage,30,470);g.drawString(白方时间:+whiteMessage,260,470);g.drawString(开始游戏,400,100);g.drawString(游戏设置,400,150);g.drawString(游戏说明,400,200);g.drawString(认输,400,300);g.drawString(关于,400,350);g.drawString(退出,400,400);//绘制棋盘for(inti=0;i19;i++){g.drawLine(10,70+20*i,370,70+20*i);g.drawLine(10+20*i,70,10+20*i,430);}//标注小圆点位g.fillOval(68,128,4,4);g.fillOval(308,128,4,4);g.fillOval(308,368,4,4);g.fillOval(68,368,4,4);g.fillOval(188,128,4,4);g.fillOval(68,248,4,4);g.fillOval(188,368,4,4);g.fillOval(188,248,4,4);g.fillOval(308,248,4,4);////绘制棋子//x=(x-10)/20*20+10;//是为了取得交叉点的坐标//y=(y-70)/20*20+70;////黑子//g.fillOval(x-7,y-7,14,14);////白子//g.setColor(Color.BLACK);//g.fillOval(x-7,y-7,14,14);//g.setColor(Color.BLACK);//g.drawOval(x-7,y-7,14,14);//输出数组中所有数值//绘制全部棋子for(inti=0;i19;i++){for(intj=0;j19;j++){if(allChess[i][j]==1){//黑子inttempX=i*20+10;inttempY=j*20+70;g.fillOval(tempX-7,tempY-7,14,14);}if(allChess[i][j]==2){//白子inttempX=i*20+10;inttempY=j*20+70;g.setColor(Color.WHITE);g.fillOval(tempX-7,tempY-7,14,14);g.setColor(Color.BLACK);g.drawOval(tempX-7,tempY-7,14,14);}}}}@OverridepublicvoidmouseClicked(MouseEvente){}privatebooleancheckWin(){booleanflag=false;//保存共有多少相同颜色棋子相连intcount=1;//判断横向特点:allChess[x][y]中y值相同intcolor=allChess[x][y];//判断横向count=this.checkCount(1,0,color);if(count=5){flag=true;}else{//判断纵向count=this.checkCount(0,1,color);if(count=5){flag=true;}else{//判断右上左下count=this.checkCount(1,-1,color);if(count=5){flag=true;}else{//判断左下右上count=this.checkCount(1,1,color);if(count=5){flag=true;}}}}returnflag;}//判断棋子连接数量privateintcheckCount(intxChange,intyChange,intcolor){intcount=1;inttempX=xChange;inttempY=yChange;while(x+xChange=0&&x+xChange=18&&y+yChange=0&&y+yChange=18&&color==allChess[x+xChange][y+yChange]){count++;if(xChange!=0){xChange++;}if(yChange!=0){if(yChange0){yChange++;}else{yChange--;}}}xChange=tempX;yChange=tempY;while(x-xChange=0&&x-xChange=18&&y-yChange=0&&y-yChange=18&&color==allChess[x-xChange][y-yChange]){count++;if(xChange!=0){xChange++;}if(yChange!=0){if(yChange0){yChange++;}else{yChange--;}}}returncount;}@OverridepublicvoidmouseEntered(MouseEventarg0){}@OverridepublicvoidmouseExited(MouseEventarg0){}@SuppressWarnings(deprecation)@OverridepublicvoidmousePressed(MouseEvente){if(canPlay==true){x=e.getX();y=e.getY();if(x=10&&x=370&&y=70&&y=430){//System.out.println(在棋盘范围内:+x+--+y);x=(x-10)/20;//是为了取得交叉点的坐标y=(y-70)/20;if(allChess[x][y]==0){//判断当前要下的是什么棋子if(isBlack==true){allChess[x][y]=1;isBlack=false;message=轮到白方;}else{allChess[x][y]=2;isBlack=true;message=轮到黑方;}//判断这个棋子是否和其他棋子连成5个booleanwinFlag=this.checkWin();if(winFlag==true){JOptionPane.showMessageDialog(this,游戏结束,+(allChess[x][y]==1?黑方:白方)+获胜!);canPlay=false;}}else{JOptionPane.showMessageDialog(this,当前位子已经有棋子,请重新落子!!!);}this.repaint();}}//点击开始游戏按钮if(e.getX()=400&&e.getX()=470&&e.getY()=70&&e.getY()=100){intresult=JOptionPane.showConfirmDialog(this,是否重新开始游戏?);if(result==0){//现在重新开始游戏//重新开始所要做的操作:1)把棋盘清空,allChess数组中全部数据归0;//2)游戏相关信息显示初始化//3)将下一步下棋改为黑方for(inti=0;i19;i++){for(intj=0;j19;j++){allChess[i][j]=0;}}//另一种方式allChess=newint[19][19]message=黑方先行;isBlack=true;blackTime=maxTime;whiteTime=maxTime;if(maxTime0){blackMessage=maxTime/36
本文标题:java五子棋源代码
链接地址:https://www.777doc.com/doc-5156252 .html