java象棋

来源:互联网 发布:sql导出insert语句 编辑:程序博客网 时间:2024/04/28 03:52

/* @author AnShuFeng
*   @version 1.0
*  人人对战象棋
*  XiangQi.java
*/
  
import java.awt.*;
import java.awt.event.*;
import javax.imageio.*;
import java.io.*;
import javax.swing.*;
import java.awt.image.*;

public class XiangQi
{
    JFrame frame = new JFrame("树峰象棋");
    //红方所有棋子
    BufferedImage rj;
    BufferedImage rm;
    BufferedImage rx;
    BufferedImage rs;
    BufferedImage rk;
    BufferedImage rp;
    BufferedImage rz;
    //黑方所有棋子
    BufferedImage hj;
    BufferedImage hm;
    BufferedImage hx;
    BufferedImage hs;
    BufferedImage hk;
    BufferedImage hp;
    BufferedImage hz;
    //定义棋盘
    BufferedImage table;
    //定义棋盘大小
    private int BOARD_SIZEX = 9;
    private int BOARD_SIZEY = 10;
    //定义棋盘宽高多少个像素
    private final int TABLE_WIDTH = 396;
    private final int TABLE_HETGHT = 398;
    //定义棋盘坐标的像素值和棋盘坐标之间的比率
    private final int RATE = TABLE_WIDTH/BOARD_SIZEY;
    //定义一个二维数组来充当棋盘
    private char[][] board = new char[BOARD_SIZEX][BOARD_SIZEY];
    ChessBoard chessBoard = new ChessBoard();
    //定义棋盘坐标的像素值和棋盘数组之间的偏移距
    private final int X_OFFSET = 20;
    private final int Y_OFFSET = 8;
    //保存鼠标拖动前和后的坐标  
     int xPos1 = -1;
  int yPos1 = -1;
  int xPos2 = -1;
  int yPos2 = -1;
  //两方每次只能走一步限定标识符
  boolean n = true;
 
