⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maincontrol.java~8~

📁 Java做的黑白棋
💻 JAVA~8~
📖 第 1 页 / 共 5 页
字号:
                        //如果出现“空格”,则没法吃棋,直接跳出
                    } else if (matrix[m][n] == ( -1) * side) {
                        //如果仍为与当前棋子不同颜色的棋子,则继续往下走
                    }
                }
            }
        }
        //////////////////////////////////////////////////////////////////////
        //左下
        //////////////////////////////////////////////////////////////////////
        if (i != 7 && j != 0) {
            //如果不为最后一行或第一列,则向左下搜索
            if (matrix[i + 1][j - 1] == ( -1) * side) {
                //说明在“左下”这个方向是对方的棋子,则还有检索下去的必要
                for (int m = i + 2, n = j - 2; m <= 7 && n >= 0; m++, n--) {
                    if (matrix[m][n] == side) {
                        //把先前的夹在中间的进行修改
                        for (int l = i, q = j; l <= m && q >= n; l++, q--) {
                            matrix[l][q] = side;
                            //中间夹着的所有棋子全部变为刚走的棋子(吃棋的一方)
                        }
                        //chessNum[side + 1] += ( j - n );
                        //side方增加的棋子:吃掉的加上刚加入的一个
                        //chessNum[(-1)*side + 1] -= ( j - n -1);
                        //对方损失的棋子:被吃掉的夹在中间的棋子

                        break;
                        //如果"遭遇"相同的棋子,则这个棋子就是吃棋的信号、或称导火索、终结符,停止搜索,跳出
                    } else if (matrix[m][n] == 0) {

                        break;
                        //如果出现“空格”,则没法吃棋,直接跳出
                    }

                    else if (matrix[m][n] == ( -1) * side) {
                        //如果仍为与当前棋子不同颜色的棋子,则继续往下走
                    }
                }
            }
        }
        //////////////////////////////////////////////////////////////////////
        //右下
        //////////////////////////////////////////////////////////////////////
        if (i != 7 && j != 7) {
            //如果不为最后一列或最后一列,则向右下搜索
            if (matrix[i + 1][j + 1] == ( -1) * side) {
                //说明在“右下”这个方向是对方的棋子,则还有检索下去的必要
                for (int m = i + 2, n = j + 2; m <= 7 && n <= 7; m++, n++) {
                    if (matrix[m][n] == side) {
                        //把先前的夹在中间的进行修改
                        for (int l = i, q = j; l <= m && q <= n; l++, q++) {
                            matrix[l][q] = side;
                            //中间夹着的所有棋子全部变为刚走的棋子(吃棋的一方)
                        }
                        //chessNum[side + 1] += ( m - i );
                        //side方增加的棋子:吃掉的加上刚加入的一个
                        //chessNum[(-1)*side + 1] -= ( m - i -1 );
                        //对方损失的棋子:被吃掉的夹在中间的棋子

                        break;
                        //如果"遭遇"相同的棋子,则这个棋子就是吃棋的信号、或称导火索、终结符,停止搜索,跳出
                    } else if (matrix[m][n] == 0) {

                        break;
                        //如果出现“空格”,则没法吃棋,直接跳出
                    }

                    else if (matrix[m][n] == ( -1) * side) {
                        //如果仍为与当前棋子不同颜色的棋子,则继续往下走
                    }
                }
            }
        }
        //////////////////////////////////////////////////////////////////////
    }

    public void computerMove(int side) {
        //side参数表明电脑执哪一方棋子
        //电脑走棋的方法:主要分为两部分
        //1、通过估价函数确定在哪里下棋最好
        //2、调用eat()方法吃棋并进行一些判断及处理工作
        double max_score = -456231;
        double score = 0;
        //总得分
        int object_i = 0;
        int object_j = 0;
        //目标点的坐标
        int temp_matrix[][] = new int[8][8];
        //用于暂存矩阵
        temp_matrix = matrix;
        //暂存matrix
        for (int i = 0; i < LINE_NUM; i++) {
            for (int j = 0; j < COLUMN_NUM; j++) {
                if (matrix[i][j] > 1) {
                    //说明为电脑可下棋的位置
                    //则计算这一点的总得分,最后取总得分最高的点的坐标赋给:i,j
                    //总得分由三部分组成:1、本位置权重2、若放在这个地方能吃掉对方的棋子数3、若走了这一步留给对方的所有可走地方的平均权重
                    int first = 0, second = 0;
                    double third = 0;
                    int sum = 0;
                    //三部分
                    first = WEIGHT[i][j];
                    //本位置权重
                    //第二部分,要采用"预执行"的方法,即假设走了这一步,看看结果如何,故得先保存原先的matrix,一会儿再恢复

                    //下面假设走了这一步棋,走之前先记录先前的黑子白子的数量
//                    chessNum[0] = 0 ;
//                    chessNum[2] = 0 ;
//                    for( int ii = 0 ; ii < LINE_NUM ; ii++ )
//                    {
//                      for( int jj = 0 ; jj < COLUMN_NUM ; jj++ )
//                      {
//                          if( matrix[ii][jj] == -1 )
//                          {
//                             //黑子
//                             chessNum[0]++;
//                          }
//                          else if( matrix[ii][jj] == 1 )
//                          {
//                             //白子
//                             chessNum[2]++;
//                          }
//                      }
//                    }
//                    int black = 0 , white = 0;
//                    black = chessNum[0];
//                    white = chessNum[2];
//                    eat( i , j , COMPUTER );
//                    //吃棋,同时修改matrix的值
//                    //下面看修改了matrix的值之后,黑白两方的子的多少,以得出吃子的多少
//                    chessNum[0] = 0 ;
//                    chessNum[2] = 0 ;
//                    for( int ii = 0 ; ii < LINE_NUM ; ii++ )
//                    {
//                      for( int jj = 0 ; jj < COLUMN_NUM ; jj++ )
//                      {
//                          if( matrix[ii][jj] == -1 )
//                          {
//                             //黑子
//                             chessNum[0]++;
//                          }
//                          else if( matrix[ii][jj] == 1 )
//                          {
//                             //白子
//                             chessNum[2]++;
//                          }
//                      }
//                    }
//                    //假设电脑把棋子放在这里,让电脑先吃掉棋子,然后看能吃几个棋子
//                    second = chessNum[COMPUTER + 1]    -   ( ( COMPUTER == -1 ) ?  black : white );
//                    //得到吃棋数,计算方法(后来的减去原来的)
//                    chessNum[0] = 0 ;
//                    chessNum[2] = 0 ;
//                    checkObjects( PEOPLE );
//                    //看看此时人在哪些地方还可以走
//                    //修改了matrix的值
//                    for(  int m = 0 ; m < LINE_NUM ; m++ )
//                    {
//                      for( int n = 0 ; n < COLUMN_NUM ; n++ )
//                      {
//                         if( matrix[m][n] > 1 )
//                         {
//                                sum += WEIGHT[m][n];
//                         }
//                      }
//                    }
//                    third = sum / objectPlaces;
                    score = first + second - third;
                    //得到最后分数
                    if (score >= max_score) {
                        max_score = score;
                        //如果本位置的得分高于先前的最高得分,则覆盖先前的位置
                        object_i = i;
                        object_j = j;
                    }
                    matrix[i][j] = 0;
                }
                // this.setMatrix( temp_matrix );

            }
        }
        //完成循环后:得分最高的点的坐标已放在object_i 和 object_j 中
        //此时,还要记得恢复由于“预操作”所破坏掉的矩阵
        //this.setMatrix( temp_matrix );
        System.out.println("object_x :" + object_i + "   object_y :" + object_j);

//            for( int i = 0 ; i < LINE_NUM ; i++ )
//            {
//                for( int j = 0 ; j < COLUMN_NUM ; j++ )
//                {
//                    if( matrix[i][j] > 1  )
//                    {
//                        matrix[i][j] = 0 ;
//                        //若为可以到达的地方则这时这些地方已经没有用了,可以将其释放了
//                    }
//                }
//            }
        objectPlaces = 0;
        //重新初始化这个变量

        eat(object_i, object_j, side);
        //电脑按照他所认为的最好的一步棋走棋
        System.out.println("电脑吃棋完毕!下面检测人是否有棋可走!");
        //pause(1000);
        //暂停一段时间
//            try
//            {
//                Thread.sleep(4000);
//            }
//            catch( Exception e )
//            {
//
//            }
        repaint();

//        for (int p = 0; p < LINE_NUM; p++) {
//            for (int q = 0; q < COLUMN_NUM; q++) {
//                System.out.print(matrix[p][q] + " ");
//            }
//            System.out.println();
//        }

        chessNum[0]=0;
        chessNum[2]=0;
        for (int ii = 0; ii < LINE_NUM; ii++) {
                for (int jj = 0; jj < COLUMN_NUM; jj++) {
                    if (matrix[ii][jj] == -1) {
                        //黑子
                        chessNum[0]++;
                    } else if (matrix[ii][jj] == 1) {
                        //白子
                        chessNum[2]++;
                    }
                }
            }

            if (chessNum[0] == 0 || chessNum[2] == 0) {
                //说明有一方的棋子数为0,则弹出
                //还得判断输赢情况,双方棋子比例!告知用户!
                String res = "";
                //比赛结果
                if (chessNum[0] > chessNum[2]) {
                    res = "黑棋获胜!";
                } else if (chessNum[0] < chessNum[2]) {
                    res = "白棋获胜!";
                } else {
                    res = "平局!";
                }

                JOptionPane.showMessageDialog(null,
                                              "本局游戏结束!\n" + res + "黑棋 " +
                                              chessNum[0] + " :" + chessNum[2] +
                                              " 白棋 ");
                ini();
                mode = -5;
                repaint();
                //重新开局,重新初始化矩阵
                return;
            }
            if (chessNum[0] + chessNum[2] >= 64) {
                String res = "";
                //比赛结果
                if (chessNum[0] > chessNum[2]) {
                    res = "黑棋获胜!";
                } else if (chessNum[0] < chessNum[2]) {
                    res = "白棋获胜!";
                } else {
                    res = "平局!";
                }
                repaint();
                JOptionPane.showMessageDialog(null,
                                              "本局游戏结束!\n" + res + "黑棋 " +
                                              chessNum[0] + " :" + chessNum[2] +
                                              " 白棋 ");
                ini();
                mode = -5;
             

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -