问题描述
希望能帮我一下。说一下我五子棋的新玩法:就是要开始游戏的时候,可以设置一下黑白双方的棋子数目,当一方的棋子连成五个后,就可以把这五个棋子加到棋子的数目里面,然后同时把对方的棋子数目减去一个,最好判断哪放棋子的数目为0(下到棋盘上棋子数目也会减少)代码: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.JFrame;importjavax.swing.JOptionPane;classFiveChessFrameextendsJFrameimplementsMouseListener{//取得屏幕的宽度intwidth=Toolkit.getDefaultToolkit().getScreenSize().width;//取得屏幕的高度intheight=Toolkit.getDefaultToolkit().getScreenSize().height;//背景图片BufferedImagebgImage=null;//保存棋子的坐标intx=0;inty=0;//保存之前下过的全部棋子的坐标//其中数据内容0:表示这个点并没有棋子,1:表示这个点是黑子,2:表示这个点是白子int[][]allChess=newint[19][19];//标识当前应该黑棋还是白棋下下一步booleanisBlack=true;//标识当前游戏是否可以继续booleancanPlay=true;//保存显示的提示信息Stringmessage="黑方先行";//保存黑方与白方的剩余棋子//保存最多拥有多少棋子intmaxCount=0;intblackCount=0;intwhiteCount=0;//保存双方剩余棋子的显示信息StringblackMessage="无限制";StringwhiteMessage="无限制";publicFiveChessFrame(){//设置标题this.setTitle("五子棋");//设置窗体大小this.setSize(500,500);//设置窗体出现位置this.setLocation((width-500)/2,(height-500)/2);//将窗体设置为大小不可改变this.setResizable(false);//将窗体的关闭方式设置为默认关闭后程序结束this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//为窗体加入监听器this.addMouseListener(this);//将窗体显示出来this.setVisible(true);//刷新屏幕,防止开始游戏时出现无法显示的情况.this.repaint();try{bgImage=ImageIO.read(newFile("E:/workspace/课程设计/src/image/background.jpg"));}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}publicvoidpaint(Graphicsg){//双缓冲技术防止屏幕闪烁BufferedImagebi=newBufferedImage(500,500,BufferedImage.TYPE_INT_RGB);Graphicsg2=bi.createGraphics();g2.setColor(Color.BLACK);//绘制背景g2.drawImage(bgImage,1,20,this);//this代表整个窗体//输出标题信息g2.setFont(newFont("黑体",Font.BOLD,20));//加粗g2.drawString("游戏信息:"+message,130,60);g2.drawString("黑方棋子:"+blackMessage,30,470);g2.drawString("白方棋子:"+whiteMessage,260,470);//绘制棋盘for(inti=0;i<19;i++){g2.drawLine(10,70+20*i,370,70+20*i);g2.drawLine(10+20*i,70,10+20*i,430);}//标注点位g2.fillOval(68,128,4,4);g2.fillOval(308,128,4,4);g2.fillOval(308,368,4,4);g2.fillOval(68,368,4,4);//四个角的点g2.fillOval(68,248,4,4);g2.fillOval(188,368,4,4);//四个角的中心点g2.fillOval(188,248,4,4);//中心点//绘制全部棋子for(inti=0;i<19;i++){for(intj=0;j<19;j++){if(allChess[i][j]==1){//黑子inttempX=i*20+10;inttempY=j*20+70;//就能够绘制在点上了g2.fillOval(tempX-7,tempY-7,14,14);}if(allChess[i][j]==2){//白子inttempX=i*20+10;inttempY=j*20+70;g2.setColor(Color.WHITE);g2.fillOval(tempX-7,tempY-7,14,14);g2.setColor(Color.BLACK);g2.drawOval(tempX-7,tempY-7,14,14);}}}g.drawImage(bi,0,0,this);}publicvoidmouseClicked(MouseEvente){//TODOAuto-generatedmethodstub}publicvoidmouseEntered(MouseEvente){//TODOAuto-generatedmethodstub}publicvoidmouseExited(MouseEvente){//TODOAuto-generatedmethodstub}publicvoidmousePressed(MouseEvente){//TODOAuto-generatedmethodstubif(canPlay==true){x=e.getX();y=e.getY();//System.out.println("X="+x);//System.out.println("Y="+y);if(x>=10&&x<=370&&y>=70&&y<=430){x=x/20;y=(y-60)/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;i<19;i++){for(intj=0;j<19;j++){allChess[i][j]=0;//另一种方式allChess=newint[19][19];}}message="黑方先行";isBlack=true;//下一步改为黑方blackCount=maxCount;whiteCount=maxCount;if(maxCount>0){blackMessage=String.valueOf(maxCount);whiteMessage=String.valueOf(maxCount);}else{blackMessage="无限制";whiteMessage="无限制";}this.canPlay=true;this.repaint();//重新刷新一下图片}}//点击游戏设置按钮if(e.getX()>=400&&e.getX()<=470&&e.getY()>=120&&e.getY()<=150){Stringinput=JOptionPane.showInputDialog("请输入游戏的最大数量棋子数(单位:个),如果输入0,表示没有时间限制:");try{maxCount=Integer.parseInt(input);if(maxCount<0){JOptionPane.showMessageDialog(this,"请输入正确信息,不允许输入负数!");}if(maxCount==0){intresult=JOptionPane.showConfirmDialog(this,"设置完成,是否重新开始游戏?");if(result==0){for(inti=0;i<19;i++){for(intj=0;j<19;j++){allChess[i][j]=0;}}//另一种方式allChess=newint[19][19];message="黑方先行";isBlack=true;blackCount=maxCount;whiteCount=maxCount;blackMessage="无限制";whiteMessage="无限制";this.canPlay=true;this.repaint();}}if(maxCount>0){intresult=JOptionPane.showConfirmDialog(this,"设置完成,是否重新开始游戏?");if(result==0){for(inti=0;i<19;i++){for(intj=0;j<19;j++){allChess[i][j]=0;}}//另一种方式allChess=newint[19][19];message="黑方先行";isBlack=true;blackCount=maxCount;whiteCount=maxCount;blackMessage=String.valueOf(maxCount);whiteMessage=String.valueOf(maxCount);this.canPlay=true;this.repaint();}}}catch(NumberFormatExceptione1){//TODOAuto-generatedcatchblockJOptionPane.showMessageDialog(this,"请正确输入信息!");}}//点击游戏说明按钮if(e.getX()>=400&&e.getX()<=470&&e.getY()>=170&&e.getY()<=200){JOptionPane.showMessageDialog(this,"五子棋游戏,黑白双方轮流下棋,当某一方连到五子时,可以收起连起来的五个棋子,"+"然后用自己的一个棋子代替对方在棋盘上任意的一个棋子,直到一方的棋子数量"+"小于4个,游戏结束。");}//点击认输按钮if(e.getX()>=400&&e.getX()<=470&&e.getY()>=270&&e.getY()<=300){intresult=JOptionPane.showConfirmDialog(this,"是否确认认输?");if(result==0){if(isBlack){JOptionPane.showMessageDialog(this,"黑方已经认输,游戏结束!");}else{JOptionPane.showMessageDialog(this,"白方已经认输,游戏结束!");}canPlay=false;}}//点击关于按钮if(e.getX()>=400&&e.getX()<=470&&e.getY()>=320&&e.getY()<=350){JOptionPane.showMessageDialog(this,"本游戏由森制作,有相关问题可以访问qq:939457252");}//点击退出按钮if(e.getX()>=400&&e.getX()<=470&&e.getY()>=370&&e.getY()<=400){JOptionPane.showMessageDialog(this,"游戏结束");System.exit(0);}}publicvoidmouseReleased(MouseEvente){//TODOAuto-generatedmethodstub}privatebooleancheckWin(){booleanflag=false;//保存共有相同颜色多少棋子相连intcount=1;//判断横向是否有5个棋子相连,特点纵坐标是相同,即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(yChange>0)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(yChange>0)yChange++;else{yChange--;}}}returncount;}}publicclassTest{publicstaticvoidmain(String[]args){FiveChessFrameff=newFiveChessFrame();}}当然还有一张背景图片
解决方案
解决方案二:
就是要开始游戏的时候,可以设置一下黑白双方的棋子数目,当一方的棋子连成五个后,就可以把这五个棋子加到棋子的数目里面,然后同时把对方的棋子数目减去一个,最好判断哪放棋子的数目为0(下到棋盘上棋子数目也会减少)这个描述得很让人看不懂,可否举个例子。还有不懂楼主是算法的问题,还是实现中遇到了什么问题。
解决方案三:
该回复于2011-01-10 09:02:27被版主删除