<구상 및 설계>

기본적으로 게임 시작화면과 선택지를 눌렀을 때, 캐릭터의 상태를 볼 수 있는 상태 보기창과 인벤토리 창으로 구성할 예정이다.

능력이 된다면 던전까지 구현하고 싶지만 시간과 능력 부족으로 팀 프로젝트 때 함께 구현해야할 것 같다.

 

게임 시작

- 1. 상태 보기

- 2. 인벤토리 - 1. 장착 관리

- 3. 상점

- 4. 던전 입장

 

<구현>

게임 시작

// 선택지
static int CheckValidInput(int min, int max)
{
    while (true)
    {
        string input = Console.ReadLine();

        bool parseSuccess = int.TryParse(input, out var ret);
        if (parseSuccess)
        {
            if (ret >= min && ret <= max)
                return ret;
        }

        Console.WriteLine("잘못된 입력입니다.");
    }
}

// 메인화면
static void GameLogo()
{
    Console.WriteLine("= Sparta Dungeon =");
    Console.WriteLine("1. 게임시작");
    Console.WriteLine("0. 나가기");
    Console.WriteLine();
    Console.WriteLine("원하시는 행동을 입력해주세요.");
    Console.Write(">> ");

    int input = CheckValidInput(0, 1);
    switch (input)
    {
        case 0:
            break;
        case 1:
            DisplayGameIntro();
            break;
    }
}

// 스타트
static void DisplayGameIntro()
{
    Console.Clear();
    Console.WriteLine("==================================================");
    Console.WriteLine("스파르타 마을에 오신 여러분 환영합니다.\n이곳에서 던전으로 들어가기 전 활동을 할 수 있습니다.");
    Console.WriteLine("==================================================");
    Console.WriteLine();
    Console.WriteLine("1. 상태 보기\n2. 인벤토리\n0. 메인화면");
    Console.WriteLine();
    Console.WriteLine("원하시는 행동을 입력해주세요.");
    Console.Write(">> ");

    int input = CheckValidInput(0, 2);
    switch (input)
    {
        case 0:
            Console.Beep();
            Main();
            break;
        case 1:
            DisplayMyInfo();
            break;
        case 2:
            DisplayInventory();
            break;
    }
}

 

상태 보기

class Program
{
	private static Character player;
    
    // 메인
    static void Main(string[] args)
    {
        GameDataSetting();
        DisplayGameIntro();
    }
    
    // 각종 데이터
    static void GameDataSetting()
    {
        // 캐릭터 정보 세팅
        player = new Character("Chad", "전사", 1, 10, 5, 100, 1500);

        // 아이템 정보 세팅
    }

    static void DisplayMyInfo()
    {
        Console.Clear();
        Console.Title = "= Information =";

        ChooseTextColor("= 상태 보기 =");
        LineTextColor("캐릭터의 정보가 표시됩니다.");
        Console.WriteLine();
        StatTextColor("Lv. ", player.Level.ToString("00")); // 00, 07 등 한자릿수도 두자릿수로 표현하기 위해 string 타입으로 변환
        Console.WriteLine();
        Console.WriteLine("{0} ( {1} )", player.Name, player.Job);
        StatTextColor("공격력 : ", player.Atk.ToString());
        Console.WriteLine();
        StatTextColor("방어력 : ", player.Def.ToString());
        Console.WriteLine();
        StatTextColor("체 력 : ", player.Hp.ToString());
        Console.WriteLine();
        StatTextColor("Gold : ", player.Gold.ToString());
        Console.WriteLine();
        Console.WriteLine();
        ChooseTextColor("0. 나가기");
        Console.WriteLine();
        Console.WriteLine("원하시는 행동을 입력해주세요.");
        Console.Write(">> ");

        int input = CheckValidInput(0, 0);
        switch (input)
        {
            case 0:
                DisplayGameIntro();
                break;
        }
    }
}

// 플레이어의 캐릭터 상태 클래스
public class Character
{
    public string Name { get; }
    public string Job { get; }
    public int Level { get; }
    public int Atk { get; }
    public int Def { get; }
    public int Hp { get; }
    public int Gold { get; }

    public Character(string name, string job, int level, int atk, int def, int hp, int gold)
    {
        Name = name;
        Job = job;
        Level = level;
        Atk = atk;
        Def = def;
        Hp = hp;
        Gold = gold;
    }
}

 

인벤토리

class Program
{
	private static Character player;
	private static Item[] items;
    
    // 각종 데이터
    static void GameDataSetting()
    {
        // 캐릭터 정보 세팅
        player = new Character("Chad", "전사", 1, 10, 5, 100, 1500);

        // 아이템 정보 세팅
        items = new Item[10]; // 최대 아이템 10개
        AddItem(new Item("무쇠갑옷", "무쇠로 만들어져 튼튼한 갑옷입니다.", 0, 0, 5, 0));
        AddItem(new Item("낡은 검", "쉽게 볼 수 있는 낡은 검입니다.", 1, 2, 0, 0));
        AddItem(new Item("고양이 수염", "고양이 수염은 행운을 가져다 줍니다. 야옹!", 1, 7, 7, 7));
    }

