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

step 34 로빈 #19

Open
wants to merge 45 commits into
base: robinjoon
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
e14d046
docs: 3단계 요구사항 및 기능 목록 작성
robinjoon Mar 25, 2024
c4e7d04
feat: 각 말의 점수 계산 기능 구현
robinjoon Mar 25, 2024
a662948
feat: 각 팀의 점수 계산 기능 구현
robinjoon Mar 25, 2024
af2b481
refactor: 메서드 분리
robinjoon Mar 25, 2024
0178b17
feat: 점수 조회 명령어 입력 기능 및 점수 출력 기능 구현
robinjoon Mar 25, 2024
21e862d
docs: 기능 목록 추가
robinjoon Mar 25, 2024
1555f41
feat: 종료 조건 구현
robinjoon Mar 25, 2024
f53bdad
refactor: 메서드 이름 변경 및 todo 작성
robinjoon Mar 25, 2024
a1e44b4
refactor: 각 팀의 포인트를 계산하는 책임을 ChessBoard 로부터 분리
robinjoon Mar 26, 2024
ab168a5
refactor: 메서드 분리
robinjoon Mar 26, 2024
b7a9641
refactor: 메서드 분리
robinjoon Mar 26, 2024
1ecd871
test: 잘못된 테스트 수정
robinjoon Mar 26, 2024
4c3c846
feat: 점수 출력 시 현재 이기고 있는 팀 출력하는 기능 구현
robinjoon Mar 26, 2024
07192b3
fix: 명령어 예시 출력 수정
robinjoon Mar 26, 2024
96b6e56
refactor: 패키지 구조 변경
robinjoon Mar 26, 2024
f7f9d51
refactor: ChessBoard 와 ChessGame 사이에 어뎁터 추가
robinjoon Mar 26, 2024
9e2e7a8
refactor: ChessGame이 한번에 모든 팀의 점수를 계산하도록 수정
robinjoon Mar 26, 2024
de4004e
docs: 저장해야 하는 데이터가 무엇인지 정리
robinjoon Mar 27, 2024
20bccc8
docs: 테이블 스키마 정리
robinjoon Mar 28, 2024
7bf1c69
docs: 데이터베이스 관련 기능 목록 추가
robinjoon Mar 28, 2024
f497762
feat: 기물을 저장하는 기능 구현
robinjoon Mar 28, 2024
20f434b
feat: 턴을 저장하는 기능 구현
robinjoon Mar 28, 2024
d8a4124
feat: 데이터베이스에 저장된 게임을 불러오는 기능 구현
robinjoon Mar 28, 2024
26e55ca
refactor: 데이터베이스 관련 기능 Service로 분리
robinjoon Mar 29, 2024
aabd4ad
chore: 클래스 이름 명확하게 수정
robinjoon Mar 29, 2024
119eb97
style: 코드 스타일에 맞게 수정
robinjoon Mar 29, 2024
854e4fe
chore: 삭제하지 않은 ToDo 삭제
robinjoon Mar 29, 2024
c0d0554
fix: 구현이 누락된 메서드 추가
robinjoon Mar 29, 2024
79f65b2
refactor: 메서드 반환 타입 변경
robinjoon Mar 29, 2024
53d8499
refactor: 메서드 분리
robinjoon Mar 29, 2024
564e2ed
docs: 4단계 피드백 반영 예정 내용 정리
robinjoon Mar 30, 2024
8dcf91e
fix: 킹이 잡히는 경우 실제로 킹이 보드에서 삭제되지 않는 부분 수정
robinjoon Mar 30, 2024
36d14d8
docs: 수정해야 하는 버그 문서에 추가
robinjoon Mar 30, 2024
af36b71
feat: 트랜잭션 적용
robinjoon Mar 30, 2024
6e32f42
!refactor: TurnDAO에서 비즈니스 로직 삭제
robinjoon Mar 30, 2024
b74ed21
fix: DB 관련 예외 발생 시 구체적인 예외를 던지도록 수정
robinjoon Mar 30, 2024
902fb55
refactor: DAO에 boolean을 반환하는 메서드 추가
robinjoon Apr 1, 2024
9130731
docs: 초기 sql 추가
robinjoon Apr 1, 2024
2e61cc3
feat: end 커멘드 입력시 예외 발생하며 종료되는 것 수정
robinjoon Apr 1, 2024
83c7b62
test: DAO 테스트 추가
robinjoon Apr 1, 2024
1fa4710
test: 테스트 코드 오류 수정
robinjoon Apr 1, 2024
831f54b
fix: 킹이 잡힌 경우 데이터를 초기화하도록 수정
robinjoon Apr 1, 2024
5ac321e
fix: 폰이 데이터베이스에서 로드된 뒤에 폰이 2칸 움직일 수 있는 버그 수정
robinjoon Apr 1, 2024
b307ff7
refactor: 점수 계산 테스트 위치 변경
robinjoon Apr 1, 2024
143b637
docs: docker-compose.yml 추가
robinjoon Apr 1, 2024
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
97 changes: 97 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,21 @@
- 단, 폰은 이동할 수 있는 위치에 상대 진영의 말이 있는 경우, 그 위치로 이동할 수 없다.
6. 체스 말이 이동할 수 있는 위치에 같은 진영의 말이 있는 경우, 그 위치로 이동할 수 없다.

### 게임 종료 조건

1. 킹이 잡히는 팀이 게임에서 진다. 킹이 잡히 게임이 종료된다.

### 점수

1. 각 팀에는 점수가 있다. 팀의 점수는 살아있는 체스 말의 점수의 합이다.
2. 각 말의 점수는 다음과 같다.
- 퀸 : 9점
- 룩 : 5점
- 비숍 : 3점
- 나이트 : 2.5점
- 폰 : 1점
- 같은 세로 위치에 같은 색의 폰이 여러개 있는 경우, 그 폰들은 점수가 0.5점이다.

## 기능 목록

- [x] 체스 말
Expand All @@ -48,10 +63,92 @@
- [x] 체스 보드
- [x] 올바른 턴인지 확인한다
- [x] 잡힌 말을 제거한다
- [x] 종료 조건
- [x] 킹이 잡히면 게임이 종료되는 기능
- [x] 점수
- [x] 각 말의 점수 계산 기능
- [x] 폰의 점수 보정 기능
- [x] 각 팀의 점수 계산 기능
- [x] 사용자 입력 기능
- [x] 이동 위치 명령어 입력 기능
- [x] 게임 시작 명령어 입력 기능
- [x] 게임 종료 명령어 입력 기능
- [x] 점수 조회 명령어 입력 기능
- [x] 출력 기능
- [x] 체스 판 출력 기능
- [x] 안내 문구 출력 기능
- [x] 점수 출력 기능
- [x] 데이터 베이스에 저장하는 기능
- [x] 기물을 저장하는 기능
- [x] 턴을 저장하는 기능
- [x] 데이터베이스에 저장된 게임을 불러오는 기능

## 데이터베이스

### 저장해야 할 데이터

1. 각 기물의 위치
2. 현재 기물을 움직일 수 있는 팀

### 테이블 스키마

``` SQL
create table piece (
piece_type varchar(16),
primary key(piece_type)
);

create table position (
`name` char(2),
primary key(`name`)
);

create table team (
team_name varchar(16),
primary key(team_name)
);

CREATE TABLE `game` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`current_team_name` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `fj_team_game` (`current_team_name`),
CONSTRAINT `fj_team_game` FOREIGN KEY (`current_team_name`) REFERENCES `team` (`team_name`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

CREATE TABLE `pieces_on_board` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`piece_type` varchar(16) NOT NULL,
`team_name` varchar(16) NOT NULL,
`position_name` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `fk-piece-pieces_on_board` (`piece_type`),
KEY `fk-position-pieces_on_board` (`position_name`),
KEY `fk-team-pieces_on_board` (`team_name`),
CONSTRAINT `fk-piece-pieces_on_board` FOREIGN KEY (`piece_type`) REFERENCES `piece` (`piece_type`) ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT `fk-position-pieces_on_board` FOREIGN KEY (`position_name`) REFERENCES `position` (`name`) ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT `fk-team-pieces_on_board` FOREIGN KEY (`team_name`) REFERENCES `team` (`team_name`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
```

### 데이터 저장시 고려해야 하는 것

1. 데이터가 저장된 적이 없는 경우 혹은 복구를 하지 않겠다고 하는 경우 => 데이터를 모두 지우고, 초기 체스 판을 저장한다. 최초 턴을 white로 지정한다.
2. 말을 움직인 경우, 시작 위치의 말을 지우고, 도착위치의 말을 지운 뒤, 도착 위치로 이동한 기물을 새로 저장한다. 그리고 턴을 바꿔준다.

## 피드백 반영 예정 목록

### DB 관련

- [x] 트랜잭션 적용
- [x] TurnDAO에서 비즈니스 로직 상위로 이동
- [x] DAO에 boolean을 반환하는 메서드 추가
- [x] 구체적인 예외를 던지도록 수정
- [x] DAO 테스트 추가
- [x] 킹이 잡힌 경우 데이터를 초기화하도록 수정
- [x] 폰이 데이터베이스에서 로드된 뒤에 폰이 2칸 움직일 수 있는 버그 수정

### 도메인 로직 관련

- [x] 킹이 잡히는 경우 실제로 킹이 보드에서 삭제되지 않는 부분 수정

1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ dependencies {
testImplementation platform('org.assertj:assertj-bom:3.25.1')
testImplementation('org.junit.jupiter:junit-jupiter')
testImplementation('org.assertj:assertj-core')
runtimeOnly("com.mysql:mysql-connector-j:8.3.0")
}

