java象棋

/* @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);
                   }
               }
           }
       }
   }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章