    // 아이템 추가
    static void AddItem(Item item)
    {
        if (Item.ItemCount == 10) return; // 아이템이 꽉차면 아무일도 일어나지 않는다
        items[Item.ItemCount] = item; // 0개 -> items[0], 1개 -> items[1] ...
        Item.ItemCount++; // AddItem이 될 때마다 ItemCount가 올라간다
    }

    // 인벤토리
    static void DisplayInventory()
    {
        Console.Clear();
        Console.Title = "= inventory =";

        Console.WriteLine("인벤토리");
        Console.WriteLine("보유 중인 아이템을 관리할 수 있습니다.");
        Console.WriteLine();
        Console.WriteLine("[아이템 목록]");

        for (int i = 0; i < Item.ItemCount; i++)
        {
            items[i].ItemStat();
        }

        Console.WriteLine("");
        Console.WriteLine("1. 장착 관리\n0. 나가기");
        Console.WriteLine();
        Console.WriteLine("원하시는 행동을 입력해주세요.");
        Console.Write(">> ");

        int input = CheckValidInput(0, 1);
        switch (input)
        {
            case 0:
                DisplayGameIntro();
                break;
            case 1:
                DisplayerEquip();
                break;
        }
    }
}

// 아이템 클래스
public class Item
{
    public string Name { get; }
    public string Description { get; }
    public int Type { get; }
    public int AtkOption { get; }
    public int DefOption { get; }
    public int HpOption { get; }
    public bool IsEquipped { get; set; }

    public static int ItemCount = 0; // static을 붙임으로 Item이라는 클래스에 귀속된다

    public Item(string name, string description, int type, int atkOption, int defOption, int hpOption, bool isEquipped = false)
    {
        Name = name;
        Description = description;
        Type = type;
        AtkOption = atkOption;
        DefOption = defOption;
        HpOption = hpOption;
        IsEquipped = isEquipped;
    }
	
    // 아이템 착용여부
    public void ItemStat(bool wearItem = false, int index = 0)
    {
        Console.Write("- ");
        if (IsEquipped)
        {
            Console.Write("[");
            Console.Write("E");
            Console.Write("]");
        }
        Console.Write(Name);
        Console.Write(" | ");

        if (AtkOption != 0) Console.Write($"AtkOption {(AtkOption >= 0 ? "+" : "")}{AtkOption} "); // 삼항연산자
        if (DefOption != 0) Console.Write($"DefOption {(DefOption >= 0 ? "+" : "")}{DefOption} "); // 옵션이 0이 아니라면 옵션수치를 내보내라
        if (HpOption != 0) Console.Write($"HpOption {(HpOption >= 0 ? "+" : "")}{HpOption} "); // [조건 ? 참 : 거짓]

        Console.Write(" | ");

        Console.WriteLine(Description);
    }
}

 

장착관리

// 장착 관리
static void DisplayerEquip()
{
    Console.Clear();
    Console.Title = "= Item Equip =";

    Console.WriteLine("인벤토리 - 장착 관리");
    Console.WriteLine("보유 중인 아이템을 관리할 수 있습니다.");
    Console.WriteLine();
    Console.WriteLine("[아이템 목록]");
    for (int i = 0; i < Item.ItemCount; i++)
    {
        items[i].ItemStat(true, i + 1);
    }
    Console.WriteLine();
    Console.WriteLine("0. 나가기");
    Console.WriteLine();
    Console.WriteLine("원하시는 행동을 입력해주세요.");
    Console.Write(">> ");

    int input = CheckValidInput(0, Item.ItemCount);
    switch (input)
    {
        case 0:
            DisplayInventory();
            break;
        default:
            ToggleEquipStatus(input - 1); // 유저가 입력하는건 1, 2, 3...  실제 배열에는 0, 1, 2...
            DisplayerEquip();
            break;
    }
}

// 장비 장착 여부
private static void ToggleEquipStatus(int index)
{
    items[index].IsEquipped = !items[index].IsEquipped; // ! : 불형의 변수를 반대로 만들어주는 것
}

// 장비 능력치 더하기
private static int itemStatSumAtk()
{
    int sum = 0;
    for (int i = 0; i < Item.ItemCount; i++)
    {
        if (items[i].IsEquipped) sum += items[i].AtkOption;
    }
    return sum;
}
private static int itemStatSumDef()
{
    int sum = 0;
    for (int i = 0; i < Item.ItemCount; i++)
    {
        if (items[i].IsEquipped) sum += items[i].DefOption;
    }
    return sum;
}
private static int itemStatSumHp()
{
    int sum = 0;
    for (int i = 0; i < Item.ItemCount; i++)
    {
        if (items[i].IsEquipped) sum += items[i].HpOption;
    }
    return sum;
}

 

 

+ Recent posts