2014-11-06 59 views
-1

现在我正在开发在Java中的棋局,并已写在一个Java文件,整场比赛没有做子类,我希望我能得到一些帮助与象棋代码拆分为

我要分开所有的部分移动到一个新文件

有人可以告诉我该怎么做

这是它下面的整个文件被称为ChessFrame,

我需要帮助把所有的一块移动的单独的文件叫做ChessMovement.java

我已经tryed刚刚取出来的运动,但随后打破了所有我能真正做到与别人向我展示

ChessFrame.java

import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import javax.swing.*; 

public class ChessFrame extends JFrame implements MouseListener, MouseMotionListener { 

    JLayeredPane layeredPane; 
    JPanel chessBoard; 
    JLabel chessPiece; 
    int xAdjustment; 
    int yAdjustment; 
    int startX; 
    int startY; 
    int initialX; 
    int initialY; 
    JPanel panels; 
    JLabel pieces; 

    public ChessFrame() { 
     Dimension boardSize = new Dimension(600, 600); 

     // Use a Layered Pane for this application 
     layeredPane = new JLayeredPane(); 
     getContentPane().add(layeredPane); 
     layeredPane.setPreferredSize(boardSize); 
     layeredPane.addMouseListener(this); 
     layeredPane.addMouseMotionListener(this); 

     //Add a chess board to the Layered Pane 
     chessBoard = new JPanel(); 
     layeredPane.add(chessBoard, JLayeredPane.DEFAULT_LAYER); 
     chessBoard.setLayout(new GridLayout(8, 8)); 
     chessBoard.setPreferredSize(boardSize); 
     chessBoard.setBounds(0, 0, boardSize.width, boardSize.height); 

     for (int i = 0; i < 64; i++) { 
      JPanel square = new JPanel(new BorderLayout()); 
      chessBoard.add(square); 

      int row = (i/8) % 2; 
      if (row == 0) { 
       square.setBackground(i % 2 == 0 ? Color.white : Color.gray); 
      } else { 
       square.setBackground(i % 2 == 0 ? Color.gray : Color.white); 
      } 
     } 

     // Setting up the Initial Chess board. 
     for (int i = 8; i < 16; i++) { 
      pieces = new JLabel(new ImageIcon("WhitePawn.png")); 
      panels = (JPanel) chessBoard.getComponent(i); 
      panels.add(pieces); 
     } 
     pieces = new JLabel(new ImageIcon("WhiteRook.png")); 
     panels = (JPanel) chessBoard.getComponent(0); 
     panels.add(pieces); 
     pieces = new JLabel(new ImageIcon("WhiteKnight.png")); 
     panels = (JPanel) chessBoard.getComponent(1); 
     panels.add(pieces); 
     pieces = new JLabel(new ImageIcon("WhiteKnight.png")); 
     panels = (JPanel) chessBoard.getComponent(6); 
     panels.add(pieces); 
     pieces = new JLabel(new ImageIcon("WhiteBishup.png")); 
     panels = (JPanel) chessBoard.getComponent(2); 
     panels.add(pieces); 
     pieces = new JLabel(new ImageIcon("WhiteBishup.png")); 
     panels = (JPanel) chessBoard.getComponent(5); 
     panels.add(pieces); 
     pieces = new JLabel(new ImageIcon("WhiteKing.png")); 
     panels = (JPanel) chessBoard.getComponent(3); 
     panels.add(pieces); 
     pieces = new JLabel(new ImageIcon("WhiteQueen.png")); 
     panels = (JPanel) chessBoard.getComponent(4); 
     panels.add(pieces); 
     pieces = new JLabel(new ImageIcon("WhiteRook.png")); 
     panels = (JPanel) chessBoard.getComponent(7); 
     panels.add(pieces); 
     for (int i = 48; i < 56; i++) { 
      pieces = new JLabel(new ImageIcon("BlackPawn.png")); 
      panels = (JPanel) chessBoard.getComponent(i); 
      panels.add(pieces); 
     } 
     pieces = new JLabel(new ImageIcon("BlackRook.png")); 
     panels = (JPanel) chessBoard.getComponent(56); 
     panels.add(pieces); 
     pieces = new JLabel(new ImageIcon("BlackKnight.png")); 
     panels = (JPanel) chessBoard.getComponent(57); 
     panels.add(pieces); 
     pieces = new JLabel(new ImageIcon("BlackKnight.png")); 
     panels = (JPanel) chessBoard.getComponent(62); 
     panels.add(pieces); 
     pieces = new JLabel(new ImageIcon("BlackBishup.png")); 
     panels = (JPanel) chessBoard.getComponent(58); 
     panels.add(pieces); 
     pieces = new JLabel(new ImageIcon("BlackBishup.png")); 
     panels = (JPanel) chessBoard.getComponent(61); 
     panels.add(pieces); 
     pieces = new JLabel(new ImageIcon("BlackKing.png")); 
     panels = (JPanel) chessBoard.getComponent(59); 
     panels.add(pieces); 
     pieces = new JLabel(new ImageIcon("BlackQueen.png")); 
     panels = (JPanel) chessBoard.getComponent(60); 
     panels.add(pieces); 
     pieces = new JLabel(new ImageIcon("BlackRook.png")); 
     panels = (JPanel) chessBoard.getComponent(63); 
     panels.add(pieces); 
    } 

