C#) Team Text RPG 2
오늘은 코드를 리팩토리 해보고, 더 간단해 보이도록 수정했다.
보상 시스템도 한번 제작 해볼 기회가 있었다.
StoreScene
private void StoreScene()
{
// 다음 Scene 지정
Action nextScene = StoreScene;
int result = -1;
// StoreScene 출력
DisplayManager.StoreScene(player, items);
result = UtilManager.PlayerInput(0, 2);
switch (result)
{
case 0:
GameManager.Instance.ChangeScene(SceneState.LobbyManager);
return;
case 1: // 구매 페이지
nextScene = BuyItemScene;
break;
case 2: // 판매 페이지
nextScene = SellItemScene;
break;
}
nextScene();
}
기존 while과 또 다른 변수로 진행했던 점을, 반복문이 없는 개념으로 다시 정리해봤다.
GameManager.Instance.ChangeScene(SceneState.LobbyManager)와 같은 내가 생각한 구조랑 달라, 오로지 nextScene으로만 구현이 불가능해 졌다.
StoreScene 내부에선 내가 생각한 대로 흘러가게 두고, 다른 Scene 이동은 팀원들과 맞춘 방법으로 통일했다.
Reward
Item
// 50%로 아이템 반환 및 적용
public MountableItem? Item(Player player)
{
MountableItem item;
// 장비 아이템 얻을 확률
int odds = 50;
int random = ranFunc(0, 100);
if (odds > random)
{
// 무기, 방어구 반반
if (5 < ranFunc(0, 10))
{
item = rewardItem(rewardWeapon, mountableItems);
}
else
{
item = rewardItem(rewardArmor, mountableItems);
}
return item;
}
return null;
}
아이템을 보상으로 주는 알고리듬이다.
50% 확률로 아이템을 획득하고, 그 후 다시 50% 확률로 공격 또는 방어 아이템을 획득한다.
rewardItem
T rewardItem<T>(List<T> reward, List<T> result) where T : MountableItem
{
T item;
do
{
item = reward[ranFunc(0, reward.Count)];
item.Own = true;
// 무한 반복 방지
int count = 0;
foreach (T item2 in reward)
{
if (item2.Own)
{
count++;
}
}
if (count == reward.Count)
break;
}
// 아이템 중복 검사. 중복이면 한번 더
while (result.Contains(item));
return item;
}
이 프로젝트를 진행하며, c#에서는 처음으로 제너릭 타입을 작성해 볼 수 있었다.
where T : MountableItem T에 제한을 걸 수 있는 개념도 알게 되었다.
생각해보니 C++의 템플릿이 있었다.
제너릭과 마찬가지로 데이터 타입에 의존하지 않는 함수와 클래스를 만들 수 있었다.
댓글남기기