STIKA

Unity 캠프 11일차 TIL < TextGame 2차 > 본문

프로그래밍/Unity + C#

Unity 캠프 11일차 TIL < TextGame 2차 >

STIKA 2024. 1. 8. 18:03

24.01.08 Mon

 

❤️ TIL

Today I Learned

❤️하루에 1%씩만 나아가도 4개월 동안 쌓이면 꽤 덩치가 커진답니다 :)


📌 오늘의 계획

  • 해설영상 보면서 지난주에 만든 TextGame 코드 정리
  • TextGame 추가기능 구현

 

✏️ 작업 내용

[선택요구사항]

아이템 정보를 클래스 / 구조체로 활용

아이템 정보를 배열로 관리

아이템 추가기능

판매하기 기능

장착기능 개선 - 중복 장착X, 부위별로 한개씩

장비가 장착되어있다면 자동으로 해제하고 장착

던전 입장 기능 - 던전 탐험

난이도별 구성 및 확률 및 보상

휴식기능

레벨업 기능

게임 저장하기 기능

 


 

 

세상에 세상에 이런게 있는지는 꿈에도 몰랐다.

https://textkool.com/en/ascii-art-generator?hl=default&vl=default&font=Red%20Phoenix&text=Your%20text%20here%20

 

ASCII art generator | TextKool

Copy and paste ASCII art generator. ASCII banner art text Generator to generate fancy text banner with more than 330 beautiful fonts

textkool.com

 

ASCII art라는데 내가 글씨를 적으면 이런걸 만들어준다.

코드에 가지고 와서 void StartLogo 하나 만들어서

Console.WriteLine으로 넣어주면 끝!!

 

 

Console.ReadKey();

화면을 잠깐 멈춰놓고 아무키나 눌렀을때 다음 진행상황으로 넘어가게 해줌

 

cw"

Console.WriteLine("");

를 자동으로 만들어주는 자동완성기능(?)

완전 편함

근데 해보니까 밑에 아무것도 없어야하더라

 

 

public static int GetPrintableLength(string str)
{
    int length = 0;
    foreach(char c in str)
    {
        if (char.GetUnicodeCategory(c) == System.Globalization.UnicodeCategory.OtherLetter)
        {
            length += 2; // 한글과 같은 넒은 문자에 대해 길이를 2로 취급
        }
        else
        {
            length += 1; // 나머지 문자에 대해 길이를 1로 취급
        }
    }

    return length;
}

public static string PadRightForMixedText(string str, int totalLenth)
{
    int currentLength = GetPrintableLength(str);
    int padding = totalLenth - currentLength;

    return str.PadRight(str.Length + padding);
}

한글은 문자 2개로 취급된다고 함

간격을 정렬시켜줄껀데 string의 PadRight나 PadLeft로는 한글에 한계가 있어서

따로 함수를 추가로 만듬

total 내가 원하는 총길이인데 한글고려x
str.length는 한글고려x
currentLength는 한글고려된 함수를 이용한 인트값을 반환함 한글고려 0 
padding = 한글Xtotal - 한글0current = 한글을 고려해서 넣어야할 패딩
padRight는 적어진 수치만큼 빈칸을 넣음

나름의 설명

 

<PadRight, PadLeft 사용방법>
String.PadLeft(number, char)
String.PadRight(number, char)

PadLeft는 총 길이가 number가 되도록 String의 왼쪽에 char를 반복하여 붙여넣기
PadRight는 총 길이가 number가 되도록 String의 오른쪽에 char를 반복하여 붙여넣기

<다른 방법>
String testString = testString.PadRight(10, 'Z');

10만큼 Z를 반복해서 붙여넣기

<주의사항>
PadLeft, PadRight가 적용된 String의 길이가 이미 더 길다면 추가하지 않는다.

PadRight, PadLeft 사용방법

이해가 안되서 구글링해서 찾아왔다.

 

internal class Game2
{
static Character player;
static Item[] items;
static void Main(string[] args)
{
    GameDataSetting();
    PrintStartLogo();
    StartMenu();
}

