Welcome 微信登录

首页 / 操作系统 / 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;    }