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

[mirupio] 2,3주차 미션 제출합니다 #24

Open
wants to merge 17 commits into
base: main
Choose a base branch
from
Open
23 changes: 12 additions & 11 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,25 +1,26 @@
plugins {
id 'org.springframework.boot' version '3.0.0' // 버전은 사용 중인 Spring Boot 버전으로 설정
id 'io.spring.dependency-management' version '1.0.13.RELEASE'
id 'java'
}

group = 'com.gdsc'
group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}
sourceCompatibility = '17' // Java 버전 맞추기

repositories {
mavenCentral()
mavenCentral() // Maven 중앙 저장소 설정
}

dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter:5.7.1'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'com.h2database:h2' // 임베디드 H2 DB
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
test {
useJUnitPlatform()
}
8 changes: 5 additions & 3 deletions src/main/java/com/gdsc/game/Application.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package com.gdsc.game;

public class Application {
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
public static void main(String[] args) {
System.out.println("hello world");
SpringApplication.run(Application.class, args);
}

}
37 changes: 37 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,37 @@
package com.gdsc.game.controller;

import com.gdsc.game.dto.CharacterStateDTO;
import com.gdsc.game.dto.GameStateDTO;
import com.gdsc.game.service.GameService;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/game")
public class GameController {

private final GameService gameService;

public GameController(GameService gameService) {
this.gameService = gameService;
}

// 1. 게임 상태 조회
@GetMapping("/state")
public GameStateDTO getGameState() {
return gameService.getGameState();
}

// 2. 캐릭터 상태 조회
@GetMapping("/character/{name}")
public CharacterStateDTO getCharacterState(@PathVariable String name) {
return gameService.getCharacterState(name);
}

// 3. 턴 진행
@PostMapping("/next-turn")
public GameStateDTO nextTurn(@RequestParam int player1Action, @RequestParam(required = false) Integer player1SkillIndex,
@RequestParam int player2Action, @RequestParam(required = false) Integer player2SkillIndex) {
return gameService.nextTurn(player1Action, player1SkillIndex, player2Action, player2SkillIndex);
}

}
59 changes: 59 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,59 @@
package com.gdsc.game.domain;

import java.util.Random;

public class Character {
private final String name;
private final Job job;
private int health;
private int mana;

public Character(String name, Job job, int level) {
this.name = name;
this.job = job;
if (job == null) {
throw new IllegalArgumentException("Job cannot be null");
}
this.health = job.getBaseHealth() + level * 10;
this.mana = job.getBaseMana() + level * 5;
}

public int attack() {
Random random = new Random();
return random.nextInt(10) + 1;
}

public int defend() {
Random random = new Random();
return random.nextInt(10) + 1;
}

public int useSkill(Skill skill) {
if (skill.isAvailable() && this.mana >= skill.getManaCost()) {
this.mana -= skill.getManaCost();
skill.useCooldown();
return skill.calculateDamage();
}
return 0;
}

public void decreaseHealth(int damage) {
this.health -= damage;
}

public String getName() {
return name;
}

public Job getJob() {
return job;
}

public int getHealth() {
return health;
}

public int getMana() {
return mana;
}
}
91 changes: 91 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,91 @@
package com.gdsc.game.domain;

