게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
ㅂㅅㄱ) 자바로 체스게임을 만들고 있는데 조언 부탁합니다
게시물ID : programmer_9008짧은주소 복사하기
작성자 : KOTHAICHI
추천 : 0
조회수 : 1892회
댓글수 : 2개
등록시간 : 2015/03/31 01:40:52
옵션
  • 본인삭제금지
아직 프로그래밍에 대해 많이 이해를 못 해서 질문이 좀 횡설수설하고 장황할 수 있는 점 죄송합니다.

이번에 숙제로 자바로 플레이어가 콘솔창을 통해 할 수 있는 체스게임을 만드는 것에도전해야합니다. 그런데 잘 모르는 부분이 있네요.

특히 장기말들의 움직임에 대해 코드 짜는 게 힘듭니다.

1) 처음 숙제를 받았을 때, 먼저, Pawn, 보드, Display, Player, Piece, Pieces 등등의 클래스가 이미 주어져 있습니다.

예시로 주어진 Pawn 클래스의 코드가 

public class Pawn extends Piece {

  public Pawn (int ix, int iy, int c, Board b) {
    super(PieceCode.PAWN, ix, iy, c, b);
  }
  
  // method implements abstract method in Piece class
  public ArrayList<Move> availableMoves() {
    if (getColour()==PieceCode.WHITE) return whitePawn();
    else return blackPawn();
  }

  // method to return Vector of legal moves for a white pawn
  private ArrayList<Move> whitePawn() {
    int x = getX();
    int y = getY();
      
    // return null if the pawn is at the edge of the board, or if the
    // next move takes it out of range
    if (y==7) return null;
    if (getBoard().outOfRange(x,y+1)) return null;
      
    // otherwise create a new vector to store legal moves
    ArrayList<Move> v = new ArrayList<Move>();
      
    // set up m to refer to a Move object  
    Move m = null;
      
    // first legal move is to go from x,y to x,y+1 if x,y+1 is unoccupied  
    if (!getBoard().occupied(x,y+1)) {
      m = new Move(this, x,y,x,y+1,false);
      v.add(m);
    }
      
    // second legal move is to go from x,y to x+1,y+1 if x+1,y+1 is occupied 
    // by a black piece
    if (!getBoard().outOfRange(x+1, y+1)
       && getBoard().occupied(x+1, y+1)
       && (getBoard().getPiece(x+1, y+1).getColour()
           !=this.getColour())) {
       m = new Move(this, x,getY(),x+1,y+1,true);
       v.add(m);
    }
      
    // third legal move is to go from x,y to x-1,y+1 if x-1,y+1 is occupied 
    // by a black piece  
    if (!getBoard().outOfRange(x-1, y+1)
       && getBoard().occupied(x-1, y+1)
       && (getBoard().getPiece(x-1, y+1).getColour()
           !=this.getColour())) {
       m = new Move(this, x,y,x-1,y+1,true);
       v.add(m);
    }
      
    if (v.isEmpty()) return null;
    return v;
  }

이런 식으로 주어져 있고, 저는 이 형식을 빌려서 나머지 기사, 승려, 룩, 킹, 퀸 클래스 등등을 작성해야 합니다.

여기서 모르는 부분은 줄 쳐져 있는 부분입니다.

Move에 대한 클래스가 없어서 에러가 난다는 것은 알겠는데, 클래스의 constructor를 어떻게 작성해야하는 지 잘 모르겠습니다. (정확히는 주어진 contructor에 대해 해석이 안되요)

Move(this, x,y,x-1,y+1,true);, Move(this, x,y,x,y+1,false); 등등 이렇게 Move 클래스가 (String, int, int, int, int, boolean)으로 되어있지만 작성할 때마다 에러가 나서 어떻게 작성해야 하는 지 잘 모르겠습니다 (특히 저 false와 true의 의미는 아무리 생각해도 모르겠고요).


2) 글에는 없지만 예시로 주어진 Pawn 클래스 내에 whitePawn 과 코드는 완전히 같지만 이름만 다른 blackPawn 도 있습니다.

그런데 나머지 기사, 승려, 룩, 킹, 퀸 도 흑,백으로 나눠서 코드를 짤 필요가 있나요? 제 생각에는 Pawn은 한 방향으로 밖에 못 움직이니까 흑,백으로각각 나눠서 코드를 짰지만, 다른 말들은 흑이던 백이던 갈 수 있는 방향은 같으니까 차라리 하나로 통합해서 만드는 게 코드 길이도 줄일 수 있다고 생각하는 데 어떤가요?


3) Pawn이야 앞으로 한 칸씩 밖에 전진을 못 해서 x,y+1 식으로 움직이게 할 수 있지만, 나머지 장기말들은 다 방향으로, 어떤 말들은 한칸 이상씩 전진할 수 있잖아요?

그러면 예를들어 퀸 같은 경우 x축, y축, 대각선으로 모두 움직일 수 있는데, 설마 무식하게 x,y+1, x,y+2, x,y+3 이런 식으로 다 짜야 하는 건 아니겠죠? 제 생각으로는 각 방향으로 while 루프를 사용해서 다른 말에 막힐때까지 이동할 수 있다 라는 식으로 해볼까 하는 데 어떤가요?


구글신에도 여러번 검색을 하고 조사를 했으나, 다른 사람이 짠 코드를 이해하고 응용해서 제것을 만들어야 하다보니 도움 될만한 정보를 못 찾았네요.

질문에 대한 관련 웹사이트나 정보가 있으시다면 알려주시면 감사하겠습니다 (특히 첫번째 질문인 contructor관련)

전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호