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

[alissa159] 백엔드 스프링 2주차 미션 제출합니다. #22

Open
wants to merge 33 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
380649f
Application
alissa159 Nov 23, 2024
f35ac09
Game
alissa159 Nov 23, 2024
967a6b3
SkillAction(interface)
alissa159 Nov 23, 2024
6d4de75
Skill
alissa159 Nov 23, 2024
ed7db11
CharacterAction(interface)
alissa159 Nov 23, 2024
d9e269a
GameCharacter
alissa159 Nov 23, 2024
ff3ec0d
TODO
alissa159 Nov 23, 2024
cc4446b
interface
alissa159 Nov 23, 2024
82df167
Merge branch 'main' into alissa159
alissa159 Nov 26, 2024
6eff851
spring 정의
alissa159 Dec 1, 2024
69ff065
기존 Application 및 Game 삭제
alissa159 Dec 1, 2024
8356a41
새로운 GameApplication 생성
alissa159 Dec 1, 2024
1b883e4
스프링부트 의존성 추가
alissa159 Dec 1, 2024
430daff
두 개의 서비스 로직 추가
alissa159 Dec 1, 2024
84db56c
두 개의 DTO클래스 추가
alissa159 Dec 1, 2024
bea29fa
기존 Character관련 클래스 수정
alissa159 Dec 1, 2024
1fcb6d5
두 개의 컨트롤러 계층 추가
alissa159 Dec 1, 2024
1e06c1d
게임과 턴수 관련 클래스 추가
alissa159 Dec 1, 2024
5cde6b7
ActionRequest
alissa159 Dec 1, 2024
ee90713
하나의 Game클래스를 두 개로 나눔
alissa159 Dec 1, 2024
58ed049
Merge branch 'GDSC-Hongik:main' into alissa159
alissa159 Dec 1, 2024
fbc8673
Merge main branch
alissa159 Dec 24, 2024
71a496d
코드 수정 위해 삭제한 클래스들
alissa159 Dec 26, 2024
ac4197b
Merge branch 'alissa159' of https://github.com/alissa159/2024-2-missi…
alissa159 Dec 26, 2024
8bf3fb1
db관련 정보
alissa159 Dec 26, 2024
9c85e6e
jpa의존성추가
alissa159 Dec 26, 2024
e3ba13f
엔티티 클래스 수정
alissa159 Dec 26, 2024
6051dc9
컨트롤러계층 수정
alissa159 Dec 26, 2024
b913ae4
예외처리위한 클래스
alissa159 Dec 26, 2024
3adc27f
서비스 로직 인터페이스
alissa159 Dec 26, 2024
c8eaecf
서비스로직 구현 수정
alissa159 Dec 26, 2024
9a7bfaf
레포지토리 계층 추가
alissa159 Dec 26, 2024
fdb4d24
dto 관련 클래스들 수정 및 추가
alissa159 Dec 26, 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
22 changes: 22 additions & 0 deletions TODO.md
Original file line number Diff line number Diff line change
@@ -1 +1,23 @@
# 턴제 게임
![alt text](image.png)
## Character
스킬 초기화
어택
방어
스킬 사용
데미지 계산
스킬 쿨타임 업데이트
현재 상태 출력
이름 get
체력 get

## Skill
스킬 사용 가능 여부
스킬 사용
쿨타임 감소
정보 출력
마나 값 get

## Game
게임 스타트 및 남은 턴 계산해서 게임 종료
선택한 행동에 따른 체력, 마나, 턴 제한 계산
Binary file added articles/image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 2 additions & 1 deletion articles/interface.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,5 @@


### 여러분의 답변을 적어주세요!
> TIP: mermaid 라는 드로잉 툴을 활용해보세요.
> TIP: mermaid 라는 드로잉 툴을 활용해보세요.
![alt text](image.png)
3 changes: 2 additions & 1 deletion articles/spring.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,5 @@
* [10분 테크톡](https://www.youtube.com/watch?v=YdE4krx0dsM)

---
### 여기에 여러분의 답변을 적어주세요!
### 여기에 여러분의 답변을 적어주세요!
스프링은 자바 애플리케이션 개발에 큰 편리함을 가져다주는 오픈소스 프레임워크이다.
12 changes: 11 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
plugins {
id 'java'
id 'org.springframework.boot' version '3.4.0'
id 'io.spring.dependency-management' version '1.1.6'
}

group = 'com.gdsc'
Expand All @@ -16,10 +18,18 @@ repositories {
}

dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter:5.7.1'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'com.h2database:h2'
implementation 'org.springframework.boot:spring-boot-starter-validation'
}



tasks.named('test') {
useJUnitPlatform()
}
Binary file added image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 0 additions & 9 deletions src/main/java/com/gdsc/game/Application.java

This file was deleted.

11 changes: 11 additions & 0 deletions src/main/java/com/gdsc/game/GameApplication.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.gdsc.game;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class GameApplication {
public static void main(String[] args) {
SpringApplication.run(GameApplication.class, args);
}
}
67 changes: 67 additions & 0 deletions src/main/java/com/gdsc/game/controller/GameController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package com.gdsc.game.controller;

