2016-09-11 4 views
0

Я создаю шахматную игру, и я только что закончил базовый Ai, но всякий раз, когда кусок берется, он исчезает и возвращается через несколько поворотов позже. Кусок не должен даже быть в списке, который отображает фигуры. Это класс воздающий/добавляет/устанавливает новые частиКуски не снимаются при съемке

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

вставить соответствующий код вместо image .. – 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 – TheGamerPlayz

+0

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

+0

Я согласен, что этого не должно быть. Но это ясно. Я предлагаю поставить точку останова, когда это исключение выбрано и выполняется через отладчик. –