Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

오잉또잉 체스게임 #6

Open
wants to merge 61 commits into
base: hanueleee
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 48 commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
ff4f19d
feat: remove web dependency
woowahan-neo Mar 13, 2023
1bab9ff
feat: add example for functional programming api example
woowahan-neo Mar 13, 2023
98598c0
chore: change package
woowahan-neo Mar 13, 2023
abee5c9
feat: Database 연결
Mar 14, 2023
4bbccbe
docs: 기능목록 작성
Mar 14, 2023
644808c
docs: 기능목록 수정
Mar 14, 2023
29390c8
feat: Position 구현
Mar 14, 2023
80458aa
feat: Position 검증 기능 추가
Mar 14, 2023
d902919
feat: Piece 추상 클래스 구현
Mar 15, 2023
fa15be0
feat: Piece 상속하는 King,Queen,Rook,Knight,Bishop,Pawn 추가
Mar 15, 2023
2e1eca1
feat: PieceFactory 기능 구현
Mar 15, 2023
14a6733
feat: Board 생성 구현
Mar 15, 2023
edaa59a
feat: Board 초기화 구현
Mar 15, 2023
f482756
refactor: 패키지 이동
Mar 15, 2023
467627d
feat: InputView 구현
Mar 15, 2023
c7a7db4
feat: CommandLine 구현
Mar 15, 2023
232fe0a
fix: Board 초기화 오류 해결
Mar 15, 2023
cc72eb0
feat: Board에 Piece리스트를 반환하는 메서드 구현
Mar 15, 2023
c3f340b
feat: Piece에 타입 필드 추가
Mar 15, 2023
e79765c
feat: ChessGame 구현
Mar 15, 2023
31c776d
feat: PieceMapper 구현
Mar 15, 2023
34b9b80
feat: BoardDto 구현
Mar 15, 2023
a5f3e86
feat: 체스보드 출력 구현
Mar 15, 2023
d174cd9
feat: ChessController 구현
Mar 15, 2023
8dae288
feat: Application 구현
Mar 15, 2023
83915ae
feat: 해당 좌표의 피스를 구하는 기능 구현
Mar 16, 2023
f6e8145
feat: 좌표에서 또다른 좌표로 방향 구하는 로직 구현
Mar 16, 2023
6d814c7
feat: 좌표에서 방향 더하는 연산 추가
Mar 16, 2023
a256899
feat: 이동 경로 상에 다른 피스가 있는지 확인하는 기능 구현
Mar 16, 2023
03d5ca7
feat(Board): 목적지에 같은 색깔 피스가 있는지 확인하는 기능 구현
Mar 16, 2023
4c810b1
feat(Board): 피스 위치 이동 기능 구현
Mar 16, 2023
0acc0ba
mission: 미션1 구현
Mar 17, 2023
cfd6765
mission: 미션2 구현
Mar 17, 2023
0ad7f2f
mission: 미션3 구현
Mar 17, 2023
5ce5dc3
feat: 보드에서 말 이동 검증 구현
Mar 17, 2023
b6a8808
feat(Piece): 피스들 구현
Mar 17, 2023
053604f
feat(Position): 거리 계산하는 로직 구현
Mar 17, 2023
7c9622e
feat(Game): 검증 후 이동하는 로직 구현
Mar 17, 2023
4cd77f2
feat(GameStatus): 게임 상태 관리 기능 구현
Mar 17, 2023
fc66c75
feat: 게임 전체 로직 조합
Mar 17, 2023
a869608
style(View): 출력 문구 수정
Mar 17, 2023
e83eb59
refactor(BoardDto): 게임 대신 보드를 주입하는 방식으로 수정
Mar 17, 2023
31e0fe7
feat(OutputView): 에러 메세지 출력 기능 구현
Mar 17, 2023
a0bc8fe
refactor(Controller): 메서드 정리 및 게임 턴 책임 분리
Mar 17, 2023
c6f5f35
refactor(EmptyPiece): 빈 피스 실행 예외 처리
Mar 17, 2023
df8cd7a
refactor: 코드 정리
Mar 17, 2023
ecfc8b6
refactor(Board): 보드 리펙토링
Mar 17, 2023
d6a8ff7
refactor(Game): 게임 리펙토링
Mar 17, 2023
8f8d542
refactor: this 제거
hanueleee Mar 20, 2023
d7d310e
refactor(PieceMapper): if 대신 Map을 사용하여 분기 줄이기
hanueleee Mar 20, 2023
2e37b07
refactor(Piece): 모든 Piece 상속 클래스들의 생성자 로직을 정적 팩토리 메서드 내부로 이동(생성자 단순화)
hanueleee Mar 20, 2023
22384af
refactor(Position): 위치 간의 방향을 계산하는 로직 수정
hanueleee Mar 20, 2023
dfe166c
refactor: 에러 메시지 상수 해제
hanueleee Mar 20, 2023
14ddc61
refactor(dto): BoardDto의 책임을 RankDto와 분배
hanueleee Mar 20, 2023
1b6daee
refactor(view): 시작 메시지를 각각 단일 상수화
hanueleee Mar 20, 2023
c7612a3
refactor: 패키지 정리
hanueleee Mar 20, 2023
bec77c8
test: PieceMapper 테스트
hanueleee Mar 20, 2023
6481479
refactor(Board): getPiecesAt -> findAllByRank 메소드명 수정 및 stream 제거
hanueleee Mar 21, 2023
d0f7612
refactor(ChessController): 정확한 예외클래스 지정
hanueleee Mar 21, 2023
2ba065c
refactor(Color): static메소드 해제
hanueleee Mar 21, 2023
7e54715
refactor: 메소드 순서 정리, 코드 중복 제거
hanueleee Mar 21, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 58 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,62 @@
# java-chess

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

