2016-09-11 3 views
0

체스 게임을 만들면서 방금 기본 아이를 완성했습니다. 조각을 가져갈 때마다 사라지고 다시 몇 차례 돌아옵니다. 조각은 조각을 렌더링하는 목록에 없어야합니다. 이는//이 추가 렌더링하는 클래스입니다촬영했을 때 조각이 제거되지 않습니다

setPieceLoc()가 새로운 위치에 이전 조각을 설정하고 모두 original 모든 목록에서 newLoc을 제거하는 새로운 조각을 설정합니다. 왜 이런 일이 발생하는지 알 수 있습니까? 목록에 새로운 정보를 추가하는 다른 클래스는 없으므로 여기서 오류가 있어야 함을 알 수 있습니다.

package me.xthegamerplayz.FirstGame.board; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Point; 

import me.xthegamerplayz.FirstGame.board.tiles.ChessImages; 
import me.xthegamerplayz.FirstGame.rules.LegalMoves; 

public class Board { 

    public static void addPiece(int x, int y, int piece) { 

     Point point = new Point(); 
     point.setLocation(x, y); 

     if(piece > 16) 
      ChessBoard.black.put(point, piece); 
     else 
      ChessBoard.white.put(point, piece); 
    } 

    public static void setPieceLoc(Point original, Point newLoc) { 
     int piece = 8; 
     if(ChessBoard.white.containsKey(original)) 
      piece = ChessBoard.white.get(original); 
     else if(ChessBoard.black.containsKey(original)) 
      piece = ChessBoard.black.get(original); 

     //Remove piece at newLoc 
     if(ChessBoard.white.containsKey(newLoc)) 
      ChessBoard.white.remove(newLoc); 
     else if(ChessBoard.black.containsKey(newLoc)) 
      ChessBoard.black.remove(newLoc); 

     //Remove piece from previous location 
     if(ChessBoard.white.containsKey(original)) 
      ChessBoard.white.remove(original); 
     else if(ChessBoard.black.containsKey(original)) 
      ChessBoard.black.remove(original); 

     if(piece > 16) 
      ChessBoard.black.put(newLoc, piece); 
     else 
      ChessBoard.white.put(newLoc, piece); 
    } 

    public void registerPieces() { 
     //Pawns 
     for(int x = 0; x < 8; x++) { 
      addPiece(x, 1, 8); 
      addPiece(x, 6, 24); 
     } 
     //White 
     addPiece(0, 0, 9); 
     addPiece(1, 0, 10); 
     addPiece(2, 0, 11); 
     addPiece(5, 0, 11); 
     addPiece(6, 0, 10); 
     addPiece(7, 0, 9); 

     addPiece(4, 0, 12); 
     addPiece(3, 0, 13); 

     //Black 
     addPiece(0, 7, 25); 
     addPiece(1, 7, 26); 
     addPiece(2, 7, 27); 
     addPiece(5, 7, 27); 
     addPiece(6, 7, 26); 
     addPiece(7, 7, 25); 

     addPiece(3, 7, 28); 
     addPiece(4, 7, 29); 

    } 

    public void render(Graphics g) { 

     for(Point point : ChessBoard.white.keySet()) { 

      int piece = ChessBoard.white.get(new Point(point)); 
      int x = (int) (point.getX()*64) + 20; 
      int y = (int) (point.getY()*64) + 20; 

      boolean showTiles = false; 
      if(showTiles) { 
       if(piece == 24) { 
        LegalMoves lm = new LegalMoves(point); 

        for(Point p : lm.moves()) { 

         int bx = (int) (p.getX()*64) + 20; 
         int by = (int) (p.getY()*64) + 20; 
         g.setColor(Color.green); 
         g.fillRect(bx, by, 64, 64); 
        } 
       } 
      } 

      g.drawImage(ChessImages.getPieceImage(piece), x, y, null); 
     } 

     for(Point point : ChessBoard.black.keySet()) { 

      int piece = ChessBoard.black.get(new Point(point)); 
      int x = (int) (point.getX()*64) + 20; 
      int y = (int) (point.getY()*64) + 20; 

      boolean showTiles = false; 
      if(showTiles) { 
       if(piece == 24) { 
        LegalMoves lm = new LegalMoves(point); 

        for(Point p : lm.moves()) { 

         int bx = (int) (p.getX()*64) + 20; 
         int by = (int) (p.getY()*64) + 20; 
         g.setColor(Color.green); 
         g.fillRect(bx, by, 64, 64); 
        } 
       } 
      } 

      g.drawImage(ChessImages.getPieceImage(piece), x, y, null); 
     } 

    } 

} 
+0

내가 오히려 코드에 대한 링크보다 문제의 코드를 게시 제안 할 수 있습니다를, 당신 대신 그 방법 – smoggers

+0

붙여 넣기 관련 코드를 도움을받을 가능성이 더 높습니다 이미지 .. – SMA

+0

게시 할 비트이고 이미지가 아닙니다.하지만 확인하십시오. – TheGamerPlayz

답변

0

비어있는 곳에서 움직이는 것처럼 보입니다.

원본이 검은 색 또는 흰색지도에없는 경우에는 흰색 폰처럼 보이는 조각 8을 사용합니다. 그것은 비디오에서 다시 나타나는 조각입니다.

빈 사각형에서 조각을 움직이는 것이 의미가 없기 때문에 예외가 발생해야합니다. 이렇게하면 당신은 상황에있는 이런 일이 디버깅하는 데 도움이 될 것입니다

if(ChessBoard.white.containsKey(original)) 
    piece = ChessBoard.white.get(original); 
else if(ChessBoard.black.containsKey(original)) 
    piece = ChessBoard.black.get(original); 
else 
    throw new IllegalArgumentException("Attempting to move piece from empty square " + original); 
+0

나는 그렇게했고 그것이 던져지고있다. 그러나 AI는 결코 목록에없는 위치를 잡아서는 안된다. . 여기에 AI – TheGamerPlayz

+0

http://hastebin.com/ejirokudih.avrasm – TheGamerPlayz

+0

동의하지 않아야합니다. 그러나 그것은 분명합니다. 그 예외가 던져지고 디버거를 통해 실행되는 중단 점을 두는 것이 좋습니다. –

관련 문제