오늘은 코드를 리팩토리 해보고, 더 간단해 보이도록 수정했다.

보상 시스템도 한번 제작 해볼 기회가 있었다.

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++의 템플릿이 있었다.

제너릭과 마찬가지로 데이터 타입에 의존하지 않는 함수와 클래스를 만들 수 있었다.

댓글남기기