-
내일배움캠프 13일차 TIL - 전투 구현 마무리TIL/C# 2024. 5. 1. 20:38
[학습목표]
팀 프로젝트에서 전투 기능 구현을 마무리하고 필수 요구사항 구현을 완료한다.
[학습내용]
어제 전투기능 중 플레이어 공격 기능 구현을 완료했기 때문에, 오늘은 몬스터의 공격을 구현했다. 플레이어 공격 직후에 몬스터 공격 차례가 오기 때문에, AttackScene이 끝날 때 MonsterAttackScene을 호출했다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace OceanStory.Scenes { internal class MonsterAttackScene : Scene { public override void RunScene() { while (true) { Console.Clear(); Console.WriteLine("Battle!!"); Console.WriteLine("\nLv.{0} {1} 의 공격!", Program.BattleManager.monsters[Program.BattleManager.TargetIndex].Level, Program.BattleManager.monsters[Program.BattleManager.TargetIndex].Name); Console.WriteLine("{0} 을(를) 맞췄습니다. [데미지 : {1}]", Program.Character.Name, Program.BattleManager.monsters[Program.BattleManager.TargetIndex].Atk); Console.WriteLine("\nLv.{0} {1}", Program.Character.Level, Program.Character.Name); Console.WriteLine("HP {0} -> {1}", Program.BattleManager.PlayerBeforeHp, Program.Character.CharacterDead ? "Dead" : Program.Character.Hp); Console.WriteLine("\n0. 다음"); int input = Program.SceneManager.GetUserInput(0); if (input == 0) return; } } } }
화면을 출력하는 곳에서 어려웠던 점은 HP의 변동이 생겼을 때, 변동 전의 HP 정보를 어떻게 저장해서 출력할 것인가였다. 우선 배틀 매니저 클래스 안에 변수로 만들어서 저장하긴 했는데, 아주 좋은 방법은 아닌 것 같다. 클래스 간 결합도를 낮추기 위한 방법을 더 찾아봐야 할 것 같다.
화면 출력 이외의 곳에서 어려웠던 점은 플레이어든 몬스터든 Dead가 되는 순간 전투를 종료하는 것이다. 조건문으로 체크해서 리턴하면 되는데, 문제는 그것을 언제 체크할 것인가였다. 이것도 배틀 매니저 안에 구현해놓았다.
다음은 전투 결과 씬이다. 승리와 패배 모두 한 클래스로 만들었다.
using OceanStory.Interfaces; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace OceanStory.Scenes { internal class BattleResultScene : Scene { public override void RunScene() { while(true) { Console.Clear(); Console.WriteLine("Battle!! - Result"); if (Program.BattleManager.Winner == 1) { int beforeExp = Program.RewardManager.CharacterExpUp(); int beforeLevel = Program.RewardManager.CharacterLevelUpCheck(); Console.WriteLine("\nVictory"); Console.WriteLine("\n던전에서 몬스터 {0}마리를 잡았습니다.", Program.BattleManager.monsters.Count()); Console.WriteLine("\n[캐릭터 정보]"); Console.WriteLine("Lv.{0} {1} -> Lv.{2} {3}", beforeLevel, Program.Character.Name, Program.Character.Level, Program.Character.Name); Console.WriteLine("HP {0} -> {1}", Program.BattleManager.PlayerStartHp, Program.Character.Hp); Console.WriteLine("Exp {0} -> {1}", beforeExp, Program.Character.Exp); } else { Console.WriteLine("\nYou Lose"); Console.WriteLine("\nLv.{0} {1}", Program.Character.Level, Program.Character.Name); Console.WriteLine("HP {0} -> {1}", Program.Character.MaxHp, "0"); } Console.WriteLine("\n0. 다음"); int input = Program.SceneManager.GetUserInput(1); if(input == 0) return; } } } }
여기까지가 전투 기능 구현이었고, 이로써 필수 구현 기능은 모두 구현했다.
이후 팀원들이 추가로 선택 요구사항을 구현한 걸 합쳤다. 목록은 아래와 같다.
- 로그인
- 이름과 직업 선택
- 경험치와 레벨업
그리고 나는 그동안 퀘스트 기능을 구현해보기로 했다.
아래는 QuestScene.cs이다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace OceanStory.Scenes { internal class QuestScene : Scene { public override void RunScene() { while (true) { Console.Clear(); Console.WriteLine("Quest!!\n"); if (Program.QuestManager.QuestList != null) { for (int i = 0; i < Program.QuestManager.QuestList.Count(); i++) { Console.WriteLine("{0}. {1}", i + 1, Program.QuestManager.QuestList[i].QuestName); } } int input = Program.SceneManager.GetUserInput(Program.QuestManager.QuestList.Count(), "원하시는 퀘스트를 선택해주세요", 0); Program.QuestManager.QuestIndex = input - 1; if (input == 0) return; else Program.SceneManager.ChangeScene("QuestDetailScene"); } } } }
그리고 아래는 이어지는 QuestDetailScene.cs이다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace OceanStory.Scenes { internal class QuestDetailScene : Scene { public override void RunScene() { List<Quest> questList = Program.QuestManager.QuestList; int questIndex = Program.QuestManager.QuestIndex; while (true) { Console.Clear(); Console.WriteLine("Quest!!\n"); Console.WriteLine(questList[questIndex].QuestName + "\n"); Console.WriteLine(questList[questIndex].Description + "\n"); Console.WriteLine("- {0} ({1}/{2})\n", questList[questIndex].QuestObjective, questList[questIndex].QuestClearedCount, questList[questIndex].QuestObjectiveCount); Console.WriteLine("- 보상"); foreach(Item reward in questList[questIndex].QuestRewards) { Console.WriteLine(reward); } Console.WriteLine("\n1. 수락\n2. 거절"); int input = Program.SceneManager.GetUserInput(2); if (input == 1) questList[questIndex].IsAccepted = true; break; } } } }
아직 구현이 덜 끝나서 내일 다시 이어서 해봐야겠다.
[결과물]
https://github.com/Gambling7l7l7JackPot/OceanStory
[회고]
하나하나가 어렵다기보다 구현해야할 게 너무 많다. 특히 베이스가 없이 처음부터 시작하는 것이다보니 아이템부터 캐릭터, 직업, 스킬, 몬스터 하나하나 다 구현해야 한다. 그런데 이번 주 안에 열심히 구현하면 다음엔 다시 시작한다는 사실이 자꾸 떠올라서 매너리즘에 빠지게 된다. 쉽지 않다.
'TIL > C#' 카테고리의 다른 글
내일배움캠프 15일차 TIL - 팀 프로젝트 마무리 (1) 2024.05.03 내일배움캠프 14일차 TIL - 퀘스트 구현 (1) 2024.05.02 내일배움캠프 12일차 TIL - 팀 프로젝트 전투 기능 관련 (0) 2024.04.30 내일배움캠프 11일차 TIL - 텍스트 기반 RPG 제작 팀 프로젝트 기초 (1) 2024.04.29 내일배움캠프 10일차 TIL - 인터페이스, enum, 학습법 특강 (1) 2024.04.26