    public void init()throws Exception
    {
       table = ImageIO.read(new File("image/ChessBoard.bmp"));
       rj = ImageIO.read(new File("image/RED_J.bmp"));
       rm = ImageIO.read(new File("image/RED_M.bmp"));
       rx = ImageIO.read(new File("image/RED_X.bmp"));
       rs = ImageIO.read(new File("image/RED_S.bmp"));
       rk = ImageIO.read(new File("image/RED_K.bmp"));
       rp = ImageIO.read(new File("image/RED_P.bmp"));
       rz = ImageIO.read(new File("image/RED_B.bmp"));
       hj = ImageIO.read(new File("image/BLACK_J.bmp"));
       hm = ImageIO.read(new File("image/BLACK_M.bmp"));
       hx = ImageIO.read(new File("image/BLACK_X.bmp"));
       hs = ImageIO.read(new File("image/BLACK_S.bmp"));
       hk = ImageIO.read(new File("image/BLACK_K.bmp"));
       hp = ImageIO.read(new File("image/BLACK_P.bmp"));
       hz = ImageIO.read(new File("image/BLACK_B.bmp"));
          
       for (int i = 0; i < BOARD_SIZEX; i++)
       {
           for(int j = 0; j < BOARD_SIZEY; j++)
           {
               board[i][j] = '*';
           }
       }
      
        board[0][0] = board[8][0] = 'J';         
     board[1][0]=board[7][0]='M';
     board[2][0]=board[6][0]='X';
     board[3][0]=board[5][0]='S';
     board[4][0]='K';
     board[1][2]=board[7][2]='P';
     board[0][3]=board[2][3]=board[4][3]=
     board[6][3]=board[8][3]='B';
     board[0][6]=board[2][6]=board[4][6]=
     board[6][6]=board[8][6]='b';
     board[1][7]=board[7][7]='p';
     board[0][9]=board[8][9]='j';
     board[1][9]=board[7][9]='m';
     board[2][9]=board[6][9]='x';
     board[3][9]=board[5][9]='s';
     board[4][9]='k';
         
     chessBoard.addMouseListener(new MouseAdapter()
     {
         public void mousePressed(MouseEvent e)
         {
             //如果符合一步一步轮回规则走
             if((board[xPos2][yPos2] <= 'Z' && board[xPos1][yPos1] >= 'a')
                || (board[xPos2][yPos2] >= 'a' && board[xPos1][yPos1] <= 'Z'))
             {
                 xPos1 = (int)(e.getX() - X_OFFSET) / RATE;
                 yPos1 = (int)(e.getY() - Y_OFFSET) / RATE;
                 n = true;
                
             }
             //如果一方连续走两步,则第二次不能走坐标还原
             else
             {  
                 n = false;
                 xPos2 = xPos1;
                 yPos2 = yPos1;
             }
             chessBoard.repaint();
         }
     });
     //鼠标移动时事件处理
     chessBoard.addMouseMotionListener(new MouseMotionAdapter()
        {
            public void mouseMoved(MouseEvent e)
            {
                xPos1 = (int)(e.getX() - X_OFFSET) / RATE;
             yPos1 = (int)(e.getY() - Y_OFFSET) / RATE;
                chessBoard.repaint();
            }
        });
     //鼠标拖动到目的地
     chessBoard.addMouseListener(new MouseAdapter()
     {
         public void mouseReleased(MouseEvent e)
         {
             //如果符合单步轮流规则走
             if(n)
             {
                 xPos2 = (int)(e.getX() - X_OFFSET) / RATE;
                 yPos2 = (int)(e.getY() - Y_OFFSET) / RATE;
             }
             else
             {
                 xPos2 = xPos1;
                 yPos2 = yPos1;
             }         
            
            //以下是棋子在两个将军之间的特殊处理
            if( board[xPos1][yPos1] != 'k'
                && board[xPos1][yPos1] != 'K' && true == n)
            {
            if((xPos1 == 3) || (xPos1 == 4) || (xPos1 == 5))
            {
                if((board[xPos1][yPos1] == 'm') ||
                   (board[xPos1][xPos1] == 'M') ||
                   (board[xPos1][yPos1] == 'x') ||
                   (board[xPos1][yPos1] == 'X') ||
                   (board[xPos1][yPos1] == 's') ||
                   (board[xPos1][yPos1] == 'S'))
                {
                    //如果两将之间只有一个子且是馬,象,士,则不能动
                    if(isBetween(board[xPos1][yPos1]))
                         walk(board[xPos1][yPos1], xPos1, yPos1);
                }
                //棋子非馬、象、士的特殊处理
                else  if(board[xPos1][yPos1] != 'k' &&
                        (board[xPos1][yPos1] != 'K'))
                {
                   
                    int i =0;
                    int j = 0;
                    int x1 = 0;
                    int x2 = 0;
                    int y1 = 0;
                    int y2 = 0;
                   
                    //找出红方将的纵坐标
                        for(i = 3; i < 6; i++)
                        {
                         for(j=0;j<3;j++)
                         {
                          if(board[i][j]=='K')
                          {
                              y1 = j;
                              x1 = i;
                              break;
                          }
                         }
                        }
                        //找出黑方将的纵坐标
                        for(i = 3; i < 6; i++)
                        {
                         for(j=7;j<10;j++)
                         {
                          if(board[i][j]=='k')
                          {
                           y2 = j;
                           x2 = i;
                           break;
                               }
                         }
                        }
                        //判断棋子是否在两将之间是返回false否则返回true
                     if(isBetween(board[xPos1][yPos1]))
                         walk(board[xPos1][yPos1], xPos1, yPos1);
                     //炮不能直接吃将所以目的坐标小于y2,大于y1
                     else if((board[xPos1][yPos1] == 'p') ||
                            (board[xPos1][yPos1] == 'P')  &&                           
                            (yPos2 < y2) && (yPos2 > y1))
                     {
       
                         if(xPos1 == xPos2 && board[xPos2][yPos2] == '*')
                         {
                             board[xPos2][yPos2] = board[xPos1][yPos1];
                             board[xPos1][yPos1] = '*';
                         }
                     }
                     //对車夹在两将之间的特殊处理
                     else if((board[xPos1][yPos1] == 'j') ||
                            (board[xPos1][yPos1] == 'J') )
                     {
                         if(xPos1 == xPos2 && board[xPos2][yPos2] == '*')
                         {
                             board[xPos2][yPos2] = board[xPos1][yPos1];
                             board[xPos1][yPos1] = '*';
                             chessBoard.repaint();
                         }
                     }
                        
                     //即兵在两将之间点的规则
                     else
                     {
                         if(board[xPos1][yPos1] == 'B')
                         {
                             if((xPos1 == xPos2) && (yPos2 == yPos1 +1))
                             {
                                 board[xPos2][yPos2] = board[xPos1][yPos1];
                                 board[xPos1][yPos1] = '*';
                                 chessBoard.repaint();
                             }
                         }
                         else if(board[xPos1][yPos1] == 'b')
                         {
                             if((xPos1 == xPos2) && (yPos2 == yPos1 -1))
                             {
                                 board[xPos2][yPos2] = board[xPos1][yPos1];
                                 board[xPos1][yPos1] = '*';
                                 chessBoard.repaint();
                             }
                         }
                     }               
                }
               
                {
                //炮与将之间没有其他子,其他子移动时的特殊处理
                }
            }
            else
            {
                walk(board[xPos1][yPos1], xPos1, yPos1);
            }
           
         }
         else
         {
             if(board[xPos1][yPos1] != 'k'
                 && board[xPos1][yPos1] != 'K')
             {
             xPos2 = xPos1;
             yPos2 = yPos1;
             }
             walk(board[xPos1][yPos1], xPos1, yPos1);
         }
         over();
         chessBoard.repaint();
         }
    
     });
    
     //设置窗口内光标形状
     Cursor cr = new Cursor(Cursor.HAND_CURSOR);
     frame.setCursor(cr);
     
   
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        chessBoard.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HETGHT));
        frame.add(chessBoard);
       
        Image bfi = null;
        try
        {
            bfi = ImageIO.read(new File("D://homework//image//myself.jpg"));
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }      
        //设置窗口图片为bfi
        frame.setIconImage(bfi);
        //禁止用户调整窗口大小
        frame.setResizable(false);   
        frame.pack();
        frame.setVisible(true);
   }
      
   //具体走的每一细节的规则和步骤
   public void walk(char chessman,int m,int n)                   
   {
 int a,b,cx=0,i;
 // 要走的棋子的最终坐标,就是走到哪
 a = xPos2;
 b = yPos2;                                                 
 boolean go;
 //自己不能吃自己棋子的规则限定
 go=(((chessman>='A'&&chessman<='X')&&(board[a][b]>='a'
     &&board[a][b]<='x'))||((chessman>='A'
     &&chessman<='X')&&(board[a][b]=='*'))
     ||((chessman>='a'&&board[a][b]<='x')&&(board[a][b]>='A'
  &&board[a][b]<='X')||(chessman>='a'&&chessman<='x')
  &&(board[a][b]=='*')));
 
    if(go)
 {
    //車的具体走法规则限定
    if(chessman=='J'||chessman=='j')            
 {
  
        //如果車的横轴方向从此地到目的地全是*,也就是从目前位置到要走到的位置之间没有任何棋子。
        //往右走
     for(i = m + 1; i < a && b == n; i++)                                                                                                 
  {
   if(board[i][b]=='*')
    continue;
   else
    break;
  }
  //符合规则,走!
  if((i == a) && (b == n))                                                                                   
  {
   board[a][b]=chessman;
   board[m][n]='*';
  }
  //車往左或往右一个位置走
  else if(b==n&&(a==m+1||a==m-1))                             
  {
   board[a][b]=chessman;
   board[m][n]='*';
  }
  //車往前或往后一个位置走
  else if((b==n+1||b==n-1)&&a==m)                             
  {
   board[a][b]=chessman;
   board[m][n]='*';
  }
   //車往左走(目前位置的左方)
  else for(i=m-1;i>a;i--)                                     
  {
   if(board[i][b]=='*')
    continue;
   else
       break;
     }
          //满足条件,走!
  if(i == a && b == n)                                                       
  {
   board[a][b]=chessman;
   board[m][n]='*';
  }
  //車往下走
  else for(i=n+1;i<b;i++)                                         
  {
   if(board[m][i]=='*')
    continue;
   else
    break;
  }
  //满足条件 ,走
  if(i == b && a == m)                                                                                                                                       
  {
   board[a][b]=chessman;
   board[m][n]='*';
  }
  //車往上走
  else for(i=n-1;i>b;i--)                            
  {
   if(board[m][i]=='*')
    continue;
   else
    break;
  }
  //满足条件,走!
  if(i == b && a == m)                                                                                    
  {
   board[a][b]=chessman;
   board[m][n]='*';
  }
 }
 //炮的具体走法规则
 if(chessman=='P' || chessman=='p')                                               
 {
  //到目的地炮的右方没有棋子往右走
  for(i=m+1;i<a&&b==n;i++)                                         
  {
   if(board[i][b]=='*')
    continue;
   else
    break;
  }
  //满足条件,走!
  if((i == a) && (b == n))                                                               
  {
      if(board[a][b] == '*')
      {
       board[a][b]=chessman;
       board[m][n]='*';
   }
  }
  //往左或右走一步且左或有目前没子 
    if(b==n&&(a==m+1||a==m-1))                                                                                                      
  {
      if(board[a][b]=='*')
      {
       board[a][b]=chessman;
        board[m][n]='*';
    }
  }
   //往上或往下走一步
   if((b==n+1||b==n-1)&& (a==m))                                           
  {
      if(board[a][b]=='*')
      {
       board[a][b]=chessman;
       board[m][n]='*';
   }
  }
   //往左判断走不走
  else for(i = m - 1; i > a && (b == n); i--)                                                   
  {
   if(board[i][b] == '*')
    continue;
   else
    break;
    
  }
  //满足条件,走!
  if((i == a) && (b == n))                                                                  
  {
      if(board[a][b]=='*')
      {
       board[a][b]=chessman;
       board[m][n]='*';
   }
  }
  
   //往下判断走不走
     else for(i = n + 1;i < b && a == m; i++)                                                 
  {
   if(board[m][i]=='*')
    continue;
   else
    break;
  }
    //满足条件,往下走!                                                                       
  if(i == b && m == a)                                                                                        
  {
      if(board[a][b] == '*')
      {
       board[a][b]=chessman;
       board[m][n]='*';
   }
  }
  
   //往上判断走不走
     else for(i = n - 1; i > b && a == m; i--)                                                                    
  {
   if(board[m][i]=='*')
    continue;
   else
    break;
  }
   //满足条件,往上走!
    if(i == b && a == m)                          
    {
      //炮要到达的目的地无子  
      if(board[a][b] == '*')
      {                                                 
         board[a][b]=chessman;             
         board[m][n]='*';
     }                       
    }                                   
   
        //往右走!包括自己还有目标棋子如果他们中间只有一个棋子的话就往下走,
        //否则保持原状。自己+目标棋子+中间棋子=3
     else for(i = m, cx = 0; i <= a && b == n; i++)                                                                 
  {
   if(board[i][b] != '*')
    cx += 1;
        
  }
  //满足条件,往右走                                                                 
  if(cx == 3 && b == n)                                                                          
        {                                       
         board[a][b]=chessman;                      
      board[m][n]='*';                            
  }
  //往左走!包括自己还有目标棋子如果他们中间只有一个棋子的话就往下走,
  //否则保持原状。自己+目标棋子+中间棋子=3
  else for(i = m, cx = 0;i >= a && b == n; i--)   
  {                         
      if(board[i][b]!='*')                                               
        cx+=1;
  }
  //满足条件往左走
  if(cx == 3 && b == n)                                                                                  
  {
   board[a][b]=chessman;
   board[m][n]='*';
  }
       //往下走!包括自己还有目标棋子如果他们中间只有一个棋子的话就往下走,
       //否则保持原状。自己+目标棋子+中间棋子=3
  else for(i = n, cx = 0; i <= b; i++)
  {
   if(board[m][i] != '*')
    cx += 1;
  }
  //满足条件往下走
  if(cx == 3 && a == m)                                                                                   
  {
   board[a][b]=chessman;
   board[m][n]='*';
  }
        //往上走!包括自己还有目标棋子如果他们中间只有一个棋子的话就往下走,
        //否则保持原状。自己+目标棋子+中间棋子=3
  else for(i = n, cx = 0; i >= b; i--)
  {
   if(board[m][i]!='*')
    cx+=1;
  }
  //满足条件往上走
  if(cx == 3 && a == m)                                                                                   
  {
   board[a][b]=chessman;
   board[m][n]='*';
  }
 }
 
    //一方的士兵走法和规则(横坐标为0~4一方的)
 if(chessman=='S')                                                                                   
 {
     //在有效区域才往下执行
  if(b<=2&&a>=3&&a<=5)                                               
  {
           //右斜向下
   if(b==n+1&&a==m+1)                                                                  
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
   //左斜向向下
   else if(b==n+1&&a==m-1)                                                                                                                         
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
   //左向上
   else if(b==n-1&&a==m-1)                                                             
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
   //右向上
   else if(b==n-1&&a==m+1)                                                           
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
  }
 }
 //规则走法同上 
 if(chessman=='s')                                                                                                                                             
 {
  if((b>=7&&b<=9)&&(a>=3&&a<=5))
  {
      //右向下
   if(b==n+1&&a==m+1)
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
   //左向下
   else if(b==n+1&&a==m-1)
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
   //左向上
   else if(b==n-1&&a==m-1)
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
   //右向上
   else if(b==n-1&&a==m+1)
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
  }
 }
 
 //兵(0~4坐标的)
 if(chessman=='B')                                                                                   
 {
  if(b==4)                                                                    
  {
       //没过河,只能往前走
   if(b == n + 1 && a == m)
   {
    board[a][b]=chessman;                                                     
    board[m][n]='*';
   }
  }
   //过河了
  else if(b>=5)                                                                              
  {
      //往右移
   if(b==n&&a==m+1)                                                                  
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
      //前进
   else if(b==n+1&&a==m)                                                              
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
   //往左走
   else if(b==n&&a==m-1)                                                            
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
   
  }
 }
 //馬的走法(日字规则)
 if(chessman=='M'||chessman=='m')                                           
 {
     //往右下角跳(竖着走)
  if(b==n+2&&a==m+1)                                                   
  {
      //看有没有拌着馬腿
   if(board[m][n+1]=='*')                                          
   {
    board[a][b]=chessman;                                        
    board[m][n]='*';
   }
  }
  //往左下角跳(竖着走)
  else if(b==n+2&&a==m-1)                                                                                                        
  {
      //是否拌马腿
   if(board[m][n+1]=='*')                                       
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
  }
  //往右上角跳(竖着走)
  else if(b==n-2&&a==m+1)                                           
  {
      //是否拌着马腿                
   if(board[m][n-1]=='*')                                                                                                     
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
  }
  //往左上角跳(竖着走)
  else if(b==n-2&&a==m-1)                                          
  {
      //看是否拌着马腿
   if(board[m][n-1]=='*')                                        
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
  }
  //横着(曰字规则)往右侧跳
  else if(b==n+1&&a==m+2)                                               
  {
       //有没有拌着马腿
   if(board[m+1][n]=='*')                                            
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
  }
  //横着往左下角跳
  else if(b==n+1&&a==m-2)                                                      
  {
      //是否拌着马腿
   if(board[m-1][n]=='*')                                           
   {
    board[a][b]=chessman;                                            
    board[m][n]='*';
   }
  }
  //横着往右上角跳
  else if(b==n-1&&a==m+2)                                                    
  {
   if(board[m+1][n]=='*')
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
  }
  //横着往左上角跳
  else if(b==n-1&&a==m-2)                                                         
  {
   if(board[m-1][n]=='*')                                                              
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
  }
 }
 //兵的走法与规则同上(5~9坐标的)
 if(chessman=='b')                                                 
 {
  if(b==5)
  {
   if(b==n-1&&a==m)
   {
     board[a][b]=chessman;
     board[m][n]='*';
   }
  }
  else if(b<=4)
  {
   if(b==n&&a==m+1)
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
   else if(b==n-1&&a==m)
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
   else if(b==n&&a==m-1)
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
  }
 }
    //象的走法(田字规则)
 if(chessman=='X')                                                    
 {
     //目的坐标在相坐标范围内才往下执行
  if(b<=4&&a<=8)                                                     
  {
       //往右下角跳
   if(b == n + 2 && a == m + 2 && board[m+1][n+1] == '*')                       
   {
    board[a][b]=chessman;                                       
    board[m][n]='*';
   }
   //往左上角跳
   else if(b == n-2 && a == m-2 && board[m-1][n-1] == '*')                                       
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
   //往右上角跳
   else if(b==n-2&&a==m+2&&board[m+1][n-1]=='*')                                       
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
   //往左下角跳
   else if(a==m-2&&b==n+2&&board[m-1][n+1]=='*')                                                                            
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
  }
 }
  //另一方象的规则同上
 if(chessman=='x')                                                      
 {
  if(b>=5&&a<=8)
  {
   if(a==m+2&&b==n+2&&board[m+1][n+1]=='*')
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
   else if(a==m-2&&b==n-2&&board[m-1][n-1]=='*')
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
   else if(a==m+2&&b==n-2&&board[m+1][n-1]=='*')
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
   else if(b==n+2&&a==m-2&&board[m-1][n+1]=='*')
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
  }
 }
 //将军的走法与规则
 if(chessman=='K')                                                   
 {
     //存取对方将军的坐标
     int tempy = 0;
     //目的坐标在规则范围内
  if(b>=0&&b<=2&&a>=3&&a<=5)
  {
      //往上走或往下走
   if((b==n+1||b==n-1)&&a==m)
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
   else if((a == m + 1 || a == m - 1) && (b == n))
   {
       //找到对方将军的坐标     
       for(int x = 3; x < 6; x++)
       {
           for(int y = 7; y < 10; y++)
           {
               if(board[x][y] == 'k')
               {
                   tempy = y;
                   break;
               }
            }
       }
       //将军要走到的目的地那一列有其他棋子存在
    for(i = b + 1, cx = 0; i < tempy; i++)
    {
     if(board[a][i] != '*')
      cx++;
    }
             //己方将军要到的目的地一列对面不是对方或有其他子
    if((cx >0 || board[a][tempy] != 'k') && b == n)
    {
     board[a][b]=chessman;
     board[m][n]='*';
    }
   }
   }
      }
   }
 if(chessman=='k')
 {
     //存取对方将军的坐标
     int tempy = 0;
  if(b>=7&&b<=9&&a>=3&&a<=5)
  {
   if((b==n+1||b==n-1)&&a==m)
   {
    board[a][b]=chessman;
    board[m][n]='*';
   }
   //向左或向右移动
   else if((a==m+1)||(a==m-1)&&(b==n))
   {
       //找到对方将军的坐标
       for(int x = 3; x < 6; x++)
       {
           for(int y = 0; y < 3; y++)
           {
               if(board[x][y] == 'K')
               {
                   tempy = y;
                   break;
               }
           }
        }
       //统计对方将军竖列上的其他子
    for(i=b-1,cx=0;i>tempy;i--)
    {
     if(board[a][i]!='*')
      cx++;
    }
    //如果与对方将军同列上有其他子或对方将军不会与己方将军见面
    if((cx > 0 || board[a][tempy]!='K') && b == n)
    {
     board[a][b]=chessman;
     board[m][n]='*';
    }
   }
  }
 }

  }
 //判断是否要结束
 public  void  over()                                                                                                      
 {
     int end=0;
     int i,j;
     for(end = 0 , i = 3; i < 6; i++)
     {
      for(j=0;j<3;j++)
      {
       if(board[i][j]=='K')
        end+=1;
      }
     }
     for(i = 3; i < 6; i++)
     {
      for(j=7;j<10;j++)
      {
       if(board[i][j]=='k')
        end+=1;
      }
     }
     //一个将已被吃掉,返回0,结束}
     if(end < 2)  
     {
          chessBoard.repaint();
          JOptionPane.showMessageDialog(frame, "哈哈!恭喜你赢了!");                                                            
          System.exit(0); 
      }                                               
 }
 //看看是不是只有一个子并且和两K一列(x坐标值相等),所有中间的那子不能动
    public  boolean  isBetween(char c)                                                                                                      
    {
        int i = 0, j = 0;
        int x1 = 0, x2 = 0;
        int y1 = 0, y2 = 0;
        int count = 0;
        int temp = 0;
        //找出传入棋子的横坐标
        for(i = 3; i < 6; i++)
        {
           for(j = 0; j < 10; j++)
           {
               if(board[i][j] == c)
               {
                   temp = i;
                   break;
                }
            }
        }
        //找出红方将的横,纵坐标
        for(i = 3; i < 6; i++)
        {
         for(j=0;j<3;j++)
         {
          if(board[i][j]=='K')
          {
              x1 = i;
              y1 = j;
              break;
          }
         }
        }
        //找出黑方将得横、纵坐标
        for(i = 3; i < 6; i++)
        {
         for(j=7;j<10;j++)
         {
          if(board[i][j]=='k')
          {
           x2 = i;
           y2 = j;
           break;
               }
         }
        }
       
        //如果该棋子没有在两个将之间 
        if(x1 != x2)
            return true;
        else if(x1 != temp)
            return true;
        //该棋子在两个将之间
        else  if(x1 == x2)
        {
            for(i = y1 + 1; i < y2; i++)
            {
               if((board[x1][i] != '*') )
               {
                   count += 1;
               }
            }
        }
        //两个将之间大于等于两个子
        if(count > 1)
            return true;
        //两个将之间只有一个子
        else 
             return false;
      
    }
  
 
   public static void main(String[] args) throws Exception
   {          
       XiangQi xq = new XiangQi();
       xq.init();
   } 
 
  
   //定义绘制棋盘及各个棋子用的画板类       
   class ChessBoard extends JPanel
   {
   //重写paint方法,在调用repaint方法时调用它
        public void paint(Graphics g)
        {
           //绘制棋盘
           g.drawImage(table, 0, 0, null);
          
           for(int i = 0; i < BOARD_SIZEX; i++)
           {
               for(int j = 0; j < BOARD_SIZEY; j++)
               {
                   //绘制红方車
                   if(board[i][j] == ('J'))
                   {
                       g.drawImage(rj, i * RATE + X_OFFSET, j * RATE + Y_OFFSET, null);
                   }
                   //绘制红方馬
                   if(board[i][j] == ('M'))
                   {
                       g.drawImage(rm, i * RATE + X_OFFSET, j * RATE + Y_OFFSET, null);
                   }
                   //绘制红方象
                   if(board[i][j] == ('X'))
                   {
                       g.drawImage(rx, i * RATE + X_OFFSET, j * RATE + Y_OFFSET, null);
                   }
                   //绘制红方士
                   if(board[i][j] == ('S'))
                   {
                       g.drawImage(rs, i * RATE + X_OFFSET, j * RATE + Y_OFFSET, null);
                   }
                   //绘制红方将
                   if(board[i][j] == ('K'))
                   {
                       g.drawImage(rk, i * RATE + X_OFFSET, j * RATE + Y_OFFSET, null);
                   }
                   //绘制红方炮
                   if(board[i][j] == ('P'))
                   {
                       g.drawImage(rp, i * RATE + X_OFFSET, j * RATE + Y_OFFSET, null);
                   }
                   //绘制红方兵
                   if(board[i][j] == ('B'))
                   {
                       g.drawImage(rz, i * RATE + X_OFFSET, j * RATE + Y_OFFSET, null);
                   }
                   //绘制黑方車
                   if(board[i][j] == ('j'))
                   {
                       g.drawImage(hj, i * RATE + X_OFFSET, j * RATE + Y_OFFSET, null);
                   }
                   //绘制黑方馬
                   if(board[i][j] == ('m'))
                   {
                       g.drawImage(hm, i * RATE + X_OFFSET, j * RATE + Y_OFFSET, null);
                   }
                   //绘制黑方象
                   if(board[i][j] == ('x'))
                   {
                       g.drawImage(hx, i * RATE + X_OFFSET, j * RATE + Y_OFFSET, null);
                   }
                   //绘制黑方士
                   if(board[i][j] == ('s'))
                   {
                       g.drawImage(hs, i * RATE + X_OFFSET, j * RATE + Y_OFFSET, null);
                   }
                   //绘制黑方将
                   if(board[i][j] == ('k'))
                   {
                       g.drawImage(hk, i * RATE + X_OFFSET, j * RATE + Y_OFFSET, null);
                   }
                   //绘制黑方炮
                   if(board[i][j] == ('p'))
                   {
                       g.drawImage(hp, i * RATE + X_OFFSET, j * RATE + Y_OFFSET, null);
                   }
                   //绘制黑方兵
                   if(board[i][j] == ('b'))
                   {
                       g.drawImage(hz, i * RATE + X_OFFSET, j * RATE + Y_OFFSET, null);
                   }
               }
           }
       }
   }
}