import com.gdsc.game.domain.Game;
import com.gdsc.game.dto.*;
import com.gdsc.game.exception.NotFoundException;
import com.gdsc.game.service.GameService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/game")
@RequiredArgsConstructor
public class GameController {
private final GameService gameService;

@PostMapping("/start")
public ResponseEntity<Game> startGame(@RequestBody @Valid GameStartRequest request) {
try {
Game game = gameService.initializeGame(request.getCharacters(), request.getTurns());
return ResponseEntity.ok(game);
} catch (IllegalArgumentException e) {
return ResponseEntity.badRequest().build();
} catch (NotFoundException e) {
return ResponseEntity.notFound().build();
}
}

@GetMapping("/character/{name}/status")
public ResponseEntity<CharacterStatus> getCharacterStatus(@PathVariable String name) {
try {
CharacterStatus status = gameService.getCharacterStatus(name);
return ResponseEntity.ok(status);
} catch (NotFoundException e) {
return ResponseEntity.notFound().build();
}
}

@GetMapping("/character/{name}/actions")
public ResponseEntity<List<ActionDTO>> getAvailableActions(
@PathVariable String name,
@RequestParam(defaultValue = "name") String sortBy) {
try {
List<ActionDTO> actions = gameService.getAvailableActions(name, sortBy);
return ResponseEntity.ok(actions);
} catch (NotFoundException e) {
return ResponseEntity.notFound().build();
}
}

@PostMapping("/character/{name}/action")
public ResponseEntity<ActionResultDTO> performAction(
@PathVariable String name,
@RequestBody @Valid ActionRequest request) {
try {
ActionResultDTO result = gameService.processAction(name, request.getActionName());
return ResponseEntity.ok(result);
} catch (IllegalStateException e) {
return ResponseEntity.badRequest().build();
} catch (NotFoundException e) {
return ResponseEntity.notFound().build();
}
}
}
81 changes: 81 additions & 0 deletions src/main/java/com/gdsc/game/domain/Character.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package com.gdsc.game.domain;

import com.gdsc.game.dto.CharacterStatus;
import jakarta.persistence.*;

import java.util.List;

@Entity
public class Character {
@Id
@GeneratedValue
private Long id;
private String name;
private int level;
private int currentHp;
private int maxHp;
private int currentMp;
private int maxMp;

@ManyToOne
private Job job;

@OneToMany(mappedBy = "character")
private List<Skill> skills;

public Character(String name, int level, Job job) {
this.name = name;
this.level = level;
this.job = job;
this.maxHp = job.calculateHp(level);
this.maxMp = job.calculateMp(level);
this.currentHp = maxHp;
this.currentMp = maxMp;
}
protected Character() {}

public int getMp() {
return this.currentMp;
}

public List<Skill> getSkills() {
return this.skills;
}

public void setName(String name) {
this.name = name;
}

public void setLevel(int level) {
this.level = level;
}

public void setJob(Job job) {
this.job = job;
}

public void setMp(int mp) {
this.currentMp = Math.max(0, Math.min(mp, maxMp));
}

public void setHp(int hp) {
this.currentHp = Math.max(0, Math.min(hp, maxHp));
}

public void takeDamage(int damage) {
this.currentHp = Math.max(0, this.currentHp - damage);
}

public void useMp(int amount) {
if (currentMp < amount) {
throw new IllegalStateException("Not enough MP");
}
this.currentMp -= amount;
}
public CharacterStatus getStatus() {
return new CharacterStatus(name, currentHp, currentMp, job.getName(), level);
}
public static Character create(String name, int level, Job job) {
return new Character(name, level, job);
}
}
36 changes: 36 additions & 0 deletions src/main/java/com/gdsc/game/domain/Game.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.gdsc.game.domain;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import lombok.Getter;
import lombok.Setter;

import java.util.List;

@Entity
@Getter
@Setter
public class Game {
@Id
@GeneratedValue
private Long id;

private int totalTurns;
private int currentTurn;
private boolean isGameOver;

@OneToMany
private List<Character> characters;

public void nextTurn() {
currentTurn++;
if (currentTurn > totalTurns) {
isGameOver = true;
}
characters.forEach(character ->
character.getSkills().forEach(Skill::updateCooldown)
);
}
}
41 changes: 41 additions & 0 deletions src/main/java/com/gdsc/game/domain/Job.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.gdsc.game.domain;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;

import java.util.List;

@Entity
public class Job {
@Id
@GeneratedValue
private Long id;
private String name;
private int baseHp;
private int baseMp;

@OneToMany(mappedBy = "job")
private List<Skill> availableSkills;

protected Job() {}

public Job(String name, int baseHp, int baseMp) {
this.name = name;
this.baseHp = baseHp;
this.baseMp = baseMp;
}

public int calculateHp(int level) {
return baseHp + (level * 10);
}

public int calculateMp(int level) {
return baseMp + (level * 5);
}

public String getName() {
return this.name;
}
}
49 changes: 49 additions & 0 deletions src/main/java/com/gdsc/game/domain/Skill.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.gdsc.game.domain;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToOne;
import lombok.Getter;
import lombok.Setter;

import java.util.Random;

@Entity
@Getter
@Setter
public class Skill {
@Id
@GeneratedValue
private Long id;

private String name;
private int manaCost;
private int cooldown;
private int currentCooldown;
private int minDamage;
private int maxDamage;

@ManyToOne
private Job job;

@ManyToOne
private Character character;

public int use() {
if (currentCooldown > 0 || character.getMp() < manaCost) {
throw new IllegalStateException("Cannot use skill");
}

character.setMp(character.getMp() - manaCost);
currentCooldown = cooldown;

return new Random().nextInt(maxDamage - minDamage + 1) + minDamage;
}

public void updateCooldown() {
if (currentCooldown > 0) {
currentCooldown--;
}
}
}
10 changes: 10 additions & 0 deletions src/main/java/com/gdsc/game/dto/ActionDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.gdsc.game.dto;

import lombok.Data;

@Data
public class ActionDTO {
private String name;
private int manaCost;
private int cooldown;
}
10 changes: 10 additions & 0 deletions src/main/java/com/gdsc/game/dto/ActionRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.gdsc.game.dto;

import jakarta.validation.constraints.NotNull;
import lombok.Data;

@Data
public class ActionRequest {
@NotNull
private String actionName;
}
Loading