-
Notifications
You must be signed in to change notification settings - Fork 178
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* 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
Showing
80 changed files
with
3,375 additions
and
32 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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] 각 진영의 점수를 확인하는 기능 | ||
* 승패를 출력하는 기능 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
12
src/main/java/wooteco/chess/controller/ChessController.java
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
97
src/main/java/wooteco/chess/controller/SparkGameController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
55
src/main/java/wooteco/chess/controller/SparkRoomController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() { | ||
// } | ||
} |
15 changes: 15 additions & 0 deletions
15
src/main/java/wooteco/chess/controller/SpringDefaultController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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"; | ||
} | ||
|
||
|
||
} |
Oops, something went wrong.