BoardPanel.java
上传用户:ptnike
上传日期:2007-06-15
资源大小:61k
文件大小:26k
源码类别:

棋牌游戏

开发平台:

Java

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.util.Arrays;
  4. import javax.swing.*;
  5. import java.io.*;
  6. /**
  7.  * <p>Title: chesser</p>
  8.  * <p>Description: wu zi qi game</p>
  9.  * <p>Copyright: Copyright (c) 2003</p>
  10.  * <p>Company: e-top</p>
  11.  * @author cylix
  12.  * @version 1.0
  13.  */
  14. public class BoardPanel extends JPanel{
  15.     private  static Image white = null;
  16.     private  static Image black = null;
  17.     private static int xp;           // position of x to put chessman
  18.     private static int yp;           // position of y to put chessman
  19.     private Cursor handCursor;
  20.     private Cursor defaultCursor;
  21.     protected static int board[][];    // record of each position black or white
  22.     private int color=1;             // record player's chess color 1=black 2=white    
  23.     
  24.     int STEPCOUNTER=0;
  25.     int BASE=5;
  26.     int DEEPTH=3;
  27.     int MINDEEPTH=3;
  28.     int MAX1=5;
  29.     long INVALID=9000000;
  30.     int chessBoard[][];    
  31.     // draw the line number with x/y direction
  32.     String line = "a        b        c       d        e        f        g        h         i         j        k         l        m       n        o";
  33.     char [] rowNum1 = {'1','2','3','4','5','6','7','8','9'};
  34.     char [] rowNum2={'1','0','1','1','1','2','1','3','1','4','1','5'};
  35.      public BoardPanel(){
  36. //        this.wzq=wz;
  37.         try {
  38.             handCursor=new Cursor(12);
  39.             defaultCursor = new Cursor(0);
  40.             board = new int[15][15];
  41. //            black = wzq.black;
  42. //            white = wzq.white;
  43.           //  this.setBackground(Color.yellow);
  44.             //this.setForeground(Color.BLUE);
  45.           //  this.setBorder(BorderFactory.createLoweredBevelBorder());
  46.             jbInit();
  47.         }
  48.         catch(Exception e) {
  49.             e.printStackTrace();
  50.         }
  51.     }
  52.     public void paint(Graphics gc){
  53.         super.paint(gc);
  54.         //this.setBackground(Color.gray);
  55.         //this.invalidate();
  56.         gc.setColor(Color.blue);
  57.         //gc.setColor(new Color(255, 255, 240));
  58.         // draw number of X direction
  59.         gc.drawString(line,25,15);
  60.         // draw number of Y direction
  61.         for(int i=0;i<9;i++){
  62.             gc.drawChars(rowNum1,i,1,10,35+i*30);
  63.         }
  64.         for(int i=9,j=0;i<15;i++,j+=2){
  65.             gc.drawChars(rowNum2,j,2,10,35+i*30);
  66.         }
  67.         // draw the chess board
  68.         for (int i = 0; i < 15; i++) {
  69.             gc.drawLine(30, 30 + i * 30, 450, 30 + i * 30); //draw raw
  70.             gc.drawLine(30 + i * 30, 30, 30 + i * 30, 450); //draw column
  71.         }
  72.         gc.drawLine(25, 25, 455, 25);
  73.         gc.drawLine(25, 25, 25, 455);
  74.         gc.drawLine(25, 455, 455, 455);
  75.         gc.drawLine(455, 25, 455, 455);
  76.         //when window repaint to replay the original status of board
  77.         for(int i=0;i<15;i++){
  78.             for (int j = 0; j < 15; j++) {
  79.                 xp=16+i*30;
  80.                 yp=16+j*30;
  81.                 if (board[i][j] == 1){
  82.                     gc.setColor(Color.black);
  83.                     gc.fillOval(xp,yp,28,28);
  84.                     //gc.drawImage(black, 16 + i * 30, 16 + j * 30, this);
  85.                 }
  86.                 if (board[i][j] == 2){
  87.                     gc.setColor(Color.white);
  88.                     gc.fillOval(xp,yp,28,28);
  89.                     //gc.drawImage(white, 16 + i * 30, 16 + j * 30, this);
  90.                 }
  91.             }
  92.         }
  93.     }
  94.     private void jbInit() throws Exception {
  95.         this.addMouseMotionListener(new ChessWZQ_this_mouseMotionAdapter(this));
  96.         this.addMouseListener(new ChessWZQ_this_mouseAdapter(this));
  97.     }
  98.     public int getColor(){
  99.         return color;
  100.     }
  101.     public void setColor(int cr){
  102.         color=cr;
  103.     }
  104.     /**
  105.      * clear board when updated
  106.      */
  107.     public void clearBoard(){
  108.         for(int i=0;i<15;i++){
  109.             for(int j=0;j<15;j++)
  110.                 board[i][j]=0;
  111.         }
  112.         repaint();
  113.     }
  114.     void this_mouseClicked(MouseEvent e) {
  115.         int x=0,y=0;
  116.         if(color==0){
  117.             return;
  118.         }
  119.         x=e.getX();
  120.         y=e.getY();
  121.         if(x>20&&x<460&&y>20&&y<460&&(x%30<10||x%30>20)&&(y%30<10||y%30>20)){
  122.             if(ChessWZQ.beginFlag==false){
  123.                 ChessWZQ.label6.setText("You may not do that");
  124.                 return;
  125.             }
  126.             xp = x / 30 * 30 - 14;
  127.             yp = y / 30 * 30 - 14;
  128.             if (x % 30 > 20) {
  129.                 xp += 30;
  130.             }
  131.             if (y % 30 > 20) {
  132.                 yp += 30;
  133.             }
  134.             x=xp/30;y=yp/30;
  135.             if(board[x][y]!=0){
  136.                 return;
  137.             }
  138.             // client 's board
  139.             board[xp / 30][yp / 30] = color;
  140.             Graphics g=this.getGraphics();
  141.             if(color==1){//black
  142.                 g.setColor(Color.black);
  143.             }
  144.             if(color==2){//white
  145.                 g.setColor(Color.white);
  146.             }
  147.             g.fillOval(xp, yp, 28, 28);
  148.             ChessWZQ.beginFlag=false;
  149.             // setting coordinate (x,y)
  150. //            x=xp/30;y=yp/30;
  151.             if(ChessWZQ.ptocFlag==false){
  152.                 Message msg = new Message();
  153.                 msg.color = color;
  154.                 msg.coordinateX = x;
  155.                 msg.coordinateY = y;
  156.                 msg.type = 2; //press chessman
  157.                 //send message to server
  158.                 try {
  159.                     ChessWZQ.out.writeObject(msg);
  160.                 }
  161.                 catch (IOException ee) {
  162.                     ee.printStackTrace();
  163.                 }
  164.             }
  165.            char cc = (char)(x+65);
  166.            ChessWZQ.label6.setText("put on ( "+cc+" , "+(y+1)+" )");
  167.            /// computer to put
  168.            if(ChessWZQ.ptocFlag==true){
  169.                if(judge(xp/30,yp/30,color)==true){
  170.                    //System.out.println("people win");
  171.                    Message ms = new Message();
  172.                    ms.type=20;
  173.                    strToCharArray("You",ms.msg);
  174.                    try{
  175.                        ChessWZQ.out.writeObject(ms);
  176.                    }catch(IOException er){
  177.                        er.printStackTrace();
  178.                    }
  179.                }
  180.                ChessWZQ.beginFlag = false;
  181.                int position = 0, bestX = 0, bestY = 0;
  182.                Analyse aa = new Analyse(BoardPanel.board);
  183.                position = aa.computerDo();
  184.                bestY = position % 100 - 1;
  185.                bestX = position / 100 - 1;
  186.                updateBoard(bestX, bestY);
  187.                drawChess(bestX, bestY);
  188.                ChessWZQ.beginFlag = true; //for people to put
  189.                cc=(char)(bestX+65);
  190.                ChessWZQ.label6.setText("put on ( "+cc+" , "+(bestY+1)+" )");
  191.                if(judge(bestX,bestY,ChessWZQ.cColor)==true){
  192.                    //System.out.println("computer win");
  193.                    Message msg = new Message();
  194.                    msg.type=20;
  195.                    strToCharArray("Computer",msg.msg);
  196.                    try{
  197.                        ChessWZQ.out.writeObject(msg);
  198.                    }catch(IOException err){
  199.                        err.printStackTrace();
  200.                    }
  201.                }
  202.            }
  203.         }
  204.     }
  205.     // convert string to array which is end with ''
  206.     public void strToCharArray(String str,char [] arr){
  207.         int i;
  208.         for(i=0;i<str.length()&&i<49;i++){
  209.             arr[i] = str.charAt(i);
  210.         }
  211.         arr[i]='';
  212.     }
  213.     /**
  214.      * return the chessman's x coordinate  0<=x<15
  215.      * @return
  216.      */
  217.     protected int getXP(){
  218.         return xp/30;
  219.     }
  220.     protected int getYP(){
  221.         return yp/30;
  222.     }
  223.     /**
  224.      * put a chessman and display it (x,y) position on the panel
  225.      * draw chessman on (x,y)
  226.      * @param x
  227.      * @param y
  228.      */
  229.     public void drawChess(int x,int y){
  230.         Graphics g=this.getGraphics();
  231.         char cc = (char)(x+65);
  232.         int temp = y+1;
  233.         x=x*30+16;
  234.         y=y*30+16;
  235.         if(color==1)
  236.             g.setColor(Color.white);
  237.         else
  238.             g.setColor(Color.black);
  239.         g.fillOval(x, y, 28, 28);
  240.         ChessWZQ.label6.setText("Player put on ( "+cc+" , "+temp+" )");
  241.     }
  242.     /**
  243.      * update board status when B put a chessman
  244.      * @param x B's chessman's X coordinate 0<=x<15
  245.      * @param y B's chessman's Y coordinate 0<=y<15
  246.      */
  247.     public void updateBoard(int x,int y){
  248.         int tcolor=0;
  249.         if(color==1) tcolor=2;
  250.         else tcolor=1;
  251.         board[x][y]=tcolor;
  252.     }
  253.     public char intToChar(int x){
  254.         char temp='';
  255.         if(x>=0&&x<=9)
  256.             temp=(char)(48+x);
  257.         else if(x>=10 &&x<=15){
  258.             temp=(char)(55+x);
  259.         }
  260.         return temp;
  261.     }
  262.     /**
  263.      * mouseMoved Event
  264.      * @param e
  265.      */
  266.     void this_mouseMoved(MouseEvent e) {
  267.         int x=0,y=0;
  268.         x=e.getX();
  269.         y=e.getY();
  270.         if(x>20&&x<460&&y>20&&y<460&&(x%30<10||x%30>20)&&(y%30<10||y%30>20)){
  271.             this.setCursor(handCursor); //HAND_CURSOR
  272.         }
  273.         else{
  274.             this.setCursor(defaultCursor);
  275.         }
  276.     }
  277.     /**
  278.      * judge if a man win the game
  279.      * @param x  the newest kid's x coordinate
  280.      * @param y  the newest kid's y coordinate
  281.      * @return
  282.      */
  283.     protected boolean judge(int x,int y,int clr){
  284.         int i=0,j=0,count=0;
  285.         // x direction
  286.         for(i=0,count=0;x-i>=0&&i<5;i++){
  287.             if (clr==board[x-i][y]){
  288.                 count++;
  289.             }else{
  290.                 break;
  291.             }
  292.   //          System.out.println("( "+x+" , "+y+" )"+"count = "+count);
  293.             if(count==5)
  294.                 return true;
  295.         }
  296.         for(i=1;x+i<15&&i<5;i++){
  297.             if(clr==board[x+i][y]){
  298.                 count++;
  299.             }else{
  300.                 break;
  301.             }
  302.             if(count==5)
  303.                 return true;
  304.         }
  305.         // y direction
  306.         for(i=0,count=0;y-i>=0&&i<5;i++){
  307.             if (clr==board[x][y-i]){
  308.                 count++;
  309.             }else{
  310.                 break;
  311.             }
  312. //            System.out.println("( "+x+" , "+y+" )"+"count = "+count);
  313.             if(count==5)
  314.                 return true;
  315.         }
  316.         for(i=1;y+i<15&&i<5;i++){
  317.             if(clr==board[x][y+i]){
  318.                 count++;
  319.             }else{
  320.                 break;
  321.             }
  322.     //        System.out.println("( "+x+" , "+y+" )"+"count = "+count);
  323.             if(count==5)
  324.                 return true;
  325.         }
  326.         // '' direction
  327.         for(i=0,count=0;x-i>=0&&y-i>=0&&i<5;i++){
  328.             if(clr==board[x-i][y-i]){
  329.                 count++;
  330.             }else{
  331.                 break;
  332.             }
  333. //            System.out.println("( "+x+" , "+y+" )"+"count = "+count);
  334.             if(count==5)
  335.                 return true;
  336.         }
  337.         for(i=1;x+i<15&&y+i<15&&i<5;i++){
  338.             if(clr==board[x+i][y+i]){
  339.                 count++;
  340.             }else{
  341.                 break;
  342.             }
  343.   //          System.out.println("( "+x+" , "+y+" )"+"count = "+count);
  344.             if(count==5){
  345.                 return true;
  346.             }
  347.         }
  348.         // '/' direction
  349.         for(i=0,count=0;x+i<15 && y-i>=0 &&i<5; i++){
  350.             if(clr==board[x+i][y-i]){
  351.                 count++;
  352.             }else{
  353.                 count=0;
  354.             }
  355.   //          System.out.println("( "+x+" , "+y+" )"+"count = "+count);
  356.             if(count==5)
  357.                 return true;
  358.         }
  359.         for(i=1;x-i>=0 && y+i<15 &&i<5;i++){
  360.             if(clr==board[x-i][y+i]){
  361.                 count++;
  362.             }else{
  363.                 break;
  364.             }
  365. //            System.out.println("( "+x+" , "+y+" )"+"count = "+count);
  366.             if(count==5){
  367.                 return true;
  368.             }
  369.         }
  370.         return false;
  371.     }
  372.     class Queue{
  373.         int position;
  374.         long mark;
  375.     } ;
  376.     
  377.     class Analyse {
  378.     
  379.     Analyse(int chessc[][]){
  380.         int i, j;
  381.         chessBoard = new int[17][17];
  382.         for (i = 0; i <= 16; i++) {
  383.             for (j = 0; j <= 16; j++) {
  384.                 if (i == 0 || j == 0 || i == 16 || j == 16) {
  385.                     chessBoard[i][j] = 4;
  386.                 }
  387.                 else {
  388.                     chessBoard[i][j] = chessc[i - 1][j - 1];
  389.                 }
  390.             }
  391.         }
  392.     }
  393.     /**
  394.      *
  395.      * @param base
  396.      * @param pow
  397.      * @return
  398.      */
  399.     private long pow(int base, int pow){
  400.        int i;
  401.        long result=1;
  402.        for(i=1;i<=pow;i++){
  403.            result*=base;
  404.        }
  405.        return result;
  406.    }
  407.    /**
  408.     *
  409.     * @param x
  410.     * @param y
  411.     * @param side
  412.     * @return
  413.     */
  414.    private long analyseUd(int x, int y, int side){
  415.        int tt[][] = new int[17][17];
  416.        int i, j;
  417.        int tempx, tempy;
  418.        long mark = 0;
  419.        int base = BASE;
  420.        int uppersign = 0;
  421.        int downsign = 0;
  422.        int c_count = 1;
  423.        for (i = 0; i < 17; i++) {
  424.            for (j = 0; j < 17; j++) {
  425.                tt[i][j] = chessBoard[i][j];
  426.            }
  427.        }
  428.        tt[y][x] = side;
  429.       // up and down
  430.        tempx = x;
  431.        tempy = y;
  432.        if (tt[tempy - 1][tempx] != side) {
  433.            if (tt[tempy - 1][tempx] == 0) {
  434.                uppersign = 1;
  435.            }
  436.            if (tt[tempy - 1][tempx] != 0) {
  437.                uppersign = 0;
  438.            }
  439.        }
  440.        else {
  441.            tempy -= 1;
  442.            while (tt[tempy][tempx] == side) {
  443.                c_count += 1;
  444.                tempy--;
  445.            }
  446.            if (tt[tempy][tempx] == 0) {
  447.                uppersign = 1;
  448.            }
  449.            if (tt[tempy][tempx] != 0) {
  450.                uppersign = 0;
  451.            }
  452.        }
  453.        tempx = x;
  454.        tempy = y;
  455.        if (tt[tempy + 1][tempx] != side) {
  456.            if (tt[tempy + 1][tempx] == 0) {
  457.                downsign = 1;
  458.            }
  459.            if (tt[tempy + 1][tempx] != 0) {
  460.                downsign = 0;
  461.            }
  462.        }
  463.        else {
  464.            tempy += 1;
  465.            while (tt[tempy][tempx] == side) {
  466.                c_count += 1;
  467.                tempy++;
  468.            }
  469.            if (tt[tempy][tempx] == 0) {
  470.                downsign = 1;
  471.            }
  472.            if (tt[tempy][tempx] != 0) {
  473.                downsign = 0;
  474.            }
  475.        }
  476.        mark += pow(base, c_count);
  477.        if ( (uppersign + downsign) > 0) {
  478.            if ( (uppersign + downsign) == 2) {
  479.                mark *= (uppersign + downsign);
  480.            }
  481.            if ( (uppersign + downsign) == 1) {
  482.                mark = mark / 2;
  483.            }
  484.        }
  485.        else if (c_count == 5) {
  486.            mark *= 4;
  487.        }
  488.        else {
  489.            mark = 0;
  490.        }
  491.        if (c_count == 5) {
  492.            mark += INVALID;
  493.        }
  494.        return mark;
  495.    }
  496.    /**
  497.     *
  498.     * @param x
  499.     * @param y
  500.     * @param side
  501.     * @return
  502.     */
  503.    private long analyseLr(int x, int y, int side){
  504.        int tt[][] = new int[17][17];
  505.        int i, j,tx, ty;
  506.        long mark = 0;
  507.        int base = BASE,uppersign = 0,downsign = 0,c_count = 1;
  508.        for (i = 0; i < 17; i++) {
  509.            for (j = 0; j < 17; j++) {
  510.                tt[i][j] = chessBoard[i][j];
  511.            }
  512.        }
  513.        tt[y][x] = side;
  514.        // left and right
  515.        tx = x;
  516.        ty = y;
  517.        if (tt[ty][tx - 1] != side) {
  518.            if (tt[ty][tx - 1] == 0) {
  519.                uppersign = 1;
  520.            }
  521.            if (tt[ty][tx - 1] != 0) {
  522.                uppersign = 0;
  523.            }
  524.        }
  525.        else {
  526.            tx -= 1;
  527.            while (tt[ty][tx] == side) {
  528.                c_count += 1;
  529.                tx--;
  530.            }
  531.            if (tt[ty][tx] == 0) {
  532.                uppersign = 1;
  533.            }
  534.            if (tt[ty][tx] != 0) {
  535.                uppersign = 0;
  536.            }
  537.        }
  538.        tx = x;
  539.        ty = y;
  540.        if (tt[ty][tx + 1] != side) {
  541.            if (tt[ty][tx + 1] == 0) {
  542.                downsign = 1;
  543.            }
  544.            if (tt[ty][tx + 1] != 0) {
  545.                downsign = 0;
  546.            }
  547.        }
  548.        else {
  549.            tx += 1;
  550.            while (tt[ty][tx] == side) {
  551.                c_count += 1;
  552.                tx++;
  553.            }
  554.            if (tt[ty][tx] == 0) {
  555.                downsign = 1;
  556.            }
  557.            if (tt[ty][tx] != 0) {
  558.                downsign = 0;
  559.            }
  560.        }
  561.        mark += pow(base, c_count);
  562.        if ( (uppersign + downsign) > 0) {
  563.            if ( (uppersign + downsign) == 2) {
  564.                mark *= (uppersign + downsign);
  565.            }
  566.            if ( (uppersign + downsign) == 1) {
  567.                mark = mark / 2;
  568.            }
  569.        }
  570.        else if (c_count == 5) {
  571.            mark *= 4;
  572.        }
  573.        else {
  574.            mark = 0;
  575.        }
  576.        if (c_count == 5) {
  577.            mark += INVALID;
  578.        }
  579.        return mark;
  580.    }
  581.    /**
  582.     *
  583.     * @param x
  584.     * @param y
  585.     * @param side
  586.     * @return
  587.     */
  588.    private long analyseLdru(int x, int y, int side){
  589.        int tt[][] = new int[17][17];
  590.        int i, j;
  591.        int tx, ty;
  592.        long mark = 0;
  593.        int base = BASE;
  594.        int uppersign = 0;
  595.        int downsign = 0;
  596.        int c_count = 1;
  597.        for (i = 0; i < 17; i++) {
  598.            for (j = 0; j < 17; j++) {
  599.                tt[i][j] = chessBoard[i][j];
  600.            }
  601.        }
  602.        tt[y][x] = side;
  603.        /* left down and right upper */
  604.        tx = x;
  605.        ty = y;
  606.        if (tt[ty - 1][tx - 1] != side) {
  607.            if (tt[ty - 1][tx - 1] == 0) {
  608.                uppersign = 1;
  609.            }
  610.            if (tt[ty - 1][tx - 1] != 0) {
  611.                uppersign = 0;
  612.            }
  613.        }
  614.        else {
  615.            tx -= 1;
  616.            ty -= 1;
  617.            while (tt[ty][tx] == side) {
  618.                c_count += 1;
  619.                tx--;
  620.                ty--;
  621.            }
  622.            if (tt[ty][tx] == 0) {
  623.                uppersign = 1;
  624.            }
  625.            if (tt[ty][tx] != 0) {
  626.                uppersign = 0;
  627.            }
  628.        }
  629.        tx = x;
  630.        ty = y;
  631.        if (tt[ty + 1][tx + 1] != side) {
  632.            if (tt[ty + 1][tx + 1] == 0) {
  633.                downsign = 1;
  634.            }
  635.            if (tt[ty + 1][tx + 1] != 0) {
  636.                downsign = 0;
  637.            }
  638.        }
  639.        else {
  640.            tx += 1;
  641.            ty += 1;
  642.            while (tt[ty][tx] == side) {
  643.                c_count += 1;
  644.                tx++;
  645.                ty++;
  646.            }
  647.            if (tt[ty][tx] == 0) {
  648.                downsign = 1;
  649.            }
  650.            if (tt[ty][tx] != 0) {
  651.                downsign = 0;
  652.            }
  653.        }
  654.        mark += pow(base, c_count);
  655.        if ( (uppersign + downsign) > 0) {
  656.            //mark*=(uppersign+downsign);
  657.            if ( (uppersign + downsign) == 2) {
  658.                mark *= (uppersign + downsign);
  659.            }
  660.            if ( (uppersign + downsign) == 1) {
  661.                mark = mark / 2;
  662.            }
  663.        }
  664.        else if (c_count == 5) {
  665.            mark *= 4;
  666.        }
  667.        else {
  668.            mark = 0;
  669.        }
  670.        if (c_count == 5) {
  671.            mark += INVALID;
  672.        }
  673.        return mark;
  674.    }
  675.    private long analyseRdlu(int x, int y, int side){
  676.        int tt[][] = new int[17][17];
  677.        int i, j;
  678.        int tx, ty;
  679.        long mark = 0;
  680.        int base = BASE;
  681.        int uppersign = 0;
  682.        int downsign = 0;
  683.        int c_count = 1;
  684.        for (i = 0; i < 17; i++) {
  685.            for (j = 0; j < 17; j++) {
  686.                tt[i][j] = chessBoard[i][j];
  687.            }
  688.        }
  689.        tt[y][x] = side;
  690.        /* left down and right upper */
  691.        tx = x;
  692.        ty = y;
  693.        if (tt[ty - 1][tx + 1] != side) {
  694.            if (tt[ty - 1][tx + 1] == 0) {
  695.                uppersign = 1;
  696.            }
  697.            if (tt[ty - 1][tx + 1] != 0) {
  698.                uppersign = 0;
  699.            }
  700.        }
  701.        else {
  702.            tx += 1;
  703.            ty -= 1;
  704.            while (tt[ty][tx] == side) {
  705.                c_count += 1;
  706.                tx++;
  707.                ty--;
  708.            }
  709.            if (tt[ty][tx] == 0) {
  710.                uppersign = 1;
  711.            }
  712.            if (tt[ty][tx] != 0) {
  713.                uppersign = 0;
  714.            }
  715.        }
  716.        tx = x;
  717.        ty = y;
  718.        if (tt[ty + 1][tx - 1] != side) {
  719.            if (tt[ty + 1][tx - 1] == 0) {
  720.                downsign = 1;
  721.            }
  722.            if (tt[ty + 1][tx - 1] != 0) {
  723.                downsign = 0;
  724.            }
  725.        }
  726.        else {
  727.            tx -= 1;
  728.            ty += 1;
  729.            while (tt[ty][tx] == side) {
  730.                c_count += 1;
  731.                tx--;
  732.                ty++;
  733.            }
  734.            if (tt[ty][tx] == 0) {
  735.                downsign = 1;
  736.            }
  737.            if (tt[ty][tx] != 0) {
  738.                downsign = 0;
  739.            }
  740.        }
  741.        mark += pow(base, c_count);
  742.        if ( (uppersign + downsign) > 0) {
  743.            if ( (uppersign + downsign) == 2) {
  744.                mark *= (uppersign + downsign);
  745.            }
  746.            if ( (uppersign + downsign) == 1) {
  747.                mark = mark / 2;
  748.            }
  749.        }
  750.        else if (c_count == 5) {
  751.            mark *= 4;
  752.        }
  753.        else {
  754.            mark = 0;
  755.        }
  756.        if (c_count == 5) {
  757.            mark += INVALID;
  758.        }
  759.        return mark;
  760.    }
  761.    /**
  762.     *
  763.     * @param x
  764.     * @param y
  765.     * @param side
  766.     * @return
  767.     */
  768.    private long analyse(int x, int y, int side){
  769.        long mark = 0;
  770.        mark += analyseUd(x, y, side);
  771.        mark += analyseLr(x, y, side);
  772.        mark += analyseLdru(x, y, side);
  773.        mark += analyseRdlu(x, y, side);
  774.        return mark;
  775.    }
  776.    /**
  777.     *
  778.     * @param chess
  779.     * @param deepth
  780.     * @return
  781.     */
  782.    private Queue searchPoint(int chess[][],int deepth){
  783.        //temp
  784.        int cx, cy;
  785.        //int newdeepth;
  786.        char s[] = new char[10];
  787.        //temp
  788.        Queue pq[] = null, pq_temp[] = null, pq_final;
  789.        int temp_chess[][] = new int[17][17];
  790.        long mark = 0;
  791.        int duce;
  792.        int i, j;
  793.        int m, n, p, q;
  794.        int media;
  795.        int MAX;
  796.        int k, b;
  797.        //mark
  798.        MAX=MAX1<=(225-STEPCOUNTER)?MAX1:(225-STEPCOUNTER);
  799.             if(MAX==(225-STEPCOUNTER)){
  800.         MINDEEPTH=1;
  801.             }
  802.        pq = new Queue[MAX + 1];
  803.        for (m = 0; m < MAX; m++) {
  804.            pq[m] = new Queue();
  805.        }
  806.        for (m = 0; m < MAX; m++) {
  807.            pq[m].mark = 0;
  808.            pq[m].position = 0;
  809.        }
  810.        for (i = 1; i <= 15; i++) {
  811.          //  System.out.println();
  812.            for (j = 1; j <= 15; j++) {
  813.                if (chess[i][j] != 0) {
  814.                    mark = 0;
  815.                }
  816.                else {
  817.                    mark = analyse(j, i, 1) / 2 + analyse(j, i, 2);
  818.            //        System.out.print("t" + mark);
  819.                }
  820.                //tempboard[i][j]=mark;
  821.                for (m = 0; m < MAX; m++) {
  822.                    if (mark > pq[m].mark) {
  823.                        for (n = MAX - 1; n > m; n--) {
  824.                            pq[n].mark = pq[n - 1].mark;
  825.                            pq[n].position = pq[n - 1].position;
  826.                        }
  827.                        pq[m].mark = mark;
  828.                        pq[m].position = i * 100 + j;
  829.                        break;
  830.                    }
  831.                }
  832.            }
  833.        }
  834.        //newdeepth=maxdeepth;
  835.        if (pq[0].mark >= INVALID / 2) {
  836.            MINDEEPTH = deepth;
  837.        }
  838.        if (deepth < MINDEEPTH) {
  839.            for (m = 0; m < MAX; m++) {
  840.                for (p = 0; p <= 16; p++) {
  841.                    for (q = 0; q <= 16; q++) {
  842.                        temp_chess[p][q] = chess[p][q];
  843.                    }
  844.                }
  845.                if (deepth % 2 == 1) {
  846.                    media = 2;
  847.                }
  848.                else {
  849.                    media = 1;
  850.                }
  851.                temp_chess[pq[m].position / 100][pq[m].position % 100] = media;
  852.                pq[m] = searchPoint(temp_chess, deepth + 1);
  853.            }
  854.        }
  855.        pq_temp = new Queue[MAX + 1];
  856.        for (m = 0; m < MAX; m++) {
  857.            pq_temp[m] = new Queue();
  858.        }
  859.        for (p = 0; p < MAX; p++) {
  860.            pq_temp[p].mark = 0;
  861.            pq_temp[p].position = 0;
  862.        }
  863.        for (p = 0; p < MAX; p++) {
  864.            for (q = 0; q < MAX; q++) {
  865.                if (pq[p].mark > pq_temp[q].mark) {
  866.                    for (i = MAX - 1; i > q; i--) {
  867.                        pq_temp[i] = pq_temp[i - 1];
  868.                    }
  869.                    pq_temp[q] = pq[p];
  870.                    break;
  871.                }
  872.            }
  873.        }
  874.        pq_final = pq_temp[0];
  875.        return pq_final;
  876.    }
  877.    public int computerDo(){
  878.        int position = 0;
  879.        int cx, cy;
  880.        position = (searchPoint(chessBoard, 3)).position;
  881.        cx = position % 100;
  882.        cy = position / 100;
  883. //       System.out.print("n" + cy + "t" + cx + "n");
  884.        if (cx == 0 && cy == 0) {
  885.            return 1;
  886.        }
  887.        return position;
  888.    }
  889. } ///:-)
  890. }///:-)
  891. /**
  892.  * mouse Adapter
  893.  * <p>Title: </p>
  894.  * <p>Description: </p>
  895.  * <p>Copyright: Copyright (c) 2003</p>
  896.  * <p>Company: e-top</p>
  897.  * @author cylix
  898.  * @version 1.0
  899.  */
  900. class ChessWZQ_this_mouseAdapter extends java.awt.event.MouseAdapter {
  901.     BoardPanel adaptee;
  902.     ChessWZQ_this_mouseAdapter(BoardPanel adaptee) {
  903.         this.adaptee = adaptee;
  904.     }
  905.     public void mouseClicked(MouseEvent e) {
  906.         adaptee.this_mouseClicked(e);
  907.     }
  908. }///:-)
  909. /**
  910.  * mouse Adapter
  911.  * <p>Title: </p>
  912.  * <p>Description: </p>
  913.  * <p>Copyright: Copyright (c) 2003</p>
  914.  * <p>Company: e-top</p>
  915.  * @author cylix
  916.  * @version 1.0
  917.  */
  918. class ChessWZQ_this_mouseMotionAdapter extends java.awt.event.MouseMotionAdapter {
  919.     BoardPanel adaptee;
  920.     ChessWZQ_this_mouseMotionAdapter(BoardPanel adaptee) {
  921.         this.adaptee = adaptee;
  922.     }
  923.     public void mouseMoved(MouseEvent e) {
  924.         adaptee.this_mouseMoved(e);
  925.     }
  926. }///:-)