    private Boolean piecePresent(int x, int y) { 
     Component c = chessBoard.findComponentAt(x, y); 
     if (c instanceof JPanel) { 
      return false; 
     } else { 
      return true; 
     } 
    } 

    //Check if a piece is a Black piece. 
    private Boolean checkWhiteOponent(int newX, int newY) { 
     Boolean oponent; 
     Component c1 = chessBoard.findComponentAt(newX, newY); 
     JLabel awaitingPiece = (JLabel) c1; 
     String tmp1 = awaitingPiece.getIcon().toString(); 
     if (((tmp1.contains("Black")))) { 
      oponent = true; 
     } else { 
      oponent = false; 
     } 
     return oponent; 
    } 

    //Check if a piece is a White piece. 

    private Boolean checkBlackOponent(int newX, int newY) { 
     Boolean oponent; 
     Component c1 = chessBoard.findComponentAt(newX, newY); 
     JLabel awaitingPiece = (JLabel) c1; 
     String tmp1 = awaitingPiece.getIcon().toString(); 
     if (((tmp1.contains("White")))) { 
      oponent = true; 
     } else { 
      oponent = false; 
     } 
     return oponent; 
    } 

    public void mousePressed(MouseEvent e) { 
     chessPiece = null; 
     Component c = chessBoard.findComponentAt(e.getX(), e.getY()); 
     if (c instanceof JPanel) { 
      return; 
     } 

     Point parentLocation = c.getParent().getLocation(); 
     xAdjustment = parentLocation.x - e.getX(); 
     yAdjustment = parentLocation.y - e.getY(); 
     chessPiece = (JLabel) c; 
     initialX = e.getX(); 
     initialY = e.getY(); 
     startX = (e.getX()/75); 
     startY = (e.getY()/75); 
     chessPiece.setLocation(e.getX() + xAdjustment, e.getY() + yAdjustment); 
     chessPiece.setSize(chessPiece.getWidth(), chessPiece.getHeight()); 
     layeredPane.add(chessPiece, JLayeredPane.DRAG_LAYER); 
    } 

    public void mouseDragged(MouseEvent me) { 
     if (chessPiece == null) { 
      return; 
     } 
     chessPiece.setLocation(me.getX() + xAdjustment, me.getY() + yAdjustment); 
    } 

