2024-04-25

이재형·2024년 4월 25일
0

배운 내용

1. 인터페이스 (interface)

interface IMyInterface
{
    void Method1();
    int Method2(string str);
}
  1. 다른 클래스처럼 형식은 같지만 class나 struct가 아닌 interface와 멤버를 정의한다.
  2. 반환이 없는 메서드 Method1()과 int반환이 있는 Method2(string str)에 문자열 변수를 매개변수로 정의 함
class MyClass : IMyInterface
{
    public void Method1()
    {
        // 구현
    }

    public int Method2(string str)
    {
        // 구현
        return 0;
    }
}
  1. 상속처럼 해당 인터페이스 멤버를 추가를 함
  2. 인터페이스에 구현되었던 메서드를 생성함

정리:

1.인터페이스로 멤버를 정의한 클래스를 생성하면 인터페이스에 있는 메서드를 전부 사용해야함
2. 인터페이스는 틀이라고 생각하면 되고 후에 코드가 많을 때 헷갈리지 않게 해주는 장점을 가짐


2. 열거형 (enum)

enum MyEnum
{
    Value1,
    Value2,
    Value3
}
  1. enum이라는 타입과 해당 변수 명을 입력하고 {}안에 원하는 값을 적는다.

정리:

  1. 문자나 숫자중에서 종류를 묶어서 정리할 때 리스트나 배열로 묶어서 하는 방법보다 훨씬 간단하고 활용하기가 편하다.
  2. 디버프나 그런 종류가 여러 개를 비교할 때(switch, if 등) 조건을 걸 때 enum으로 해당 종류를 안에 저장하여 사용하는 습관을 가져야겠음

3. 예외 처리 (try, catch, finally)

try
{
    // 예외가 발생할 수 있는 코드
}
catch (ExceptionType1 ex)
{
    // ExceptionType1에 해당하는 예외 처리
}
catch (ExceptionType2 ex)
{
    // ExceptionType2에 해당하는 예외 처리
}
finally
{
    // 예외 발생 여부와 상관없이 항상 실행되는 코드
}
  1. try는 오류 즉, 예외의 일이 일어나는 부분을 실행하는 코드이다.
  2. catch는 try안에서 발생한 예외에 관해서 처리를 해주는 부분으로 예외 발생한 이유를 알아낼 수 있음
  3. finally는 예외가 발생하든 하지 않든 실행이 되는 코드이다.

정리:

  1. 코드를 작성하면서 예외가 발생할 지점에 추가하여 예외처리를 알아낼 때 효율적임
  2. 물론 디버깅하여 코드의 순서를 확인하는 방법도 있지만 코드를 많이 작성하여 복잡해진다면 알아내기 힘들기 때문에 판단하여 작성해야겠음
  3. catch부분에서 해당 오류를 발생하는 exception의 종류를 잘 알아야하는 추가적 정보가 필요함

4. 델리게이트 ( Delligate)

delegate int Calculate(int x, int y);

static int Add(int x, int y)
{
    return x + y;
}

class Program
{
    static void Main()
    {
        // 메서드 등록
        Calculate calc = Add;

        // 델리게이트 사용
        int result = calc(3, 5);
        Console.WriteLine("결과: " + result);
    }
}
  1. 생성을 할 때 반환없는 void, 반환있는 int, string 등을 사용하여 메서드처럼 매개변수를 추가를 하거나 않거나 할 수 있음
  2. 메서드를 정의했던 델리게이트와 같은 반환값과 매개변수를 같게 하여 정의함
  3. 같은 타입을 더 할 때처럼 +=를 사용하여 해당 메서드를 델리게이트에 추가함
  4. 델리게이트에 해당 매개변수를 추가하고 그 값에 출력하여 확인한다.

