Skip to content

Commit

Permalink
[빙봉] 체스 - 스프링 실습 1단계 제출합니다. (#14)
Browse files Browse the repository at this point in the history
* initial commit

* fix : build.gradle mysql 의존성 추가

* refactor : 왕이 죽었을 때 게임이 종료 안되는 버그 수정

* refactor : 버튼으로 방에 입장할 수 있도록 함

* refactor : 방을 삭제하고 나서 새로고침해야 적용되던 문제 수정

* feat : 방에 입장하자마자 게임을 바로 불러오도록 하고 못 불러왔을 시 게임을 초기화하는 기능 추가, refactor : 불러왔을 때 현재 Turn이 나오지 않는 문제 수정

* refactor, style : tab 공백을 space로 변경, 익명 객체 람다식으로 수정

* feat : Spring room Controller 구현
- 방 제목 empty 에 대한 validation 추가
- default 요청시 바로 방 목록을 불러오도록 수정

* feat, refactor : Dto 생성 방식 수정, 게임 컨트롤러 구현

- 게임 초기화 기능 구현

* refactor : 사용하지 않는 클래스 삭제

* refactor : 디폴트 생성자 접근제어자 수정

* refactor : 디폴트 생성자 접근제어자 수정

* refactor : 디폴트 생성자 접근제어자 수정

* refactor : Object 객체 타입 파라미터 반영하도록 수정

* refactor : 필드간 공백 추가

* refactor : 사용하지 않는 메서드 삭제

* refactor : 필드 접근제어자 추가

* style : 공백 추가

* feat : gameController init, movablePosition 구현

- todo : move시 에러

* feat : move 예외 처리 작업중

* refactor : spring MVC 구조에 맞게 refactor

- GameController 예외 알맞게 처리
- DAO 클래스 Repository로 설정
- Service의 DAO를 bean으로 주입

* docs : README.md 추가

* test : domain test 메서드 추가

* refactor : 사용하지 않은 메서드 삭제 및 공백 수정

Co-authored-by: dd <[email protected]>
  • Loading branch information
aegis1920 and fucct authored Apr 27, 2020
1 parent b03058f commit 69f6b54
Show file tree
Hide file tree
Showing 80 changed files with 3,375 additions and 32 deletions.
125 changes: 125 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
# java-chess
체스 게임 구현을 위한 저장소
## 기능 요구 사항
* 콘솔 UI에서 체스 게임을 할 수 있는 기능을 구현한다.
* 1단계는 체스 게임을 할 수 있는 체스판을 초기화한다.
* 체스판에서 말의 위치 값은 가로 위치는 왼쪽부터 a ~ h이고, 세로는 아래부터 위로 1 ~ 8로 구현한다.
* 체스판에서 각 진영은 검은색(대문자)과 흰색(소문자) 편으로 구분한다.
* 체스 말의 이동 규칙을 찾아보고 체스 말이 이동할 수 있도록 구현한다.
* `move source위치 target위치` 를 실행해 이동한다.
* 체스 게임은 상대편 King이 잡히는 경우 게임에서 진다. *King이 잡혔을 때 게임을 종료해야 한다.*
* *체스 게임은 현재 남아 있는 말에 대한 점수를 구할 수 있어야 한다.*
* “status”명령을 입력하면 각 진영의 점수를 출력하고 어느 진영이 이겼는지 결과를 볼 수 있어야 한다.
* 점수 계산 규칙
* 체스 프로그램에서 현재까지 남아 있는 말에 따라 점수를 계산할 수 있어야 한다.
* 각 말의 점수는 queen은 9점, rook은 5점, bishop은 3점, knight는 2.5점이다.
* pawn의 기본 점수는 1점이다. 하지만 같은 세로줄에 같은 색의 폰이 있는 경우 1점이 아닌 0.5점을 준다.
* king은 잡히는 경우 경기가 끝나기 때문에 점수가 없다.
* 한 번에 한 쪽의 점수만을 계산해야 한다.
## 프로그래밍 요구 사항
* [프로그래밍 체크리스트](https://github.com/woowacourse/woowacourse-docs/blob/master/cleancode/pr_checklist.md)
## 구현할 기능 목록
* [x] 게임 설명 출력
* [x] 명령 입력받는다. (start, end, move, status)
* [x] 예외 : 처음에는 start, end 만 들어올 수 있다.
* [x] 예외 : start 는 한 번만 입력할 수 있다.
* [x] 예외 : Null, empty 등 유효하지 않은 입력이 들어올 수 없다.
* [x] 예외 : move 는 source 위치와 target 위치를 공백으로 구분하여 입력받아야 한다. 예시 - move b2 b3
* [x] 예외 : move 에서 source 또는 target 값이 체스 판 밖일 때
* [x] 체스판을 출력하는 기능
* [x] 체스 말이 이동하는 기능
* [x] 예외 : source 가 빈 칸인 경우
* [x] 예외 : source 가 상대 체스 말인 경우
* source 가 내 체스 말일 때
* Pawn 일 경우
* [x] 북쪽으로 한 칸 이동할 수 있는 기능
* [x] 예외 : 처음에만 북쪽으로 2칸까지 이동할 수 있는 기능
* [x] 앞 대각선에 상대 말이 있으면 잡을 있다
* [x] 예외 : target 에 가는 도중 체스 말이 있으면 넘어갈 수 없다
* Rook 일 경우
* [x] 동서남북쪽으로 끝까지 갈 수 있다
* [x] 가는 도중 상대 체스 말이 있으면 잡을 수 있다
* [x] 예외 : target 에 가는 도중 체스 말이 있으면 넘어갈 수 없다
* Bishop 일 경우
* [x] 모든 대각선 방향으로 끝까지 갈 수 있다
* [x] 가는 도중 상대 체스 말이 있으면 잡을 수 있다
* [x] 예외 : target 에 가는 도중 체스 말이 있으면 넘어갈 수 없다
* Knight 일 경우
* [x] 직진 후 대각선 방향으로 갈 수 있다
* [x] 가는 도중 상대 체스 말이 있으면 잡을 수 있다
* [x] 말을 넘어갈 수 있다
* Queen 일 경우
* [x] 동서남북, 대각선 방향으로 끝까지 갈 수 있다
* [x] 가는 도중 상대 체스 말이 있으면 잡을 수 있다
* [x] 예외 : target 에 가는 도중 체스 말이 있으면 넘어갈 수 없다
* King 일 경우
* [x] 동서남북, 대각선 방향으로 한 칸 갈 수 있다
* [x] 가는 도중 상대 체스 말이 있으면 잡을 수 있다
* [x] 예외 : target 에 가는 도중 체스 말이 있으면 넘어갈 수 없다
* [x] 예외 : 경로가 막혀있으면 갈 수 없다
* target 이 상대 King 인 경우 게임을 종료
* status 기능
* [x] 각 진영의 점수를 확인하는 기능
* 승패를 출력하는 기능# java-chess
체스 게임 구현을 위한 저장소
## 기능 요구 사항
* 콘솔 UI에서 체스 게임을 할 수 있는 기능을 구현한다.
* 1단계는 체스 게임을 할 수 있는 체스판을 초기화한다.
* 체스판에서 말의 위치 값은 가로 위치는 왼쪽부터 a ~ h이고, 세로는 아래부터 위로 1 ~ 8로 구현한다.
* 체스판에서 각 진영은 검은색(대문자)과 흰색(소문자) 편으로 구분한다.
* 체스 말의 이동 규칙을 찾아보고 체스 말이 이동할 수 있도록 구현한다.
* `move source위치 target위치` 를 실행해 이동한다.
* 체스 게임은 상대편 King이 잡히는 경우 게임에서 진다. *King이 잡혔을 때 게임을 종료해야 한다.*
* *체스 게임은 현재 남아 있는 말에 대한 점수를 구할 수 있어야 한다.*
* “status”명령을 입력하면 각 진영의 점수를 출력하고 어느 진영이 이겼는지 결과를 볼 수 있어야 한다.
* 점수 계산 규칙
* 체스 프로그램에서 현재까지 남아 있는 말에 따라 점수를 계산할 수 있어야 한다.
* 각 말의 점수는 queen은 9점, rook은 5점, bishop은 3점, knight는 2.5점이다.
* pawn의 기본 점수는 1점이다. 하지만 같은 세로줄에 같은 색의 폰이 있는 경우 1점이 아닌 0.5점을 준다.
* king은 잡히는 경우 경기가 끝나기 때문에 점수가 없다.
* 한 번에 한 쪽의 점수만을 계산해야 한다.
## 프로그래밍 요구 사항
* [프로그래밍 체크리스트](https://github.com/woowacourse/woowacourse-docs/blob/master/cleancode/pr_checklist.md)
## 구현할 기능 목록
* [x] 게임 설명 출력
* [x] 명령 입력받는다. (start, end, move, status)
* [x] 예외 : 처음에는 start, end 만 들어올 수 있다.
* [x] 예외 : start 는 한 번만 입력할 수 있다.
* [x] 예외 : Null, empty 등 유효하지 않은 입력이 들어올 수 없다.
* [x] 예외 : move 는 source 위치와 target 위치를 공백으로 구분하여 입력받아야 한다. 예시 - move b2 b3
* [x] 예외 : move 에서 source 또는 target 값이 체스 판 밖일 때
* [x] 체스판을 출력하는 기능
* [x] 체스 말이 이동하는 기능
* [x] 예외 : source 가 빈 칸인 경우
* [x] 예외 : source 가 상대 체스 말인 경우
* source 가 내 체스 말일 때
* Pawn 일 경우
* [x] 북쪽으로 한 칸 이동할 수 있는 기능
* [x] 예외 : 처음에만 북쪽으로 2칸까지 이동할 수 있는 기능
* [x] 앞 대각선에 상대 말이 있으면 잡을 있다
* [x] 예외 : target 에 가는 도중 체스 말이 있으면 넘어갈 수 없다
* Rook 일 경우
* [x] 동서남북쪽으로 끝까지 갈 수 있다
* [x] 가는 도중 상대 체스 말이 있으면 잡을 수 있다
* [x] 예외 : target 에 가는 도중 체스 말이 있으면 넘어갈 수 없다
* Bishop 일 경우
* [x] 모든 대각선 방향으로 끝까지 갈 수 있다
* [x] 가는 도중 상대 체스 말이 있으면 잡을 수 있다
* [x] 예외 : target 에 가는 도중 체스 말이 있으면 넘어갈 수 없다
* Knight 일 경우
* [x] 직진 후 대각선 방향으로 갈 수 있다
* [x] 가는 도중 상대 체스 말이 있으면 잡을 수 있다
* [x] 말을 넘어갈 수 있다
* Queen 일 경우
* [x] 동서남북, 대각선 방향으로 끝까지 갈 수 있다
* [x] 가는 도중 상대 체스 말이 있으면 잡을 수 있다
* [x] 예외 : target 에 가는 도중 체스 말이 있으면 넘어갈 수 없다
* King 일 경우
* [x] 동서남북, 대각선 방향으로 한 칸 갈 수 있다
* [x] 가는 도중 상대 체스 말이 있으면 잡을 수 있다
* [x] 예외 : target 에 가는 도중 체스 말이 있으면 넘어갈 수 없다
* [x] 예외 : 경로가 막혀있으면 갈 수 없다
* target 이 상대 King 인 경우 게임을 종료
* status 기능
* [x] 각 진영의 점수를 확인하는 기능
* 승패를 출력하는 기능
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,14 @@ repositories {
}

dependencies {
compile('mysql:mysql-connector-java:8.0.16')
implementation 'com.sparkjava:spark-core:2.9.0'
implementation 'com.sparkjava:spark-template-handlebars:2.7.1'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
implementation 'net.rakugakibox.spring.boot:logback-access-spring-boot-starter:2.7.1'
implementation 'pl.allegro.tech.boot:handlebars-spring-boot-starter:0.3.1'
implementation 'com.google.code.gson:gson:2.8.6'
testImplementation 'io.rest-assured:rest-assured:3.3.0'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
Expand Down
40 changes: 27 additions & 13 deletions src/main/java/wooteco/chess/SparkChessApplication.java
Original file line number Diff line number Diff line change
@@ -1,22 +1,36 @@
package wooteco.chess;

import spark.ModelAndView;
import spark.template.handlebars.HandlebarsTemplateEngine;
import wooteco.chess.controller.SparkGameController;
import wooteco.chess.controller.SparkRoomController;
import com.google.gson.Gson;
import com.google.gson.JsonObject;

import java.util.HashMap;
import java.util.Map;

import static spark.Spark.get;
import static spark.Spark.*;
import static spark.Spark.exception;

public class SparkChessApplication {
public static void main(String[] args) {
get("/", (req, res) -> {
Map<String, Object> model = new HashMap<>();
return render(model, "index.hbs");
});
}
port(4567);
staticFiles.location("/static");
externalStaticFileLocation("src/main/resources/templates");

private static String render(Map<String, Object> model, String templatePath) {
return new HandlebarsTemplateEngine().render(new ModelAndView(model, templatePath));
// get(SparkRoomController.BASIC_URL, SparkRoomController.getAllRoom);
// get(SparkRoomController.CREATE_ROOM_URL, SparkRoomController.createRoom);
// get(SparkRoomController.REMOVE_ROOM_URL, SparkRoomController.removeRoom);
// get(SparkRoomController.ENTER_ROOM_URL, SparkRoomController.enterRoom);
//
// get(SparkGameController.INIT_URL, SparkGameController::initGame);
// post(SparkGameController.MOVE_URL, SparkGameController::movePiece);
// get(SparkGameController.STATUS_URL, SparkGameController::showStatus);
// get(SparkGameController.LOAD_URL, SparkGameController::loadGame);
// get(SparkGameController.GET_URL, SparkGameController::getMovablePositions);
//
// exception(IllegalArgumentException.class, (e, req, res) -> {
// Gson gson = new Gson();
// JsonObject object = new JsonObject();
//
// object.addProperty("errorMessage", e.getMessage());
// res.body(gson.toJson(object));
// });
}
}
12 changes: 0 additions & 12 deletions src/main/java/wooteco/chess/controller/ChessController.java

This file was deleted.

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

import javax.validation.constraints.NotEmpty;

public class RoomName {

@NotEmpty
private String roomName;

public RoomName(final String roomName) {
this.roomName = roomName;
}

public String getRoomName() {
return roomName;
}

public void setRoomName(final String roomName) {
this.roomName = roomName;
}
}
97 changes: 97 additions & 0 deletions src/main/java/wooteco/chess/controller/SparkGameController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package wooteco.chess.controller;

import com.google.gson.Gson;
import com.google.gson.JsonObject;
import spark.Request;
import spark.Response;
import wooteco.chess.domain.Color;
import wooteco.chess.service.GameService;

import java.sql.SQLException;

public class SparkGameController {
// public static final String BASIC_URL = "/game";
// public static final String MOVE_URL = BASIC_URL + "/move";
// public static final String STATUS_URL = BASIC_URL + "/status";
// public static final String INIT_URL = BASIC_URL + "/init";
// public static final String LOAD_URL = BASIC_URL + "/load";
// public static final String GET_URL = BASIC_URL + "/get";
//
// public static String initGame(Request request, Response response) throws SQLException {
// GameService gameService = GameService.getInstance();
// int roomId = Integer.parseInt(request.queryParams("roomId"));
// gameService.initialize(roomId);
//
// Gson gson = new Gson();
// JsonObject object = new JsonObject();
// String pieces = gson.toJson(gameService.getPiecesResponseDTO(roomId).getPieces());
// String currentColor = gameService.getCurrentColor(roomId);
//
// object.addProperty("pieces", pieces);
// object.addProperty("currentColor", currentColor);
//
// return gson.toJson(object);
// }
//
// public static String movePiece(Request request, Response response) throws SQLException {
// GameService gameService = GameService.getInstance();
//
// int roomId = Integer.parseInt(request.queryParams("roomId"));
// String sourcePosition = request.queryParams("sourcePosition");
// String targetPosition = request.queryParams("targetPosition");
// gameService.movePiece(roomId, sourcePosition, targetPosition);
// boolean kingDead = gameService.isKingDead(roomId);
// String currentColor = gameService.getCurrentColor(roomId);
//
// Gson gson = new Gson();
// JsonObject object = new JsonObject();
// String pieces = gson.toJson(gameService.getPiecesResponseDTO(roomId).getPieces());
//
// object.addProperty("pieces", pieces);
// object.addProperty("kingDead", kingDead);
// object.addProperty("currentColor", currentColor);
//
// return gson.toJson(object);
// }
//
// public static String showStatus(Request request, Response response) throws SQLException {
// GameService gameService = GameService.getInstance();
// int roomId = Integer.parseInt(request.queryParams("roomId"));
//
// double whiteScore = gameService.getScore(roomId, Color.WHITE);
// double blackScore = gameService.getScore(roomId, Color.BLACK);
//
// Gson gson = new Gson();
// JsonObject object = new JsonObject();
//
// object.addProperty("whiteScore", whiteScore);
// object.addProperty("blackScore", blackScore);
//
// return gson.toJson(object);
// }
//
// public static String loadGame(Request request, Response response) throws SQLException {
// GameService gameService = GameService.getInstance();
// int roomId = Integer.parseInt(request.queryParams("roomId"));
//
// Gson gson = new Gson();
// JsonObject object = new JsonObject();
// String pieces = gson.toJson(gameService.getPiecesResponseDTO(roomId).getPieces());
// String currentColor = gameService.getCurrentColor(roomId);
//
// object.addProperty("pieces", pieces);
// object.addProperty("currentColor", currentColor);
//
// return gson.toJson(object);
// }
//
// public static String getMovablePositions(final Request request, final Response response) throws SQLException {
// GameService gameService = GameService.getInstance();
// int roomId = Integer.parseInt(request.queryParams("roomId"));
// String sourcePosition = request.queryParams("sourcePosition");
//
// Gson gson = new Gson();
//
// return gson.toJson(gameService.getMovablePositions(roomId, sourcePosition));
// }
}
55 changes: 55 additions & 0 deletions src/main/java/wooteco/chess/controller/SparkRoomController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package wooteco.chess.controller;

import wooteco.chess.domain.room.Room;
import wooteco.chess.service.RoomService;
import spark.Route;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static wooteco.chess.util.HandlebarsUtil.render;

public class SparkRoomController {
public static final String BASIC_URL = "/rooms";
public static final String ENTER_ROOM_URL = BASIC_URL + "/enter";
public static final String CREATE_ROOM_URL = BASIC_URL + "/create";
public static final String REMOVE_ROOM_URL = BASIC_URL + "/remove";

// public static Route getAllRoom = (request, response) -> {
// Map<String, Object> model = new HashMap<>();
//
// RoomService roomService = RoomService.getInstance();
// List<Room> rooms = roomService.findAllRoom();
// model.put("rooms", rooms);
//
// return render(model, "index.hbs");
// };
//
// public static Route enterRoom = (request, response) -> {
// Map<String, Object> model = new HashMap<>();
// model.put("roomId", request.queryParams("roomId"));
//
// return render(model, "game.hbs");
// };
//
// public static Route createRoom = (request, response) -> {
// RoomService roomService = RoomService.getInstance();
// String param = request.queryParams("roomName");
// roomService.addRoom(param);
//
// response.redirect("/rooms");
// return null;
// };
//
// public static Route removeRoom = (request, response) -> {
// RoomService roomService = RoomService.getInstance();
// roomService.removeRoom(Integer.parseInt(request.queryParams("roomId")));
//
// response.redirect("/rooms");
// return null;
// };
//
// private SparkRoomController() {
// }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package wooteco.chess.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class SpringDefaultController {

@RequestMapping("/")
public String index() {
return "redirect:/rooms";
}


}
Loading

0 comments on commit 69f6b54

Please sign in to comment.