Atani 퀴즈
프로그래머스 코테 연습
C++
던전 탈출 텍스트 RPG
Player소유권 구조 변경 (참조 → 소유)- 지금까지
Player가PlayerStatus&/PlayerInventory&를 참조로 들고 있고, 각 Job 생성자(Warrior(PlayerStatus&, PlayerInventory&))에서 외부에서 만든 객체를 주입받는 구조였다. 참조 대신Player가std::unique_ptr<PlayerStatus>,std::unique_ptr<PlayerInventory>,std::unique_ptr<PlayerEnhancement>를 멤버로 직접 소유하도록 바꾸고, Job 생성자는Warrior(const std::string playerName)처럼 이름만 받도록 정리했다. - 참조를 계속 들고 있으려면
Player생성 이전에PlayerStatus/PlayerInventory를 별도로 만들어서 넘겨줘야 했는데, 소유로 바꾸면서Player하나만 만들면 내부에서 필요한 객체를 알아서 생성한다. 대신 헤더에서#include대신 전방 선언(class PlayerStatus;)만 남기고 실제 include는 cpp로 내렸다.
- 지금까지
- 경험치(EXP) / 레벨업 시스템 추가
MonsterInfo에 있던exp를Monster::getExp()로 노출하고, 던전에서 몬스터를 잡으면player->setPlayerExp(monster->getExp())를 호출하도록 연결Player에level별로 필요한 경험치 테이블(expTable)을 두고,setPlayerExp()가 누적 경험치가 다음 레벨 요구치를 넘으면 레벨을 올리고 남은 경험치로 재귀 호출하도록 구현. 한 번에 여러 레벨을 올려도 남은 경험치가 유실되지 않는다.
- 직업별 공격 특성 분리
- 지금까지는 모든 직업이
monster->takeDamage(ap)한 번으로 동일하게 공격했는데, 궁수(Archor)는 공격력을 3등분해서 3번, 도적(Thief)은 5등분해서 5번 나눠 때리도록 바꿔 직업별로 손맛이 다르게 느껴지도록 했다.
- 지금까지는 모든 직업이
- 레벨업 시 스탯 증가
- 레벨업이 발생하면
PlayerStatus::plusPlayerStatus()로 HP +10, MP +5, 공격력 +5를 바로 반영하도록 추가. 기존controlPlayerStatus(st, StatModifier{...})호출부를 감싸는 형태로 짧게 씀
- 레벨업이 발생하면
- 인벤토리에서 아이템 바로 사용하기
showInventory()가 목록만 보여주고 끝나던 걸, 번호를 입력해서 그 자리에서 포션과 같은 아이템을 사용할 수 있도록 확장.PlayerInventory가Potion*을 들고 있다가(setPotion()) 사용 요청이 오면potion->use(itemName, count)를 호출하는 방식- 숫자 입력 검증(
cin.fail()체크, 버퍼 비우기)이PlayerInventory,WorkshopManagement,PlayerEnhancement,PlayerStatus,textrpg.cpp등 여러 곳에서 똑같이 반복되고 있길래,Utils/Input.h에 템플릿 함수readInput<T>()/readRangedPair<T>()로 만들고 전부 이걸 쓰도록 정리