public class Game implements GameStateProvider{
private int turnCount;
private final int maxTurns;
private final Character player1;
private final Character player2;

public Game(Character player1, Character player2, int maxTurns) {
this.player1 = player1;
this.player2 = player2;
this.maxTurns = maxTurns;
this.turnCount = 0;
}

@Override
public int getTurnCount() {
return turnCount;
}

@Override
public int getMaxTurns() {
return maxTurns;
}

@Override
public String getPlayer1Name() {
return player1.getName();
}

@Override
public String getPlayer2Name() {
return player2.getName();
}

@Override
public boolean isGameOver() {
return player1.getHealth() <= 0 || player2.getHealth() <= 0 || turnCount >= maxTurns;
}

// 1 turn 당 2 character
public void nextTurn(int player1Action, Integer player1SkillIndex, int player2Action, Integer player2SkillIndex) {
if (isGameOver()) {
return;
}

int damage = 0;

// Player1 행동
damage = executeAction(player1Action, player1SkillIndex, player1, player2);
player2.decreaseHealth(damage); // 상대 캐릭터의 체력 감소

// Player2 행동
damage = executeAction(player2Action, player2SkillIndex, player2, player1);
player1.decreaseHealth(damage); // 상대 캐릭터의 체력 감소

// 쿨다운 감소
reduceCooldowns();

turnCount++;
}

private int executeAction(int action, int skillIndex, Character current, Character opponent) {
int damage = 0;
switch (action) {
case 1 -> damage = current.attack(); // 일반 공격
case 2 -> { // 방어
current.defend(); // 방어 상태 설정
damage = opponent.attack(); // 공격을 받은 후 피해 계산
if (damage < 0) damage = 0;
}
default -> { // 스킬 사용
Skill[] skills = current.getJob().getSkills();
damage = current.useSkill(skills[skillIndex]);
}
}
return damage;
}

private void reduceCooldowns() {
// player1의 스킬 쿨다운 감소
for (Skill skill : player1.getJob().getSkills()) {
skill.reduceCooldown();
}

// player2의 스킬 쿨다운 감소
for (Skill skill : player2.getJob().getSkills()) {
skill.reduceCooldown();
}
}
}
9 changes: 9 additions & 0 deletions src/main/java/com/gdsc/game/domain/GameStateProvider.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.gdsc.game.domain;

public interface GameStateProvider {
int getTurnCount();
int getMaxTurns();
String getPlayer1Name();
String getPlayer2Name();
boolean isGameOver();
}
31 changes: 31 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,31 @@
package com.gdsc.game.domain;

public class Job {
private final String name;
private final int baseHealth;
private final int baseMana;
private final Skill[] skills;

public Job(String name, int baseHealth, int baseMana, Skill[] skills) {
this.name = name;
this.baseHealth = baseHealth;
this.baseMana = baseMana;
this.skills = skills;
}

public String getName() {
return name;
}

public int getBaseHealth() {
return baseHealth;
}

public int getBaseMana() {
return baseMana;
}

public Skill[] getSkills() {
return skills;
}
}
43 changes: 43 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,43 @@
package com.gdsc.game.domain;

import java.util.Random;

public class Skill {
private final String name;
private final int manaCost;
private int cooldown;

public Skill(String name, int manaCost, int cooldown) {
this.name = name;
this.manaCost = manaCost;
this.cooldown = cooldown;
}

public int calculateDamage() {
Random rand = new Random();
return this.manaCost * (rand.nextInt(10) + 1);
}

public boolean isAvailable() {
return this.cooldown == 0;
}

public void useCooldown() {
Random rand = new Random();
this.cooldown = rand.nextInt(2);
}

public void reduceCooldown() {
if (this.cooldown > 0) {
this.cooldown--;
}
}

public String getName() {
return name;
}

public int getManaCost() {
return manaCost;
}
}
41 changes: 41 additions & 0 deletions src/main/java/com/gdsc/game/dto/CharacterStateDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.gdsc.game.dto;

import com.gdsc.game.domain.Character;
import com.gdsc.game.domain.Skill;
import java.util.Arrays;
import java.util.Comparator;

public class CharacterStateDTO {
private final String name;
private final String jobName;
private final int health;
private final int mana;
private final Skill[] skills;

public CharacterStateDTO(Character character) {
this.name = character.getName();
this.jobName = character.getJob().getName();
this.health = character.getHealth();
this.mana = character.getMana();

// 스킬 복사 및 정렬
this.skills = Arrays.copyOf(character.getJob().getSkills(), character.getJob().getSkills().length);
Arrays.sort(this.skills, Comparator.comparing(Skill::getName));
}

public String getName() {
return name;
}

public int getHealth() {
return health;
}

public int getMana() {
return mana;
}

public Skill[] getSkills() {
return skills;
}
}
Loading