정리:

  1. 간단하게 설명하자면 같은 타입의 변수 값을 더하 듯이 같은 타입의 메서드를 더 한다고 생각하면 편함
  2. +=가 있듯이 -=도 있어서 게임에 기능을 추가허가나 제거할 때 사용하는 방법으로 응용을 할 수있음

스파르타 구현 내용

1. 던전 클리어, 실패, 보상 구현

static void Dungeon()
{
    Console.WriteLine("-----------------------------------------\n");
    Console.WriteLine("던전입장");
    Console.WriteLine("이곳에서 던전으로 들어가기전 활동을 할 수 있습니다.");
    Console.WriteLine("1. 쉬운 던전   | 방어력 5 이상 권장");
    Console.WriteLine("2. 일반 던전   | 방어력 11 이상 권장");
    Console.WriteLine("3. 어려운 던전 | 방어력 17 이상 권장");
    Console.WriteLine("0. 나가기\n");
    Console.Write("원하시는 행동을 입력해주세요:");
    Console.Write(">> ");
    string str = Console.ReadLine();
    switch (str)
    {
        case "0":
            Console.WriteLine("던전을 나갔습니다.");
            // 나가기
            break;
        case "1":
            DungeonStart(1, 5, 1000);
            break;
        case "2":
            DungeonStart(2, 11, 1700);
            break;
        case "3":
            DungeonStart(3, 17, 2500);
            break;
        default:
            Console.WriteLine("잘못된 선택지 입니다. 다시 입력해주세요!");
            Dungeon();
            break;
    }
}
  1. 던전에 들어가서 원하는 행동을 string으로 입력받는다.
  2. switch문으로 행동에 따른 던전, 나가기, 잘못된 입력을 처리하고 1~3번의 던전 같은 경우는 매개변수로 해당 난이도, 권장 방어력, 클리어 골드로 설정함
static void DungeonStart(int level, int defAvg, float ClearGold)
{
    // 랜덤 변수 생성
    Random random = new Random();
    // 권장 방어력보다 낮다면
    if (playerInfo.def + playerInfo.armor.vaule < defAvg)
    {
        Console.WriteLine("권장 방어력보다 낮습니다.");
        // 40%로 던전 실패
        if (random.Next(0, 10) > 5)
        {
            Console.WriteLine("40%로 던전 공략에 실패하였습니다.");
            // 보상 X , 체력 절반 감소
            playerInfo.hp -= (random.Next(20, 36) - playerInfo.def - defAvg) / 2;
        }
        else
        {
            Console.WriteLine("60%로 던전에서 도망쳤습니다.");
            // 보상만 X
        }
    }
    // 권장 방어력보다 높다면
    else
    {
        // 던전이 클리어 되고 방어력 수치에 따른 체력 감소 및 골드 획득
        Console.WriteLine("-----------------------------------------\n");
        Console.WriteLine("던전 클리어");
        Console.WriteLine("축하합니다!!");
        if (level == 1)
        {
            Console.Write("쉬운");
        }
        else if (level == 2)
        {
            Console.Write("일반");
        }
        else
        {
            Console.Write("어려운");
        }
        Console.WriteLine("던전을 클리어 하였습니다.\n");
        Console.WriteLine("[탐험 결과]");
        Console.WriteLine($"체력 {playerInfo.hp} -> {playerInfo.hp -= 
            random.Next(20, 36) - playerInfo.def - defAvg}");
        int attackMin = (int)playerInfo.str + playerInfo.weapon.vaule;
        int attackMax = ((int)playerInfo.str + playerInfo.weapon.vaule) * 2;
        int percentage = random.Next(attackMin, attackMax);
        Console.WriteLine($"Gold {playerInfo.gold} G -> " +
            $"{playerInfo.gold += ClearGold + ClearGold * (percentage / 100.0f)} G\n");
        Console.WriteLine("0. 나가기");
        Console.WriteLine("\n원하시는 행동을 입력해주세요.");
        Console.Write(">> ");
        string str = Console.ReadLine();
        while (str != "0")
        {
            Console.WriteLine("잘못된 입력입니다. 다시 입력해주세요.\n");
            Console.WriteLine("0. 나가기");
            Console.WriteLine("\n원하시는 행동을 입력해주세요.");
            Console.Write(">> ");
            str = Console.ReadLine();
        }
        playerInfo.ExpUp();
    }
}
  1. 먼저 매개변수로 받은 권장 방어력이 낮으면 보상은 없게 한다.
  2. 확률로 40%는 난이도에 따른 체력 감소를 시키고 던전에서 나가게 함
  3. 권장 방어력보다 높다면 클리어를 난이도에 따라서 다르게 출력한다.
  4. 공격력에 따라서 추가 보상을 하고 방어력에 따라서 체력을 감소하게 함
  5. 그 후 플레이어의 체력과 골드를 텍스트로 출력하여 알 수 있게 함
  6. 나가기 행동을 하게 하고 0입력시 나가고 다른 것을 입력 시 다시 입력하게 함