    public void mouseReleased(MouseEvent e) { 
     if (chessPiece == null) { 
      return; 
     } 

     chessPiece.setVisible(false); 
     Boolean success = false; 
     Component c = chessBoard.findComponentAt(e.getX(), e.getY()); 
     String tmp = chessPiece.getIcon().toString(); 
     String pieceName = tmp.substring(0, (tmp.length() - 4)); 
     Boolean validMove = false; 

//Pawn Moves 
//White Pawn 
     if (pieceName.equals("WhitePawn")) { 
      if (startY == 1) { 
       if ((startX == (e.getX()/75)) && ((((e.getY()/75) - startY) == 1) || ((e.getY()/75) - startY) == 2)) { 
        if ((((e.getY()/75) - startY) == 2)) { 
         if ((!piecePresent(e.getX(), (e.getY()))) && (!piecePresent(e.getX(), (e.getY() + 75)))) { 
          validMove = true; 
         } else { 
          validMove = false; 
         } 
        } else { 
         if ((!piecePresent(e.getX(), (e.getY())))) { 
          validMove = true; 
         } else { 
          validMove = false; 
         } 
        } 
       } else { 
        validMove = false; 
       } 
      } else { 
       int newY = e.getY()/75; 
       int newX = e.getX()/75; 
       if ((startX - 1 >= 0) || (startX + 1 <= 7)) { 
        if ((piecePresent(e.getX(), (e.getY()))) && ((((newX == (startX + 1) && (startX + 1 <= 7))) || ((newX == (startX - 1)) && (startX - 1 >= 0))))) { 
         if (checkWhiteOponent(e.getX(), e.getY())) { 
          validMove = true; 
          if (startY == 6) { 
           success = true; 
          } 
         } else { 
          validMove = false; 
         } 
        } else { 
         if (!piecePresent(e.getX(), (e.getY()))) { 
          if ((startX == (e.getX()/75)) && ((e.getY()/75) - startY) == 1) { 
           if (startY == 6) { 
            success = true; 
           } 
           validMove = true; 
          } else { 
           validMove = false; 
          } 
         } else { 
          validMove = false; 
         } 
        } 
       } else { 
        validMove = false; 
       } 
      } 
     } 
//Black Pawn 
     if (pieceName.equals("BlackPawn")) { 
      if (startY == 6) { 
       if ((startX == (e.getX()/75)) && ((((e.getY()/75) - startY) == -1) || ((e.getY()/75) - startY) == -2)) { 
        if ((((e.getY()/75) - startY) == -2)) { 
         if ((!piecePresent(e.getX(), (e.getY()))) && (!piecePresent(e.getX(), (e.getY() + 75)))) { 
          validMove = true; 
         } else { 
          validMove = false; 
         } 
        } else { 
         if ((!piecePresent(e.getX(), (e.getY())))) { 
          validMove = true; 
         } else { 
          validMove = false; 
         } 
        } 
       } else { 
        validMove = false; 
       } 
      } else { 
       int newY = e.getY()/75; 
       int newX = e.getX()/75; 
       if ((startX - 1 >= 0) || (startX + 1 <= 7)) { 
        if ((piecePresent(e.getX(), (e.getY()))) && ((((newX == (startX + 1) && (startX + 1 <= 7))) || ((newX == (startX - 1)) && (startX - 1 >= 0))))) { 
         if (checkBlackOponent(e.getX(), e.getY())) { 
          validMove = true; 
          if (startY == 1) { 
           success = true; 
          } 
         } else { 
          validMove = false; 
         } 
        } else { 
         if (!piecePresent(e.getX(), (e.getY()))) { 
          if ((startX == (e.getX()/75)) && ((e.getY()/75) - startY) == -1) { 
           if (startY == 2) { 
            success = true; 
           } 
           validMove = true; 
          } else { 
           validMove = false; 
          } 
         } else { 
          validMove = false; 
         } 
        } 
       } else { 
        validMove = false; 
       } 
      } 
     } 
     //End of Pawn Moves 
     //Knight Moves 
     //White Knight Code 
     else if (pieceName.contains("WhiteKnight")) { 

      // next we need to get the new coordinates for where the piece is being dropped. 
      int newY = e.getY()/75; 
      int newX = e.getX()/75; 

      // We need to make sure that the piece is being put back on the board...if its not being on 
      // the board why would we want to check anything else! 
      if (((newX < 0) || (newX > 7)) || ((newY < 0) || (newY > 7))) { 
       validMove = false; 
      } else { 

       if (((newX == startX + 1) && (newY == startY + 2)) || ((newX == startX - 1) && (newY == startY + 2)) || ((newX == startX + 2) && (newY == startY + 1)) || ((newX == startX - 2) && (newY == startY + 1)) || ((newX == startX + 1) && (newY == startY - 2)) || ((newX == startX - 1) && (newY == startY - 2)) || ((newX == startX + 2) && (newY == startY - 1)) || ((newX == startX - 2) && (newY == startY - 1))) { 
        validMove = true; 

        if (piecePresent(e.getX(), (e.getY()))) { 
         if (pieceName.contains("White")) { 
          if (checkWhiteOponent(e.getX(), e.getY())) { 
           validMove = true; 
          } else { 
           validMove = false; 
          } 
         } else { 
          if (checkBlackOponent(e.getX(), e.getY())) { 
           validMove = true; 
          } else { 
           validMove = false; 
          } 
         } 
        } 
       } else { 
        validMove = false; 
       } 
      } 
     } //Black Knight Code 
     else if (pieceName.contains("BlackKnight")) { 

        // next we need to get the new coordinates for where the piece is being dropped. 
      int newY = e.getY()/75; 
      int newX = e.getX()/75; 

        // We need to make sure that the piece is being put back on the board...if its not being on 
        // the board why would we want to check anything else! 
      if (((newX < 0) || (newX > 7)) || ((newY < 0) || (newY > 7))) { 
       validMove = false; 
      } else { 
       if (((newX == startX + 1) && (newY == startY + 2)) || ((newX == startX - 1) && (newY == startY + 2)) || ((newX == startX + 2) && (newY == startY + 1)) || ((newX == startX - 2) && (newY == startY + 1)) || ((newX == startX + 1) && (newY == startY - 2)) || ((newX == startX - 1) && (newY == startY - 2)) || ((newX == startX + 2) && (newY == startY - 1)) || ((newX == startX - 2) && (newY == startY - 1))) { 
        validMove = true; 

        if (piecePresent(e.getX(), (e.getY()))) { 
         if (pieceName.contains("Black")) { 
          if (checkBlackOponent(e.getX(), e.getY())) { 
           validMove = true; 
          } else { 
           validMove = false; 
          } 
         } else { 
          if (checkWhiteOponent(e.getX(), e.getY())) { 
           validMove = true; 
          } else { 
           validMove = false; 
          } 
         } 
        } 
       } else { 
        validMove = false; 
       } 
      } 
     } 
     //End of Knight Code 
     //Bishop Code 
     //White Bishup 
     else if (pieceName.contains("WhiteBishup")) { 
      int newY = e.getY()/75; 
      int newX = e.getX()/75; 
      boolean inTheWay = false; 
      int distance = Math.abs(startX - newX); 
      if (((newX < 0) || (newX > 7)) || ((newY < 0) || (newY > 7))) { 
       validMove = false; 
      } else { 
       validMove = true; 
       if (Math.abs(startX - newX) == Math.abs(startY - newY)) { 
        if ((startX - newX < 0) && (startY - newY < 0)) { 
         for (int i = 0; i < distance; i++) { 
          if (piecePresent((initialX + (i * 75)), (initialY + (i * 75)))) { 
           inTheWay = true; 
          } 
         } 
        } else if ((startX - newX < 0) && (startY - newY > 0)) { 
         for (int i = 0; i < distance; i++) { 
          if (piecePresent((initialX + (i * 75)), (initialY - (i * 75)))) { 
           inTheWay = true; 
          } 
         } 
        } else if ((startX - newX > 0) && (startY - newY > 0)) { 
         for (int i = 0; i < distance; i++) { 
          if (piecePresent((initialX - (i * 75)), (initialY - (i * 75)))) { 
           inTheWay = true; 
          } 
         } 
        } else if ((startX - newX > 0) && (startY - newY < 0)) { 
         for (int i = 0; i < distance; i++) { 
          if (piecePresent((initialX - (i * 75)), (initialY + (i * 75)))) { 
           inTheWay = true; 
          } 
         } 
        } 
        if (inTheWay) { 
         validMove = false; 
        } else { 
         if (piecePresent(e.getX(), (e.getY()))) { 
          if (pieceName.contains("White")) { 
           if (checkWhiteOponent(e.getX(), e.getY())) { 
            validMove = true; 
           } else { 
            validMove = false; 
           } 
          } else { 
           if (checkBlackOponent(e.getX(), e.getY())) { 
            validMove = true; 
           } else { 
            validMove = false; 
           } 
          } 
         } else { 
          validMove = true; 
         } 
        } 
       } else { // the move that is being tried is not a diagonal move... 
        validMove = false; 
       } 
      } 
     } //Black Bishup 
     else if (pieceName.contains("BlackBishup")) { 
      int newY = e.getY()/75; 
      int newX = e.getX()/75; 
      boolean inTheWay = false; 
      int distance = Math.abs(startX - newX); 
      if (((newX < 0) || (newX > 7)) || ((newY < 0) || (newY > 7))) { 
       validMove = false; 
      } else { 
       validMove = true; 
       if (Math.abs(startX - newX) == Math.abs(startY - newY)) { 
        if ((startX - newX < 0) && (startY - newY < 0)) { 
         for (int i = 0; i < distance; i++) { 
          if (piecePresent((initialX + (i * 75)), (initialY + (i * 75)))) { 
           inTheWay = true; 
          } 
         } 
        } else if ((startX - newX < 0) && (startY - newY > 0)) { 
         for (int i = 0; i < distance; i++) { 
          if (piecePresent((initialX + (i * 75)), (initialY - (i * 75)))) { 
           inTheWay = true; 
          } 
         } 
        } else if ((startX - newX > 0) && (startY - newY > 0)) { 
         for (int i = 0; i < distance; i++) { 
          if (piecePresent((initialX - (i * 75)), (initialY - (i * 75)))) { 
           inTheWay = true; 
          } 
         } 
        } else if ((startX - newX > 0) && (startY - newY < 0)) { 
         for (int i = 0; i < distance; i++) { 
          if (piecePresent((initialX - (i * 75)), (initialY + (i * 75)))) { 
           inTheWay = true; 
          } 
         } 
        } 
        if (inTheWay) { 
         validMove = false; 
        } else { 
         if (piecePresent(e.getX(), (e.getY()))) { 
          if (pieceName.contains("Black")) { 
           if (checkBlackOponent(e.getX(), e.getY())) { 
            validMove = true; 
           } else { 
            validMove = false; 
           } 
          } else { 
           if (checkWhiteOponent(e.getX(), e.getY())) { 
            validMove = true; 
           } else { 
            validMove = false; 
           } 
          } 
         } else { 
          validMove = true; 
         } 
        } 
       } else { // the move that is being tried is not a diagonal move... 
        validMove = false; 
       } 
      } 
     } 
     //End of Bishup Code 


//Changes to new pawn Piece and Validates Move 

    if(!validMove){ 
     int location=0; 
     if(startY ==0){ 
      location = startX; 
     } 
     else{ 
      location = (startY*8)+startX; 
     } 
     String pieceLocation = pieceName+".png"; 
     pieces = new JLabel(new ImageIcon(pieceLocation)); 
     panels = (JPanel)chessBoard.getComponent(location); 
     panels.add(pieces); 
    } 
    else{ 
     if(success){ 

      if (c instanceof JLabel){ 
       Container parent = c.getParent(); 
       parent.remove(0); 

       String promoteTo; 
       do { 
        promoteTo = (String) JOptionPane.showInputDialog(null, 
         "Promote Pawn to :", "Pawn Promotion", 
         JOptionPane.QUESTION_MESSAGE, null, 
         new String[]{"Queen", "Bishup", "Knight", "Rook"}, "Queen"); 
       } while (promoteTo == null); 
       String newPiece = null; 
       int location = 0; 
       if (pieceName.contains("White")) 
       { 
        location = 56 + (e.getX()/75); 
        newPiece = "White"+promoteTo; 
       } 
       else 
       { 
        location = (e.getX()/75); 
        newPiece = "Black"+promoteTo; 
       } 

       pieces = new JLabel(new ImageIcon(newPiece+".png")); 
       parent = (JPanel)chessBoard.getComponent(location); 
       parent.add(pieces); 
       validate(); 
       repaint(); 
      } 
     } 
     else{ 
      if (c instanceof JLabel){ 
       Container parent = c.getParent(); 
       parent.remove(0); 
       parent.add(chessPiece); 
      } 
      else { 
       Container parent = (Container)c; 
       parent.add(chessPiece); 
      } 
      chessPiece.setVisible(true); 
     } 
    } 
    } 

