체스 말을 Piece라고 하고 체스 보드를 ChessBoard라고 하면
ChessBoard는 당연히 Piece배열을 인자로 가질거고
Piece를 상속하는 개별적인 세부 클래스들인 Pawn Rook Knight 뭐 이런식으로 있겠지?
이 클래스 각각에 GenarateValidMoves 가상 메서드를 넣는게 맞잖아 세부 클래스별로 움직이는 방식이 다르니까
근데 이 가상메서드가 ValidMoves를 생성하려면 Board 정보를 인자로 받던가 해야하지? 보드 보고 정해지는 거니까
근데 그러면 ChessBoard도 Piece에 의존하고 Piece도 인자로 Board를 받으려면 ChessBoard에 의존하는거 아닌가요
그럼 상호의존적이게 되고 별로 안좋은 설계가 될거같은데
이걸 어떻게 바꿀수 있어요?
체스 말들은 패시브 엔티티 아니냐? 왜 액티브 앤티티처럼 지네들이 마음대루 움직이려구 해
말이 살짝 이해가 안되는데 무슨말이져 piece 자체가 스스로 움직이는게 아니니까 piece에 generateValidMoves 메서드는 딱히 필요가 없다는 건가요
그러면 수동적으로 움직이게 하려면 player나 board에 generateValidMoves 메서드가 필요한건가요? 말씀하신거 생각해서 단순 move 메서드는 board에서 하게 해 놨는데 generateValidMoves는 체스말별로 움직이는 방식이 다르고 말별로 고유한 능력이니까 piece에서 가상 메서드로 해결하는게 맞다고 생각했으요
generateCandidateMoves가 아닐까? 근데 딱히 정답은 없는거 같아성 ㅎㅎ
내가 생각했을 땐, 흑/백 움직이는 사용자가 있고, 그 사용자가 체스피스를 클릭하면 보드는 체스피스에 무빙 후보군을 받고, 그 다음에 보드가 무빙 후보군을 조작한 뒤에 사용자에게 유효한 움직임들을 리턴하면 되는거 아닐까?
결국 체스피스가 움직이는 방법은 각각 갖고 있겠지만, rule은 보드에 종속적인거 가틈
(그 사용자가 체스피스를 클릭하면 보드는 체스피스에 무빙 후보군을 받고,) -> 무빙 후보군이라는게 혹시 어떤 의미인지 알 수 있을까요
그럼 rule 클래스를 따로 만들어서 보드가 가지게 하는 방식으로 설계를 해봐도 괜찮겠다 싶네요 들어보니까
사용자가 체스피스를 클릭한다. -> 보드는 체스피스에게 너는 어디로 가기 위한 체스피스냐고 물어본다 -> 체스피스는 나이트라고 보드에게 말해준다 -> 보드는 1칸앞->대각선임을 알아냈다. -> 보드는 이 정보를 가지고 자신의 보드 크기 및 규칙을 고려하여 실제 체스피스가 움직일 수 있는 가능한 위치들을 계산한다. -> 보드는 이 피스가 어디에 갈 수 있는 피스임을 알려준다.
사용자(or AI)는 보드로부터 선택한 피스를 움직일 수 있는 가능한 위치를 받고 내부 알고리즘에 의해 체스를 움직인다.
상세한 설명 감사합니당 board에서 연산을 많이 처리해야겠네요 보니까 이해됐습다
체스보드는 피스를 알필요가 없지 멍청아 포인터 인자로 받아서만 사용해라 보드는 피스배열 포인터만 가지고잇는거다 전방선언으로 포함시키지는 말고
전방선언하는 것으로는 의존성이 안생기는건가요? 실제로 구현을 할 때는 인클루드 해야하니까 고민이었어요 전방선언이 약간 조삼모사라고 생각을 했었어서
개인 프로젝트라서 제가 모든 파일을 관리하니까 이런 생각이 드는걸까요 ㅋㅋㅋㅋㅋ 인터페이스(헤더파일)을 따로 공유하지를 않으니까
Cpp 와 헤더파일에 컴파일과정에대해서 이해허셔야함