五子棋风云之雄霸天下_简单人人对战
?五子棋算法:五子棋无非包含棋子的颜色、4个方向上的棋子个数。使用计数器,棋盘某处下黑子时,计数器为1;当为白子时,计数器为2;当此处没有棋子时,计数器为0。根据计数器的数值来判断棋子的颜色。创建二维数组来计算棋子的个数,二维数组前一个index表示X(横向上第几个交点),后一个index表示Y(纵向上第几个交点)。具体方法是:根据数组连续的元素的计数器上的数值不同,判断包含此次落子的棋子的个数,如果数组的元素有5个连续的1或连续的2,代表黑子胜利或白子胜利,游戏结束,不然则继续下子、判断。
?
import java.awt.Graphics;import javax.swing.JFrame;public class Draw extends JFrame{//程序入口public static void main(String[] args) {Draw d = new Draw();d.showFrame();}public void showFrame() {this.setTitle("@@@@五子棋风云之雄霸天下@@@@");this.setBounds(150, 25, 650, 650); //布局管理器this.setLayout(null);//设定窗口关闭时退出程序this.setDefaultCloseOperation(3);//设定窗口可见this.setVisible(true);//取得画布对象java.awt.Graphics g = this.getGraphics();//给鼠标添加监听器DrawListener dl= new DrawListener(g);this.addMouseListener(dl);}//重绘public void paint(Graphics g){super.paint(g);//画棋盘for(int i=0;i<=((high-low)/size);i++) {g.drawLine(low+i*size, low, low+i*size, high);//棋盘的纵线基准g.drawLine(low, low+i*size, high, low+i*size);//棋盘的横线基准}//画棋子for(int i=0;i<=(high/size);i++){for(int j=0;j<=(high/size);j++){if(chess[i][j]==1){//黑子g.setColor(java.awt.Color.black);g.fillOval(i*size-pSize, j*size-pSize, ovalSize, ovalSize);}else if(chess[i][j]==2){//白子g.setColor(java.awt.Color.white);g.fillOval(i*size-pSize, j*size-pSize, ovalSize, ovalSize);}}}}static int low=50,high=600;//棋盘的边界static int ovalSize=40;//圆的直径static int size=50;//棋盘格子大小static int chess[][]=new int[high/size+4][high/size+4];static int pSize=18;//棋子偏移距离}?
import java.awt.Color;import java.awt.Graphics;import java.awt.event.MouseEvent;public class DrawListener extends java.awt.event.MouseAdapter {private int c;//判断棋子颜色private int x,y,x1,y1;private java.awt.Graphics g;private int n;//计数器,计算该处是否有棋子// 建一个构造器传参public DrawListener(Graphics g) {this.g = g;}public void mouseReleased(MouseEvent e) {//点击在棋盘有效范围if(e.getX()>(Draw.low-Draw.size/2) && e.getX()<(Draw.high+Draw.size/2) && e.getY()>(Draw.low-Draw.size/2) && e.getY()<(Draw.high+Draw.size/2)){//根据点击坐标计算棋子的横坐标if(Math.abs(x1-e.getX())<(Draw.size/2)) {x=x1;}else if(x1-e.getX()>(Draw.size/2)) {x=((e.getX())/Draw.size)*Draw.size;}else if((e.getX()-x1)>(Draw.size/2)){x=((e.getX()+(Draw.size/2))/Draw.size)*Draw.size;}//根据点击坐标计算棋子的纵坐标if(Math.abs(y1-e.getY())<(Draw.size/2)) {y=y1;}else if(y1-e.getY()>(Draw.size/2)) {y=((e.getY())/Draw.size)*Draw.size;}else if((e.getX()-y1)>(Draw.size/2)){y=((e.getY()+(Draw.size/2))/Draw.size)*Draw.size;}System.out.println("鼠标点击的X坐标是:"+e.getX() +", 鼠标点击的Y坐标是:"+ e.getY()+" 落子坐标是:"+x+","+y);//判断棋子的颜色if(n==0&&c == 0 && Draw.chess[x/Draw.size][y/Draw.size]==0){g.setColor(Color.BLACK);//画出一颗黑棋子g.fillOval(x-Draw.pSize,y-Draw.pSize, Draw.ovalSize, Draw.ovalSize);//保存黑子Draw.chess[x/Draw.size][y/Draw.size]=1;c ++;}else if(n==0&&c == 1 && Draw.chess[x/Draw.size][y/Draw.size]==0){g.setColor(Color.WHITE);//画出一颗白棋子g.fillOval(x-Draw.pSize,y-Draw.pSize, Draw.ovalSize, Draw.ovalSize);//保存白子Draw.chess[x/Draw.size][y/Draw.size]=2;c--;}}else{System.out.println("你越界了。。。");}//判断输赢for(int i=0;i<=(Draw.high/Draw.size);i++){for(int j=0;j<=(Draw.high/Draw.size);j++){if(n==0&&Draw.chess[i][j]==1&&Draw.chess[i][j+1]==1&&Draw.chess[i][j+2]==1&&Draw.chess[i][j+3]==1&&Draw.chess[i][j+4]==1){System.out.println("纵向有黑色5连子了");n++;}else if(n==0&&Draw.chess[i][j]==2&&Draw.chess[i][j+1]==2&&Draw.chess[i][j+2]==2&&Draw.chess[i][j+3]==2&&Draw.chess[i][j+4]==2){System.out.println("纵向有白色5连子了");n++;}}}for(int i=0;i<=(Draw.high/Draw.size);i++){for(int j=0;j<=(Draw.high/Draw.size);j++){if(n==0&&Draw.chess[i][j]==1&&Draw.chess[i+1][j]==1&&Draw.chess[i+2][j]==1&&Draw.chess[i+3][j]==1&&Draw.chess[i+4][j]==1){System.out.println("横向有黑色5连子了");n++;}else if(n==0&&Draw.chess[i][j]==2&&Draw.chess[i+1][j]==2&&Draw.chess[i+2][j]==2&&Draw.chess[i+3][j]==2&&Draw.chess[i+4][j]==2){System.out.println("横向有白色5连子了");n++;}}}for(int i=0;i<=(Draw.high/Draw.size);i++){for(int j=0;j<=(Draw.high/Draw.size);j++){if(n==0&&Draw.chess[i][j]==1&&Draw.chess[i+1][j+1]==1&&Draw.chess[i+2][j+2]==1&&Draw.chess[i+3][j+3]==1&&Draw.chess[i+4][j+4]==1){System.out.println("斜向有黑色5连子了");n++;}else if(n==0&&Draw.chess[i][j]==2&&Draw.chess[i+1][j+1]==2&&Draw.chess[i+2][j+2]==2&&Draw.chess[i+3][j+3]==2&&Draw.chess[i+4][j+4]==2){System.out.println("斜向有白色5连子了");n++;}}}for(int i=0;i<=(Draw.high/Draw.size);i++){for(int j=0;j<=(Draw.high/Draw.size);j++){if(n==0&&Draw.chess[i][j]==1&&Draw.chess[i-1][j+1]==1&&Draw.chess[i-2][j+2]==1&&Draw.chess[i-3][j+3]==1&&Draw.chess[i-4][j+4]==1){System.out.println("反斜向有黑色5连子了");n++;}else if(n==0&&Draw.chess[i][j]==2&&Draw.chess[i-1][j+1]==2&&Draw.chess[i-2][j+2]==2&&Draw.chess[i-3][j+3]==2&&Draw.chess[i-4][j+4]==2){System.out.println("反斜向有白色5连子了");n++;}}}if(n==1){System.out.println("Game over");}}}?
?鼠标监听中,MouseAdapter和MouseListener不同,一个是类一个是接口,众所周知继承接口需要继承它所有的方法,而继承类则不需如此。在此我选用MouseAdapter可以减少部分冗余的代码。
?
?
?
?2011.04.05后续:由于近期做项目,重新在五子棋的基础上加以改进,把界面做漂亮了点(我发现我好喜欢做界面的说。。。)。使用了Image棋子,加了棋局的保存(还没有实现打开,暂时找不到打开棋局的时间的切入点),可具体的一些细节性的问题还没有解决。发现现在的代码的质量要比以前好多了,主要体现在注释和方法的命名。
改进后的五子棋我已经上传,如果有人对我的东东有什么建议或看法的话,欢迎和我交流。谢谢。
?
?