brunch

You can make anything
by writing

C.S.Lewis

[코딩삼국지] #7 군사 수송과 전쟁준비 구현

들어가는 글: 오늘은 군사 > 수송 기능과 전쟁준비 기능을 구현합니다 :-) 

오늘 작업 내용을 한 눈에 보시려면 아래 링크를 참고하세요 

깃헙 커밋: https://github.com/yudong80/coding-samguk/commit/4f95adce5ce5d054e3f5b3fd820f4e7be0df762f (벌써 10번째 커밋이네요) 


1. 수송 기능 


수송 기능은 A 땅에서 B 땅으로 금, 군량, 군마 등을 수송하며 

장수는 이동하지 않습니다. 


ISSUE #1: 오늘은 금과 군량만 수송하며, 그외 무기(군마, 강노, 노궁)은 구현하지 않습니다. 

ISSUE #2: 오늘은 인접한 지역으로의 수송만 가능합니다.  (먼 지역 불가)


6화에서 구현한 이동 기능에서 구현한 내용을 활용합니다. 


파일: coding.samguk.Province.java

메서드: transport() 

깃헙 링크: https://github.com/yudong80/coding-samguk/blob/main/V0/src/coding/samguk/Province.java



수송 기능의 핵심 기능은 

* 출발지의 금과 군량을 줄이고 

* 목적지의 금과 군량을 늘리는 것입니다. 

간단합니다. 


2. 수송 가능성 확인 


사전 확인 사항은 다음과 같습니다. 

1) 같은 군주의 지역인가? (조조의 땅에서 원술의 땅으로 수송할 없습니다.) 

2) 인접한 지역인가? 


구현 코드는 다음과 같습니다. (군사 이동과 수송이 동일한 메서드를 사용합니다)

파일: coding.samguk.Province.java

메서드: isTransferable() , isSameSoverign()


3. TODO의 기록 


앞서 Province.tranport() 에서는 다음과 같은 TODO (나중에 할일) 주석이 붙어 있습니다. 

3개의 //TODO 가 있습니다. 


이렇게 평소에 코딩하면서 (나중에 할일)을 적어두면 나중에 바로 처리할 수 있습니다. 


저는 vs code의 TODO tree 라는 확장(extension)을 활용하였습니다. 

확장을 추가하면 다음과 같이 좌측에도 창이 생깁니다. 

이 아이콘을 클릭하면 전체 TODO 목록을 볼 수 있습니다. 


코딩하시면서 TODO는 생각나는 즉시 적어두세요. 다시 떠올리려면 쉽지 않습니다. 


4. 전쟁준비 기능 구현 


전쟁준비는 군사의 사기를 높이는 기능입니다. 


ISSUE: 전쟁준비의 정확한 알고리즘은 공개되지 않았기 때문에 임의로 만들었습니다. 


파일: coding.samguk.General.java 

메서드: motivateSoldiers() 

깃헙 링크: https://github.com/yudong80/coding-samguk/blob/main/V0/src/coding/samguk/General.java 


5. 테스트 코드 


마지막으로 앞서 구현한 transport() 와 motivateSoliders() 메서드가 정상동작하는지 확인합니다. 


파일: coding.samguk.App.java

메서드: test군사_수송() 

깃헙 링크: https://github.com/yudong80/coding-samguk/blob/main/V0/src/coding/samguk/App.java 


메서드: test군사_전쟁준비() 


실행 결과는 다음과 같습니다. 


1) 홍농(12) 의 금 1500과 군량 30000을 낙양(11)로 수송합니다. 

장수 및 병사수는 변경되어서는 안됩니다. 


2) 낙양의 조조(무력: 89)와 하우연(무력: 90)이 전쟁 준비를 수행합니다. 

사기가 60 에서 97로 높아졌습니다. 


6. 보너스 


전쟁 준비 기능을 구현하기 위해 General 클래스에 

- int trained; //훈련 

- int morale; //사기 

멤버 변수를 추가하였고, 위 정보를 toString()에도 출력합니다. 


파일: coding.samguk.General.java 

멤버 변수와 toString() 메서드 


이렇게 toString() 메서드에는 디버그시 필요한 정보를 충분히 적어두는 것이 중요합니다. 

하지만 이메일과 비밀번호 같이 사적인 정보(privacy)가 유출되어서는 안됩니다. 


나머지 기능도 좀더 코딩해보겠습니다. 

감사합니다. 

2021.8.23

매거진의 이전글 [코딩삼국지] #6 군사 이동 구현
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari