2015-02-20 3 views
0

Я пытаюсь создать простую шахматную программу, и при реализации продвижения пешки возникла небольшая проблема. У меня есть класс абстрактного класса и 6 классов (король, королева, ладья, рыцарь, епископ и пешка), расширяющие его. Поэтому, когда пешка доходит до другого конца доски, я хочу, чтобы он изменился, чтобы сказать королеву.Повторное использование этого «обхода»

Самый простой бы сделать что-то вроде этого:

Public class Pawn extends Piece { 
... 
    @Override 
    public void move(int toCol, int toRow) { 
    this.col = toCol; this.row = toRow; 
    if (toRow == endRow) 
     this = (Queen)this 
    } 
} 

что, очевидно, невозможно, так как можно просто не назначить это.

Так что мне нужно обнаружить продвижение и бросить его извне. Но по некоторым причинам я дважды хранил конфигурацию. Как 2D-массив пьес, но и как 2 списка частей каждого игрока. Это означает, что мне нужно найти пешку в списке и удалить ее, а затем добавить новую королеву с одинаковыми координатами, а затем назначить ее на доску [col] [row].

Я хотел бы знать, есть ли более хороший способ сделать это. Как-то изменить класс объекта из «внутри».

+0

Изменение типа объекта объекта для экземпляра объекта - это не то, что позволяет Java. Вместо этого вы можете убрать экземпляр пешки и заменить его новым экземпляром Queen. Или ... у вас может быть перечисление, представляющее тип и переменную-член, чтобы удерживать его в классе Piece и переключать тип таким образом ... –

+1

Вы понимаете, что означает литье? Ссылки на объекты кастинга никоим образом не преобразуют объекты из одного типа в другой, поэтому вы не можете использовать это для преобразования объекта 'Pawn' в объект' Queen'. Единственное, что делает casting, это сказать компилятору, что вы хотите временно отключить проверку типов. Проверка будет выполняться во время выполнения, а когда это произойдет, вы получите «ClassCastException». – Jesper

+1

В принципе, вы можете заменить свой мини-легковой автомобиль внедорожником, но вы не можете изменить мини-внедорожник. – RealSkeptic

ответ

1

Прежде всего, вы, вероятно, не должны использовать разные классы для своих разных предметов. Это то, что кажется в каждой объектно-ориентированной книге и действительно не имеет смысла. Тем более, что вы говорите об этом move снаружи.

Я бы просто написал его как один класс с переменной перечислимого числа type и просто переназначил это до QUEEN от PAWN.

Например, вот что это могло бы выглядеть.

public class Piece{ 
    public static enum ChessType{PAWN, ROOK, BISHOP, KNIGHT, QUEEN, KING;} 
    private ChessType type; 
    ... 
    public void move(int toCol, int toRow) { 
     switch(type){ 
      case PAWN: 
      this.col = toCol; this.row = toRow; 
      if (toRow == endRow) 
       this = (Queen)this; 
      } 
      break; 
      ... //Handle the rest 
     } 
    } 
    ... 
} 
5

Я не понимаю, чего вы хотите достичь. Если вы моделируете после физического chessgame, ваша пешка упала, а вместо этого используется другая шахматная фигура. Таким образом, пешка removed с вашего игрового поля, а королева - inserted на прежней позиции пешек. You can not simply change the class of an instance.

-1

Вы можете сделать свой метод возвращенным перемещенным предметом. Что-то вроде

@Override 
public Piece move(int toCol, int toRow) { 
    if (toRow == endRow) { 
     return new Queen(toCol, toRow); 
    } 
    return new Pawn(toCol, toRow); 
    } 

Таким образом, вы могли бы сделать ваш Piece объект неизменен.

Смежные вопросы