2. 저장 구현

static void SaveInfo()
{
    // 게임 저장
    Console.WriteLine();
    string json = JsonConvert.SerializeObject(playerInfo);
    string json1 = JsonConvert.SerializeObject(playerEquipments);
    string json2 = JsonConvert.SerializeObject(equipments);
    File.WriteAllText("infoSave.json", json);
    File.WriteAllText("playerEqSave.json", json1);
    File.WriteAllText("shopeqSave.json", json2);
    Console.WriteLine("데이터가 저장되었습니다.\n");
    gameEnd = false;
}
  1. json을 이용하여 해당 정보를 string형 json파일로 저장함
  2. 저장한 데이터를 파일로 저장함
  3. 저장이 되었다고 텍스트를 출력

3. 로드 구현

// 첫 시작
FirstText();
if (File.Exists("infoSave.json"))
{
    Console.WriteLine("저장된 정보가 있습니다.");
    Console.WriteLine("0. 네");
    Console.WriteLine("1. 아니요");
    Console.Write("이어서 하시겠습니까?");
    Console.Write(">> ");
    string str = Console.ReadLine();
    while (str == "1" && str == "0")
    {
        Console.WriteLine("잘못된 입력입니다. 다시 입력해주세요.\n");
        Console.WriteLine("0. 네");
        Console.WriteLine("1. 아니요");
        Console.Write("이어서 하시겠습니까?");
        Console.Write(">> ");
        str = Console.ReadLine();
    }
    // 게임 데이터를 불러옴
    if (str == "0")
    {
        // 저장한 데이터 불러오기
        string json = File.ReadAllText("infoSave.json");
        string json1 = File.ReadAllText("playerEqSave.json");
        string json2 = File.ReadAllText("shopeqSave.json");
        Info loadedInfo = JsonConvert.DeserializeObject<Info>(json);
        equipment[] loadedpleq = JsonConvert.DeserializeObject<equipment[]>(json1);
        equipment[] loadedsheq = JsonConvert.DeserializeObject<equipment[]>(json2);

        Console.WriteLine("정보를 불러옵니다.");
        playerInfo = loadedInfo;
        playerEquipments = loadedpleq;
        equipments = loadedsheq;
    }
    else
    {
        Console.WriteLine("처음 부터 시작합니다.");
    }
}
  1. 플레이어의 정보를 저장한 json파일이 있는지 확인하고 있다면 진행
  2. 정보를 이어 받을지 말지 정하고 이어 받는다면 진행하고 아니면 그대로 진행
  3. 저장했던 각 정보의 josn파일을 string으로 불러옴
  4. 변환 시킨 josn을 변환시켜 해당 데이터로 변경하여 정보를 로드함
  5. 로드한 정보를 생성자에 덮어씌움

4. 상점에 아이템 판매

