Skip to content

Commit

Permalink
first commit
Browse files Browse the repository at this point in the history
  • Loading branch information
cmj7271 committed Nov 16, 2024
0 parents commit c9f220c
Show file tree
Hide file tree
Showing 13 changed files with 588 additions and 0 deletions.
35 changes: 35 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
HELP.md
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**
!**/src/test/**

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
out/

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

### VS Code ###
.vscode/

### Mac OS ###
.DS_Store
66 changes: 66 additions & 0 deletions 1st-spec.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# 1주차 미션코스

## 학습목표
* 주어진 명세에 맞게 객체를 설계해본다.
* `interface` 문법을 익히고, 적절하게 사용해본다.

## 진행방식
* 아래 주어진 레포지토리를 포크하면서 시작한다.
* [레포리토리 링크](https://github.com/GDSC-Hongik/2024-2-mission-course-java.git)
* 포크한 레포지토리에서 자신의 깃허브 이름으로 된 브렌치를 만들어서 진행한다.
* 아래 주어진 명세에 맞게 구현한다.
* 주어지지 않은 내용은 스스로 판단하여 구현한다.

## 제출 방법
* 자신의 이름으로 된 브렌치를 포크한 레포지토리의 main 브렌치에 PR을 날린다.

## 턴제 게임
### 진행 요구 사항
* 먼저 기능에 맞는 객체를 설계한다.
* 설계한 객체를 다양한 방식으로 표현하여 [TODO.md](./TODO.md) 에 첨부한다.
* [TODO.md](./TODO.md) 에 구현할 기능 목록을 정리한다.
* 기능 목록에 따라 커밋 혹은 브렌치를 나눈다.
* 한번에 `git add .` 을 통해 커밋하는 것은 금지한다.

### 기능 요구 사항
* 주어진 턴 동안 2명의 캐릭터는 서로 혹은 자신에게 특정 행동을 할 수 있다.
* 캐릭터에겐 체력, 마나가 존재한다.
* 2명의 캐릭터가 한번씩 행동하면 1턴이 지난 것으로 간주한다.
* 특정 행동은 공격, 방어, 스킬, 버프 4가지가 존재한다.
* 공격은 매턴, 마나 소모 없이 할 수 있으며, 상대에게 1~10 사이의 랜덤한 데미지를 입힌다.
* 방어는 매턴, 마나 소모 없이 할 수 있으며, 상대의 데미지를 한번 1~10 사이의 랜덤한 숫자만큼 감소시킨다.
* 스킬은 한번 사용시 일정한 턴이 지나야 사용할 수 있으며, 마나를 소모한다.
* 스킬은 마나 * (1 ~ 10 사이의 랜덤한 숫자) 의 데미지를 입힌다.

### 입력
* 처음에는 2명의 캐릭터 이름을 입력받는다. 쉼표(,) 를 통해 구분한다.
```
knight,slime
```
* 몇턴 동안 진행할지 입력받는다.
```
3
```
* 자신의 차례에서는 출력에서 보여준 행동 중 선택한다.
```
5
```
### 출력
* 매 자신의 턴에는 다음과 같은 정보가 출력된다.
* 자신과 상대의 체력, 마나
* 공격, 방어, 스킬 순으로 보여준다.
* 입히거나 막을 수 있는 데미지의 범위를 보여준다.
* 스킬은 사용까지 기다려야하는 턴 수도 보여준다.
```
knight 체력: 50 마나: 30 | slime 체력: 10 마나: 5
1. 공격(1 ~ 10)
2. 방어(1 ~ 10)
3. 두번베기(2 ~ 20) - 0턴
4. 3번베기(3 ~ 30) - 0턴
5. 쎼게 때리기(0 ~ 5) - 2턴
```
* 체력이 0이하시, 게임 종료를 출력한다.
```
knight가 이겼습니다!
```
85 changes: 85 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
# 미션 코스 1주차

## 이번 미션은 순수한 Java 코드로 진행됩니다.
스프링을 위한 미션 코스인데 왜 그런지 의문이 드실 수 있을 것 같아요.
왜 그런 식으로 진행하는지 간단하게 설명해볼께요.
저는 백엔드 프로젝트를 크게 3개의 계층으로 나눠서 생각해요. 디자인 패턴으로는 3-Tier Architecture 라고도 하죠.
DB 와의 통신을 담당하는 DB 계층, 서비스 관련 로직을 담당하는 서비스 계층, 전달하는 통신 게층 이렇게 3개이에요.

DB 계층은 ORM, 흔히 사용하는 JPA, 하이버네이트 를 통해 구현돼요.
통신 계층은 스프링 프레임워크를 통해 구현돼요.
즉, 이 둘은 생각보다 정형화되어있고, 어떻게든 작동하면 전체 서비스는 작동한다고 생각해요.

하지만, 서비스 계층은 이야기가 조금 달라요.
받은 데이터 기반으로 가공, 처리, 검증을 통해 필요한 정보를 넘겨야하죠.
서비스마다 천차만별이기 때문에, 전형적인 자료를 찾기 어렵다고 생각해요.
즉, 이런 부분을 도와주는 것이 향후 백엔드 서비스 구축에 조금 더 도움이 되지 않을까 싶어 이런 방식을 채택했어요.

## 객체지향
여러분은 객체지향을 얼마나 알고 계신가요?
첫 주차에는 프레임워크 없이 순수 언어를 사용해서 하는 이번 미션을 통해
객체지향을 되돌아 보아요.

여러분은 `객체지향` 하면 어떤 말이 떠오르나요?
저는 정의를 먼저 확인하는걸 좋아하는데요
위키피디아에 따르면...
```
Object-oriented programming (OOP) is a programming paradigm
based on the concept of objects which can contain data and code.
```
...별 도움은 되지 않는군요.
굳이 찾아보자면, Object, 즉 객체라는 개념에 중심을 둔 패러다임이라고 하는군요.

이 객체가 무엇인지, 어떤 식으로 설계하고 사용하는지 간단히 알아보고, 이번 미션을 수행해보아요.

### 객체란?
현실의 문제를 객체간의 `협력 관계`를 통해 해결하고자 하는 것이 객체지향의 목적이에요.
좀 더 풀어서 말하면, 각 객체에게 일정한 `책임`을 부과하고, 객체 간에 `메세지` 를 통해, `협력` 하여 주어진 문제를 해결해요.

예를 들어보면, 카페에서 손님이 직원에게 커피를 사려고 한다고 해볼께요.
```mermaid
classDiagram
손님 ..> 직원
직원 ..> 커피
직원 ..> 창고
class 손님 {
}
class 직원 {
커피 제공()
}
class 커피 {
레시피 제공()
}
class 창고 {
재료 제공()
}
```
직원은 손님에게 `커피를 제공`이라는 `메세지`를 받았어요.
이에 직원은 커피를 만들어 제공해야하는 `책임` 이 생겼어요.
직원은 `커피 제공` 이라는 `책임`을 위해 `커피``창고` 객체의 `협력` 을 받아요.

이런 식으로, 객체지향은 객체간의 `협력` 으로 문제를 해결해요.

### 객체 설계하기
객체지향적 설계를 위해서는 `메세지`, 혹은 기능을 먼저 정의해야 해요.
`메세지` 를 묶어 `책임` 을 설정하고, `협력 관계` 를 구성해요.
바로 위의 예시를 가져와볼께요.
커피 주문이라는 문제를 위해서는 다음과 같은 기능이 필요해요.
* 커피를 만들기
* 재료를 파악하기
* (재료가 무제한은 아닐테니) 재료의 양을 구하기
* 재료의 양을 관리하기

이 정도로 정리해볼께요.
책임을 부과해본다면,
* 커피 만들기는 직원이
* 재료를 파악하기는 커피가
* 재료의 양을 구하고, 관리하기는 창고가

하는 것이 자연스러워보여요. 협력 관계도 볼까요?
커피를 만들기 위해, 커피에게 재료를 파악 후, 창고에게 만들 수 있는지 확인하면 되겠네요.

이정도로 객체에 대한 복습을 간단하게 해보았어요.
그럼 이제 본격적으로 미션을 수행해볼까요? -> [미션코스 1주차 명세서](./1st-spec.md)
1 change: 1 addition & 0 deletions TODO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# 턴제 게임
25 changes: 25 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
plugins {
id 'java'
}

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

java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}

repositories {
mavenCentral()
}

dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter:5.7.1'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
useJUnitPlatform()
}
Binary file added gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
7 changes: 7 additions & 0 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Loading

0 comments on commit c9f220c

Please sign in to comment.