 요런식으로 While안쓰고 깔끔하게 만들수있음

 

<잘못된 입력 대비>

switch (CheckValidInput(1, 5))
{
    case 1:
        StatusMenu();
        break;
    case 2:
        InventoryMenu();
        break;
    case 5:
        return;
}

private static int CheckValidInput(int min, int max)
{
    int keyInput;
    bool result;

    do
    {
        Console.Write("\n원하시는 행동을 입력해 주세요.\n>> ");
        result = int.TryParse(Console.ReadLine(), out keyInput);
    } while(result == false || CheckIfValid(keyInput, min, max) == false);

    // 여기에 왔다는 것은 제대로 입력을 받았다는 것
    return keyInput;
}

private static bool CheckIfValid(int keyInput, int min, int max)
{
    if (min <= keyInput && keyInput <= max) return true;
    return false;
}

잘못된 입력 대비

비정상 입력 → 재입력 수행
1. 숫자가 아닌 입력을 받은 경우
2. 숫자가 최소-최대 범위를 넘은 경우


 

[개선가능사항] - 강의 다 듣게 되는날 이거 전부 완성시켜보기

아이템 배열 List으로 변경 (아이템 10개여야 할 이유 전혀 없음)

getSumBonusXXX계열함수 통일

인벤토리 정렬하기 

→ 인벤토리 정렬하기 기능은 4주차 LINQ / 람다 함수를 통해 가능

LINQ(4주차)를 활용한 리스트 정렬

→  var sortedItems = items.OrderBy(item => item.Name.Length).ToList();

람다 함수(4주차)를 활용한 리스트 정렬

→  item1.Name.Length.CompareTo(item2.Name.Length));

아이템 구매/판매하기

던전입장/휴식/레벨업 기능

장착 개선

→ 아이템 타입 변수와 Dictionary를 활용해서 구현

<샘플코드>

static Dictionary isTypeEquipped = new Dictionary();

static void ToggleEquipStatus(int idx)
{
    if (!isTypeEquipped.ContainsKey(idx))
        isTypeEquipped[idx] = false;
    if (isTypeEquipped[idx] == true && !items[idx].IsEquipped)
        return;
    items[idx].IsEquiped = !items[idx].IsEquiped;
}

 

데이터 저장 Newtonsoft.Json의 JsonConvert 클래스를 활용해서 구현

<샘플코드>

using Newtonsoft.Json;
using System.IO;
static void SaveItemsToJson(string filePath)
{
    string json = JsonConvert.SerializeObject(items, Formatting.Indented);

    File.WriteAllText(filePath, json); // JSON 문자열을 파일로 저장

    static void LoadItemsFromJson(string filePath)
    { 
        // 파일로부터 JSON 문자열을 읽기
        string json = File.ReadAllText(filePath);
        // JSON 문자열로부터 아이템 리스트를 역직렬화
        items = JsonConvert.DeserializeObject(json);
    }

 


📝 오늘의 마무리

확실히 튜터님 설명을 들으면서 만드니까

내가 왜 이걸 이렇게 어렵게 만들었나 싶은게 많았다

다 만들고 나서도 코드도 깔끔하고 이쁘고

코드의 재사용이 이런건가 싶을만큼

메서드 하나 잘 만들어서 꾸준히 쓰고

내가 할 땐 그냥 숙제같았는데

이렇게 만드니까 또 재미있다


 

✏️ 스스로 어제보다 한 발 더 나아갔다는 것을 자각하기

✏️ TIL을 쓰기 위해서라도, 오늘 반드시 단 하나라도 배우기

✏️ 꾸준히 기록을 남기는 습관 가지기

 

📕 오늘의 학습 키워드

📕  공부한 내용 본인의 언어로 정리하기

📕  오늘의 회고

📕  12시간 중 얼마나 몰입했는지

📕  더 나은 미래를 위해 내일 어떤 공부를 진행할 것인지