static void SellEquipment()
{
    Console.WriteLine("-------------------------------");
    Console.WriteLine("상점");
    Console.WriteLine("필요한 아이템을 얻을 수 있는 상점입니다.\n");
    Console.WriteLine("[보유 골드]");
    Console.WriteLine(playerInfo.gold + "G\n");
    Console.WriteLine("[아이템 목록]");
    int count = 0;
    foreach (equipment equipment in playerEquipments)
    {
        if(equipment.name != null)
        {
            Console.WriteLine($"- {count + 1} {equipment.name} | {equipment.equipType} +{equipment.vaule} | {equipment.introduct}");
            count++;
        }
    }

    bool check = true;
    Console.WriteLine("\n판매할 아이템 이름을 입력해주세요.");
    Console.Write(">> ");
    string str = Console.ReadLine();
    count = 0;
    foreach (equipment equipment in playerEquipments)
    {
        // 검색한 아이템 이름이 있는지 확인하고 있다면
        if (str == equipment.name)
        {
            // 장비가 무기라면
            if (equipment.type == equipmentType.weapon)
            {
                // 플레이어의 무기 초기화
                playerInfo.weapon = new equipment();
            }
            else if (equipment.type == equipmentType.armor)
            {
                // 플레이어의 방어구 초기화
                playerInfo.armor = new equipment();
            }
            Console.WriteLine($"{equipment.name}을(를) 판매했습니다.\n");
            playerEquipments[count] = new equipment();
            equipments[count].buyCheck = false; // 해당 아이템 구매 여부 변경
            playerEquipments[count].buyCheck = false; // 플레이어 장비도 구매로 변경
            playerInfo.gold += (int)(equipment.gold * 0.85f); // 구매했으니 골드 감소
            check = false;
        }
        count++;
    }
    if (check)
    {
        Console.WriteLine("입력하신 아이템의 이름은 존재하지 않습니다.\n");
        Inventory();
    }
}
  1. 판매할 아이템을 string str변수에 저장 함
  2. foreach로 플레이어의 장비 구조체를 확인하여 이름이 같는지 확인함
  3. 없다면 존재하지 않다고 출력하지만 있다면 해당 아이템의 골드 85%만 플레이어에게 추가하게 함
  4. 플레이어가 장비 중인 장비라면 빈 장비로 변경
  5. 상점의 해당 장비가 구매완료 변수를 false로 하여 상점의 Text에 구매완료가 안뜨게 함

5. 클리어에 따른 레벨 업

public void ExpUp()
{
    exp += 1;
    // 경험치가 가득 차고 레벨이 5레벨 미만이라면
    if(exp == maxExp && level < 5)
    {
        Console.WriteLine("-------------------------------\n");
        Console.WriteLine("축하합니다! 레벨업을 하셨습니다.");
        Console.WriteLine($"레벨 {level} -> {++level}");
        Console.WriteLine($"공격력 {str} -> {str += 0.5f}");
        Console.WriteLine($"방어력 {def} -> {def += 1}");
        maxExp += 1;
        exp = 0;
    }
}
  1. 던전이 클리어 하면 실행이 되고 경험치를 1 상승시킨다.
  2. 경험치가 최대 경험치와 같아지면 레벨업 축하 텍스트를 출력한다.
  3. 공격력과 방어력을 레벨 업 전 후로 출력하여 증가량을 보여줌
  4. 경험치를 다시 0으로 초기화하고 최대 경험치량을 1 증가시킴

정리

진행 사항(스파르타 던전 Text게임)

1. 던전 난이도에 따른 클리어, 실패, 보상 구현

2. 게임 데이터 저장과 로드 구현

3. 상점에서 아이템 판매 구현

4. 던전 클리어 시 경험치 상승 후 조건에 따라 레벨 업

해결 못한 문제

없음

문제점

1. 클래스, 구조체, 메서드를 사용할 때 알맞게 나눠서 처리해야겠음

profile
한국사람

0개의 댓글