首页 / 操作系统 / Linux / J2SE版五子棋(Demo学习总结)
(完全手绘版五子棋)在制作五子棋时的一般流程:首先:设置好显示窗口的大小、布局、外观,绘制好棋子所下的网格线和一些信息描述等等。其次:定义一个二维数组用于保存所有棋子的坐标,例如: // 保存之前下过的所有全部棋子的坐标 // 其中数据内容 0:表示这个点并没有棋子, 1:表示有这个点 int[][] allChess = new int[19][19];当在网格线中放置棋子时,将相应的网格点存入到该数组中。如下所示: x = e.getX(); y = e.getY(); if (x >= 10 && x <= 370 && y >= 70 && y <= 430) { // 鼠标在整个棋盘范围之内 x = (x - 10) / 20; // 判断是哪一格 y = (y - 70) / 20; if (allChess[x][y] == 0) { // 判断当前要下的是什么颜色的棋子 if (isBlack == true) { allChess[x][y] = 1; // 向棋子数组中添加数据 isBlack = false; } else { allChess[x][y] = 2; isBlack = true; }//在每次点击的时候进行重绘(这样不知妥不妥)//并且在每走一格的时候都进行判断输赢O(∩_∩)O~下面是详细的判断方法:@Override public void mousePressed(MouseEvent e) { // TODO 鼠标点击操作 x = e.getX(); y = e.getY(); if (x >= 10 && x <= 370 && y >= 70 && y <= 430) { // 使鼠标在整个棋盘范围之内 x = (x - 10) / 20; y = (y - 70) / 20; if (allChess[x][y] == 0) { // 判断当前要下的是什么颜色的棋子 if (isBlack) { allChess[x][y] = 1; // 向棋子数组中添加数据 } else { allChess[x][y] = 2; } isBlack = !isBlack; // 目的是让黑白棋子轮流下 winFlag = checkWin();//每走一格都要进行判断 if (winFlag) { JOptionPane.showMessageDialog(this, "游戏结束," + (allChess[x][y] == 1 ? "黑方" : "白方") + "获胜!"); } } } this.repaint(); } private boolean checkWin() { boolean flag = false; int color = allChess[x][y]; // 判断是黑色还是白色(表示刚下的那一格的棋子) // 保存共有多少相同颜色的棋子相连 int count = 1; int i = 1; while (color == allChess[x + i][y]) { count++; i++; } i = 1; while (color == allChess[x - i][y]) { count++; i++; } // 纵向的判断 int i2 = 1; int count2 = 1; while (color == allChess[x][y - i2]) { count2++; i2++; } i2 = 1; while (color == allChess[x][y + i2]) { count2++; i2++; } // 斜方向的判断(右上 + 左下) int i3 = 1; int count3 = 1; while (color == allChess[x + i3][y - i3]) { count3++; i3++; } i3 = 1; while (color == allChess[x - i3][y + i3]) { count3++; i3++; } // 斜方向的判断(右下 + 左上) int i4 = 1; int count4 = 1; while (color == allChess[x + i4][y + i4]) { count4++; i4++; } i4 = 1; while (color == allChess[x - i4][y - i4]) { count4++; i4++; } if (count >= 5) flag = true; if (count2 >= 5) flag = true; if (count3 >= 5) flag = true; if (count4 >= 5) flag = true; return flag; }根据棋盘上的左右方向,上下方向,左上右下方向,右下左上方向,判断当前网格线上的棋子个数,然后判断输赢。 下面是优化后的判断输赢的方法private boolean checkWin() { boolean flag = false; // 保存共有多少相同颜色的棋子相连 int count = 1; // 判断横向是否有五个棋子相连,特点 纵坐标 是相同,即allChess[x][y]中y值相同 int color = 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; } } } return flag; } // 判断棋子连接的数量 private int checkCount(int xChange, int yChange, int color) { int count = 1; int tempX = xChange; // x临时变量 int tempY = yChange; // y临时变量 while (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 (color == allChess[x - xChange][y - yChange]) { count++; if (xChange != 0) xChange++; if (yChange != 0) if (yChange > 0) yChange++; else yChange--; } return count; }