java {
Expand Down
195 changes: 195 additions & 0 deletions chess_2024-04-01.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
# ************************************************************
# Sequel Ace SQL dump
# Version 20062
#
# https://sequel-ace.com/
# https://github.com/Sequel-Ace/Sequel-Ace
#
# Host: localhost (MySQL 8.0.28)
# Database: chess
# Generation Time: 2024-04-01 05:43:10 +0000
# ************************************************************


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
SET NAMES utf8mb4;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE='NO_AUTO_VALUE_ON_ZERO', SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;


# Dump of table game
# ------------------------------------------------------------

DROP TABLE IF EXISTS `game`;

CREATE TABLE `game` (
`current_team_name` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
KEY `fj_team_game` (`current_team_name`),
CONSTRAINT `fj_team_game` FOREIGN KEY (`current_team_name`) REFERENCES `team` (`team_name`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;



# Dump of table piece
# ------------------------------------------------------------

DROP TABLE IF EXISTS `piece`;

CREATE TABLE `piece` (
`piece_type` varchar(16) NOT NULL,
PRIMARY KEY (`piece_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

LOCK TABLES `piece` WRITE;
/*!40000 ALTER TABLE `piece` DISABLE KEYS */;

INSERT INTO `piece` (`piece_type`)
VALUES
('BISHOP'),
('KING'),
('KNIGHT'),
('PAWN'),
('QUEEN'),
('ROOK');

/*!40000 ALTER TABLE `piece` ENABLE KEYS */;
UNLOCK TABLES;


# Dump of table pieces_on_board
# ------------------------------------------------------------

DROP TABLE IF EXISTS `pieces_on_board`;

CREATE TABLE `pieces_on_board` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`piece_type` varchar(16) NOT NULL,
`team_name` varchar(16) NOT NULL,
`position_name` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `fk-piece-pieces_on_board` (`piece_type`),
KEY `fk-position-pieces_on_board` (`position_name`),
KEY `fk-team-pieces_on_board` (`team_name`),
CONSTRAINT `fk-piece-pieces_on_board` FOREIGN KEY (`piece_type`) REFERENCES `piece` (`piece_type`) ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT `fk-position-pieces_on_board` FOREIGN KEY (`position_name`) REFERENCES `position` (`name`) ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT `fk-team-pieces_on_board` FOREIGN KEY (`team_name`) REFERENCES `team` (`team_name`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;



# Dump of table position
# ------------------------------------------------------------

DROP TABLE IF EXISTS `position`;

CREATE TABLE `position` (
`name` char(2) NOT NULL,
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

LOCK TABLES `position` WRITE;
/*!40000 ALTER TABLE `position` DISABLE KEYS */;

INSERT INTO `position` (`name`)
VALUES
('A1'),
('A2'),
('A3'),
('A4'),
('A5'),
('A6'),
('A7'),
('A8'),
('B1'),
('B2'),
('B3'),
('B4'),
('B5'),
('B6'),
('B7'),
('B8'),
('C1'),
('C2'),
('C3'),
('C4'),
('C5'),
('C6'),
('C7'),
('C8'),
('D1'),
('D2'),
('D3'),
('D4'),
('D5'),
('D6'),
('D7'),
('D8'),
('E1'),
('E2'),
('E3'),
('E4'),
('E5'),
('E6'),
('E7'),
('E8'),
('F1'),
('F2'),
('F3'),
('F4'),
('F5'),
('F6'),
('F7'),
('F8'),
('G1'),
('G2'),
('G3'),
('G4'),
('G5'),
('G6'),
('G7'),
('G8'),
('H1'),
('H2'),
('H3'),
('H4'),
('H5'),
('H6'),
('H7'),
('H8');

/*!40000 ALTER TABLE `position` ENABLE KEYS */;
UNLOCK TABLES;


# Dump of table team
# ------------------------------------------------------------

DROP TABLE IF EXISTS `team`;

CREATE TABLE `team` (
`team_name` varchar(16) NOT NULL,
PRIMARY KEY (`team_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

LOCK TABLES `team` WRITE;
/*!40000 ALTER TABLE `team` DISABLE KEYS */;

INSERT INTO `team` (`team_name`)
VALUES
('black'),
('white');

/*!40000 ALTER TABLE `team` ENABLE KEYS */;
UNLOCK TABLES;



/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
18 changes: 18 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
version: "3.9"
services:
db:
image: mysql:8.0.28
platform: linux/x86_64
restart: always
ports:
- "13306:3306"
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: chess
MYSQL_USER: user
MYSQL_PASSWORD: password
TZ: Asia/Seoul
volumes:
- ./db/mysql/data:/var/lib/mysql
- ./db/mysql/config:/etc/mysql/conf.d
- ./db/mysql/init:/docker-entrypoint-initdb.d
Loading