와 commit 보고 벌써 4단계 DB연결 다한줄 ㄷㄷ

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

킥 킥 어림도 없지


체스 미션 저장소
# 기능 목록

## 우아한테크코스 코드리뷰
## 도메인

- [온라인 코드 리뷰 과정](https://github.com/woowacourse/woowacourse-docs/blob/master/maincourse/README.md)
### 좌표

- [x] 좌표는 file과 rank를 필드로 가진다.
- [x] 좌표는 (A,1) ~ (H,8) 까지 가능
- [x] 좌표는 다른 좌표로의 방향을 구할 수 있다.

### 피스

- [x] 자신의 진영을 필드로 가지고 있다.
- [x] 움직일 수 있는지 검증
- [x] 폰
- [x] 나이트
- [x] 룩
- [x] 비숍
- [x] 퀸
- [x] 킹

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

좀 구체적으로 적어주세요

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

왜여 >< 다 알자나


### 체스판

- [x] 빈 보드를 생성
- [x] 좌표를 입력으로 주었을때, 좌표의 피스를 반환(getPiece)
- [x] 좌표에 피스가 존재하는지 확인
- [x] 같은 색깔 피스 인지 확인.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

확인.

- [x] 피스를 교체(replace)
- [x] 두 좌표를 주었을때, 두 좌표 사이에 피스가 있는지 검증(checkBetweenRoute)
- [x] 목적지에 같은 색깔의 피스가 있는지 확인(checkSameColor)
- [x] 폰이 움직일 수 있는지 확인(checkRestrictionForPawn)
- [x] 대각선으로 움직일때, 상대편 피스가 있는지 확인
- [x] 위,아래 방향으로 움직일때, 칸이 비어있지 않은지 확인

### 피스 팩토리

- [x] 색상에 따라 초기 피스들의 리스트를 반환

### 랭크 : 가로줄을 나타내는 enum

### 파일 : 세로줄을 나타내느 enum
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

느 -> 는 오타입니다~

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아차차~


### 게임

- [x] 체스판을 초기화
- [x] 피스를 이동

### 명령

- [x] 입력받은 명령를 검증(start,end,move)

## UI

### 입력

- [x] 명령어를 입력

### 출력

- [x] 체스판을 출력
4 changes: 1 addition & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,9 @@ repositories {
}

dependencies {
implementation 'com.sparkjava:spark-core:2.9.3'
implementation 'com.sparkjava:spark-template-handlebars:2.7.1'
implementation 'ch.qos.logback:logback-classic:1.2.10'
testImplementation 'org.assertj:assertj-core:3.22.0'
testImplementation 'org.junit.jupiter:junit-jupiter:5.8.2'
runtimeOnly 'mysql:mysql-connector-java:8.0.28'
}

java {
Expand Down
13 changes: 13 additions & 0 deletions src/main/java/chess/Applictaion.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package chess;

import chess.controller.ChessController;
import chess.view.InputView;
import chess.view.OutputView;

public class Applictaion {

public static void main(String[] args) {
ChessController chessController = new ChessController(new InputView(), new OutputView());
chessController.execute();
}
}
61 changes: 61 additions & 0 deletions src/main/java/chess/CommandLine.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package chess;

import java.util.List;

public class CommandLine {

private static final String INVALID_COMMAND_ERROR_MESSAGE = "잘못된 명령어입니다.";
private static final String INVALID_ARGUMENT_ERROR_MESSAGE = "는 인자를 입력할 수 없습니다.";
private static final String INVALID_ARGUMENT_COUNT_ERROR_MESSAGE = "는 인자를 2개만 가질 수 있습니다.";
private static final String NO_ARGUMENT_ERROR_MESSAGE = "인자를 반환할 수 없는 명령입니다.";

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

굳이 메세지를 상수가 할 필요가 있었어?
오히려 더 파악하기 힘든 것 같아

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ㅇㅈ

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

동의. 수정하겠삼 ㅎㅎㅎ

private static final String START = "start";
private static final String MOVE = "move";
private static final String END = "end";
private static final int ZERO_ARGUMENT_SIZE = 1;
private static final int TWO_ARGUMENT_SIZE = 3;
private static final int SOURCE_INDEX = 1;
private static final int TARGET_INDEX = 3;
private static final List<String> VALID_COMMANDS = List.of(START, MOVE, END);
private final List<String> tokens;

public CommandLine(final List<String> tokens) {
this.validate(tokens);
this.tokens = tokens;
}

private void validate(final List<String> tokens) {
String command = tokens.get(0);
if (!VALID_COMMANDS.contains(command)) {
throw new IllegalArgumentException(INVALID_COMMAND_ERROR_MESSAGE);
}
if (!command.equals(MOVE) && tokens.size() != ZERO_ARGUMENT_SIZE) {
throw new IllegalArgumentException(command + INVALID_ARGUMENT_ERROR_MESSAGE);
}
if (command.equals(MOVE) && tokens.size() != TWO_ARGUMENT_SIZE) {
throw new IllegalArgumentException(command + INVALID_ARGUMENT_COUNT_ERROR_MESSAGE);
}
}

public List<String> getArguments() {
if (this.tokens.size() != TWO_ARGUMENT_SIZE) {
throw new IllegalStateException(NO_ARGUMENT_ERROR_MESSAGE);
}
return this.tokens.subList(SOURCE_INDEX, TARGET_INDEX);
}

public boolean isStart() {
return START.equals(this.getCommand());
}

public String getCommand() {
return this.tokens.get(0);
}

public boolean isMove() {
return MOVE.equals(this.getCommand());
}

public boolean isEnd() {
return END.endsWith(this.getCommand());
}
}
7 changes: 7 additions & 0 deletions src/main/java/chess/GameStatus.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package chess;

public enum GameStatus {
START,
END,
MOVE

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

땀 안흘리고 끝나도 되나요?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

엥 그러게 얘말고도 다른 enum도 땀 안붙였는데 잘돌아가네 왤까,, 일단 수정했슴당

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

image

오호 enum내에 따로 로직 없으면 땀 안붙여도 되는듯

}
22 changes: 0 additions & 22 deletions src/main/java/chess/WebApplication.java

This file was deleted.

39 changes: 39 additions & 0 deletions src/main/java/chess/controller/BoardDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package chess.controller;

import chess.domain.Board;
import chess.domain.piece.Piece;
import chess.domain.position.Rank;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class BoardDto {

private final List<String> stringPieces;

private BoardDto(final List<String> pieces) {
this.stringPieces = pieces;
}

public static BoardDto create(Board board) {
List<String> stringPieces = new ArrayList<>();
for (Rank rank : Rank.values()) {
String stringRank = makeStringRank(board, rank);
stringPieces.add(stringRank);
}
Collections.reverse(stringPieces);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

?!! 왜 굳이 만들고 reverse를 한거죠??
출력 순서 때문이라면 처음부터 순서에 맞게 넣는게 좋지 않을까요?

return new BoardDto(stringPieces);
}

private static String makeStringRank(final Board board, final Rank rank) {
StringBuilder builder = new StringBuilder();
for (Piece piece : board.getPiecesAt(rank)) {
builder.append(PieceMapper.map(piece));
}
return builder.toString();
}

public List<String> getStringPieces() {
return this.stringPieces;
}
}
52 changes: 52 additions & 0 deletions src/main/java/chess/controller/ChessController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package chess.controller;

import chess.CommandLine;
import chess.domain.ChessGame;
import chess.view.InputView;
import chess.view.OutputView;

public class ChessController {


private final InputView inputView;
private final OutputView outputView;

public ChessController(final InputView inputView, final OutputView outputView) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

굳이 주입해준 이유가 있을까?
static으로 사용해 보는건 어때?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

말랑 근데 static으로 사용하는 거의 단점은 없나?
당장 InputView가 여러가지로 가능한게 아니니 필요 없으려나??

Copy link
Author

@hanueleee hanueleee Mar 20, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. 주입하기
  2. 주입안하고 그냥 생성자에서 알아서 초기화
  3. static으로 사용

이 셋 중 아무거나 쓰는 편
말랑이 3을 선호하는 이유는?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@hanueleee
@eunkeeee
테스트할 것도 아니고 그냥 컨크롤러에서만 편하게 쓸건데 굳이 주입을 할 필요가 있어?
회면이 바뀔 것도 아니니까?

this.inputView = inputView;
this.outputView = outputView;
}

public void execute() {
this.outputView.printGameStartMessage();
ChessGame chessGame = new ChessGame();
while (!chessGame.isGameEnd()) {
this.runGame(chessGame);
}
}

private void runGame(final ChessGame chessGame) {
try {
CommandLine commandLine = this.getCommandLine();
this.handleCommandLine(chessGame, commandLine);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

handle 이름이 쪽금 모호한거같아

this.outputView.printBoard(BoardDto.create(chessGame.getBoard()));
} catch (Exception e) {
this.outputView.printError(e.getMessage());
}
}

private CommandLine getCommandLine() {
return new CommandLine(this.inputView.readCommand());
}

private void handleCommandLine(final ChessGame chessGame, final CommandLine commandLine) {
if (commandLine.isStart()) {
chessGame.start();
}
if (commandLine.isMove()) {
chessGame.move(commandLine.getArguments());
}
if (commandLine.isEnd()) {
chessGame.end();
}
}
}
36 changes: 36 additions & 0 deletions src/main/java/chess/controller/PieceMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package chess.controller;

import chess.domain.piece.Piece;
import chess.domain.piece.PieceType;

public class PieceMapper {

public static String map(Piece piece) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Map<Type, String>을 쓰면 분기를 줄일 수 있을 것 같아

String defaultPiece = "";
if (piece.getType() == PieceType.EMPTY) {
return ".";
}
if (piece.getType() == PieceType.PAWN) {
defaultPiece = "p";
}
if (piece.getType() == PieceType.BISHOP) {
defaultPiece = "b";
}
if (piece.getType() == PieceType.KNIGHT) {
defaultPiece = "n";
}
if (piece.getType() == PieceType.ROOK) {
defaultPiece = "r";
}
if (piece.getType() == PieceType.QUEEN) {
defaultPiece = "q";
}
if (piece.getType() == PieceType.KING) {
defaultPiece = "k";
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

다음과 같이 맵을 사용하면 많은 분기를 줄일 수 있을 것 같아 👍

private static filnal Map<PieceType, String> Mapper = Map.of(
    PieceType.PAWN, "p"
)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아뭐야 똑같은말했네용

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오 그렇네 감사링

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

친절했다 ㄷㄷ

if (!piece.isWhite()) {
return defaultPiece.toUpperCase();
}
return defaultPiece;
}
}
Loading