    public void mouseClicked(MouseEvent e) { 

    } 

    public void mouseMoved(MouseEvent e) { 
    } 

    public void mouseEntered(MouseEvent e) { 

    } 

    public void mouseExited(MouseEvent e) { 

    } 

    public static void main(String[] args) { 
     JFrame frame = new ChessFrame(); 
     frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
     frame.pack(); 
     frame.setResizable(true); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

任何帮助将是巨大的代码目前有没有错误但我不想再往前走直到我把它分离出来

感谢您的帮助

+1

这也已发布在代码审查:http://codereview.stackexchange.com/questions/68853/chess-architecture **并不是一个很好的适合任何网站** – 2014-11-06 13:58:19

回答

1

您需要创建一个Piece类,它具有所有类型的子类。然后创建一个PieceFactory.getPiece(pieceName,x pos,y pos,棋盘)来获取这些片段,并在其上实现一个move()方法,它将采用您的新位置,并执行所有验证。这留下了你的UI逻辑来渲染这些移动,但是将移动逻辑向下推入片段对象。

您稍后可能会更改此设置以创建ChessBoard对象,该对象将允许您通过它的x,y坐标获取一块,从而不知道该块的名称。 chessBoard.getPiece(x,y).move(newX,newY);这将允许你验证移动,加上处理捕获等,回电板去除对方棋子。

1

你混合的游戏逻辑与顾我元素。你应该使用MVC的概念。在这种状态下折射你的程序是一个不太具体的问题。

+0

我已经审查了这个概念并一直绕着圈子这根本没有用 – Jamiex304 2014-11-06 12:56:38

+2

@ Jamiex304你最近发布了几个有关这个国际象棋比赛的问题。这不会结束。您不能通过发布几百行代码来开发应用程序,然后希望其他人能够帮助您添加新功能。重构代码。在这种情况下,这意味着:重写它。从头开始。如果您不理解MVC的概念,那么您不能通过维护[Lava Flow](http://en.wikipedia.org/wiki/Lava_flow_%28programming%29) – Marco13 2014-11-06 13:02:53

+1

@ Jamiex304来提高编程技能,然后尝试询问具体的问题,你不明白的话题。我们不能帮助你,如果我们不知道,你不明白。 – Turing85 2014-11-06 13:16:54