2024/01/04 TIL
'오늘의 일에서 나는 어떤 것을 배웠는지' - 학습
오늘은 새로운 것을 학습하기보다는 배운 것을 복습하고 응용하는데 집중했다.
'오늘의 나는 무엇을 잘했는지' - 성취
2주차 개인과제 - 텍스트 RPG 만들기의 로직을 메모장에 구문 형태로 작성했다.
무작정 코드를 작성하는 것보다 전체적인 로직 구조를 쭉 작성해 일종의 설계도를 만든 뒤에 코드 작성으로 옮기는 것이 시간은 더 오래걸릴지언정 코드 이해도를 높이고 버그나 오류를 예방하는데 용이할 것이라고 판단했기 때문이다.
다음은 설계 구문 전문이다.
(티스토리는 Tab 공백이 자동으로 생략되어 가독성이 나빠졌다..)
작성해야하는 패러미터 목록
1. 클래스 : 캐릭터
캐릭터의 다양한 정보들을 담는 클래스.
포함할 것
-레벨 (정수값)
-직업 (문자열)
-공격력 (정수값)
-방어력 (정수값)
-체력 (정수값)
-골드 (정수값)
2. 클래스 : 아이템
아이템의 다양한 정보를 담는 클래스.
포함할 것.
-이름 (문자열)
-스탯(공격력, 방어력, 체력) (정수)
-플레이버 텍스트 (문자열)
-가격 (정수)
-타입 ( 방어구 / 무기 )
-구매 여부 (bool)
-장착 여부 (bool)
3. 흐름도.
(캐릭터 클래스 정의)
(아이템 클래스 정의)
(room_manager 변수 정의)
(메인 함수)
{
캐릭터 인스턴스 생성
캐릭터 인스턴스 필드 멤버 초기화
아이템 인스턴스 생성
아이템 인스턴스 필드 멤버 초기화
(아이템 인스턴스를 생성할 때, item_array 배열에 담는다)
(아이템 인스턴스 중 구매 여부가 true인 아이템들을 선별해서 have_item_list 리스트를 만든다)
(사용자 초기 화면. 선택지 제시 후 입력받기.)
(최초 1회만 실행. 이후 무한 루프로 넘어감.)
(0일 경우 room_manager를 robby_room으로 변경.)
(1일 경우 room_manager를 status_room으로 변경.)
(2일 경우 room_manager를 inventory_room으로 변경.)
(3일 경우 room_manager를 shop_room으로 변경.)
(4일 경우 room_manager를 dengeon_room으로 변경.)
(5일 경우 room_manager를 rest_room으로 변경.)
(입력값이 1,2,3,4,5가 아닐 경우 다시 입력받는다.)
(와일 루프문)
{
if (room_manager == robby_room)
{
(사용자 초기 화면. 선택지 제시 후 입력받기.)
(1일 경우 room_manager를 status_room으로 변경.)
(2일 경우 room_manager를 inventory_room으로 변경.)
(3일 경우 room_manager를 shop_room으로 변경.)
(4일 경우 room_manager를 dengeon_room으로 변경.)
(5일 경우 room_manager를 rest_room으로 변경.)
(입력값이 1,2,3,4,5가 아닐 경우 다시 입력받는다.)
}
else if (room_manager == status_room)
{
스테이터스 표시
선택지 제시 후 입력받기.
(0일 경우 room_manager를 robby_room으로 변경.)
(입력값이 0 이 아닐 경우 다시 입력받는다.)
}
else if (room_manager == inventory_room)
{
보유중인 아이템 목록 표시
(for each와 Console.WriteLine(""); , have_item_list를 이용해 아이템 목록을 나타낸다.)
선택지 제시 후 입력받기.
(1일 경우 room_manager를 robby_room으로 변경.)
(2일 경우 room_manager를 equiping_item으로 변경.)
(입력값이 1, 2가 아닐 경우 다시 입력받는다.)
}
else if (room_manger == equip_item)
{
보유중인 아이템 목록 표시
(for each와 Console.WriteLine(""); , have_item_list를 이용해 아이템 목록을 나타낸다.)
선택지 제시 후 입력받기.
(0일 경우 room_manager를 inventory_room으로 변경.)
(1~n일 경우)
(해당 아이템 인스턴스의 장비 상태를 true일 경우 false, false 일 경우 true로 변경)
(해당 아이템 인스턴스의 타입을 구한다)
(그 아이템과 타입이 일치하는 아이템 중, 장착하고 있는 아이템이 있을을 경우)
(그 아이템 인스턴스의 장비 상태를 true → false로 변경)
(입력값이 0, 1~n이 아닐 경우 다시 입력받는다.)
(n은 보유중인 아이템 클래스 인스턴스를 담은 리스트의 길이)
}
else if (room_manager == shop_room)
{
보유 골드 표시
판매중인 아이템 목록 표시
(for each와 Console.WriteLine(""); , item_array를 이용해 아이템 목록을 나타낸다.)
선택지 제시 후 입력받기.
(0일 경우 room_manager를 robby_room으로 변경.)
(1일 경우 room_manager를 buying_item으로 변경.)
(2일 경우 room_manager를 selling_item으로 변경.)
(입력값이 0, 1이 아닐 경우 다시 입력받는다.)
}
else if (room_manager == buying_item)
{
판매중인 아이템 목록 표시
(for each와 Console.WriteLine(""); , item_array를 이용해 아이템 목록을 나타낸다.)
선택지 제시 후 입력받기.
(0일 경우 room_manager를 shop_room으로 변경.)
(1~n일 경우)
if (아이템 인스턴스의 구매 상태가 false일 경우)
if (보유 골드가 아이템 인스턴스의 가격 이상일 경우)
(해당 아이템 인스턴스의 구매 상태를 false → true로 변경)
(have_item_list에 해당 아이템 인스턴스를 추가함)
(보유골드 - 아이템 가격)
else
(Gold 가 부족합니다. 출력)
(다시 입력받는다)
else
(이미 구매한 아이템입니다. 출력)
(다시 입력받는다)
(입력값이 0, 1~n이 아닐 경우 다시 입력받는다.)
(n은 아이템 클래스 인스턴스를 담은 배열의 길이)
}
eles if (room_manager == selling_item)
{
보유중인 아이템 목록 표시
(for each와 Console.WriteLine(""); , have_item_list를 이용해 아이템 목록을 나타낸다.)
선택지 제시 후 입력받기.
(0일 경우 room_manager를 inventory_room으로 변경.)
(1~n일 경우 해당 아이템 인스턴스의 구매 상태를 true → false로 변경)
(해당 아이템 인스턴스의 장비 상태를 true → false로 변경)
(have_item_list에 해당 아이템 인스턴스를 제거함)
(보유골드 + 아이템 가격*75%)
(입력값이 0, 1~n이 아닐 경우 다시 입력받는다.)
(n은 보유중인 아이템 클래스 인스턴스를 담은 리스트의 길이)
}
else if (room_manager == dengeon_room)
{
선택지 제시 후 입력받기.
(0일 경우 room_manager를 robby_room으로 변경.)
(1일 경우 room_manager를 easy_dengeon으로 변경.)
(2일 경우 room_manager를 normal_dengeon으로 변경.)
(3일 경우 room_manager를 hard_dengeon으로 변경.)
(입력값이 0, 1, 2, 3이 아닐 경우 다시 입력받는다.)
}
else if (room_manager == easy_dengeon)
{
if ( 방어력 >= 5 )
{
체력 - (20 - (방어력 - 5) ~ 35 - (방어력 - 5) 의 랜덤값)
골드 + 1000
골드 + (1000 * (내 공격력 ~ 내 공격력 * 2) 의 랜덤값 * 1/100)
(축하합니다! 던전을 클리어 하셨습니다.)
선택지 제시 후 입력받기.
(1일 경우 변화 없음)
(0일 경우 room_manager를 dengeon_room으로 변경.)
(입력값이 0, 1이 아닐 경우 다시 입력받는다.)
}
else
{
랜덤 0~9중 하나를 고른다.
3 이하일 경우 실패.
(던전 탐색 실패)
체력 - (20 - (5 - 방어력 ) ~ 35 - (5 - 방어력) 의 랜덤값)*1/2
선택지 제시 후 입력받기.
(1일 경우 변화 없음)
(0일 경우 room_manager를 dengeon_room으로 변경.)
(입력값이 0, 1이 아닐 경우 다시 입력받는다.)
4 이상일 경우 성공.
체력 - (20 - (5 - 방어력 ) ~ 35 - (5 - 방어력) 의 랜덤값)
골드 + 1000
골드 + (1000 * (공격력 ~ 공격력 * 2) 의 랜덤값 * 1/100)
(축하합니다! 던전을 클리어 하셨습니다.)
선택지 제시 후 입력받기.
(1일 경우 변화 없음)
(0일 경우 room_manager를 dengeon_room으로 변경.)
(입력값이 0, 1이 아닐 경우 다시 입력받는다.)
}
}
else if (room_manager == normal_dengeon)
{
if ( 방어력 >= 11 )
{
체력 - (20 - (방어력 - 11) ~ 35 - (방어력 - 11) 의 랜덤값)
골드 + 1700
골드 + (1700 * (공격력 ~ 공격력 * 2) 의 랜덤값 * 1/100)
(축하합니다! 던전을 클리어 하셨습니다.)
선택지 제시 후 입력받기.
(1일 경우 변화 없음)
(0일 경우 room_manager를 dengeon_room으로 변경.)
(입력값이 0, 1이 아닐 경우 다시 입력받는다.)
}
else
{
랜덤 0~9중 하나를 고른다.
3 이하일 경우 실패.
(던전 탐색 실패)
체력 - (20 - (11 - 방어력 ) ~ 35 - (11 - 방어력) 의 랜덤값)*1/2
선택지 제시 후 입력받기.
(1일 경우 변화 없음)
(0일 경우 room_manager를 dengeon_room으로 변경.)
(입력값이 0, 1이 아닐 경우 다시 입력받는다.)
4 이상일 경우 성공.
체력 - (20 - (11 - 방어력 ) ~ 35 - (11 - 방어력) 의 랜덤값)
골드 + 1700
골드 + (1700 * (내 공격력 ~ 내 공격력 * 2) 의 랜덤값 * 1/100)
(축하합니다! 던전을 클리어 하셨습니다.)
선택지 제시 후 입력받기.
(1일 경우 변화 없음)
(0일 경우 room_manager를 dengeon_room으로 변경.)
(입력값이 0, 1이 아닐 경우 다시 입력받는다.)
}
}
else if (room_manager == hard_dengeon)
{
if ( 방어력 >= 5 )
{
체력 - (20 - (방어력 - 17) ~ 35 - (방어력 - 17) 의 랜덤값)
골드 + 2500
골드 + (2500 * (내 공격력 ~ 내 공격력 * 2) 의 랜덤값 * 1/100)
(축하합니다! 던전을 클리어 하셨습니다.)
선택지 제시 후 입력받기.
(1일 경우 변화 없음)
(0일 경우 room_manager를 dengeon_room으로 변경.)
(입력값이 0, 1이 아닐 경우 다시 입력받는다.)
}
else
{
랜덤 0~9중 하나를 고른다.
3 이하일 경우 실패.
(던전 탐색 실패)
체력 - (20 - (17 - 방어력 ) ~ 35 - (17 - 방어력) 의 랜덤값)*1/2
선택지 제시 후 입력받기.
(1일 경우 변화 없음)
(0일 경우 room_manager를 dengeon_room으로 변경.)
(입력값이 0, 1이 아닐 경우 다시 입력받는다.)
4 이상일 경우 성공.
체력 - (20 - (17 - 방어력 ) ~ 35 - (17 - 방어력) 의 랜덤값)
골드 + 2500
골드 + (2500 * (내 공격력 ~ 내 공격력 * 2) 의 랜덤값 * 1/100)
(축하합니다! 던전을 클리어 하셨습니다.)
선택지 제시 후 입력받기.
(1일 경우 변화 없음)
(0일 경우 room_manager를 dengeon_room으로 변경.)
(입력값이 0, 1이 아닐 경우 다시 입력받는다.)
}
}
else if (room_manager == rest_room)
{
(보유 골드 표시)
선택지 제시 후 입력받기.
(1일 경우)
if (골드 >= 500 일 경우)
(체력 = 100)
(골드 - 500)
(체력이 100이 되었습니다.)
else
(골드가 부족합니다.)
(0일 경우 room_manager를 dengeon_room으로 변경.)
(입력값이 0, 1이 아닐 경우 다시 입력받는다.)
}
else
{
(오류가 발생했습니다.)
(로비로 이동합니다.)
(room_manager를 robby_room으로 변경.)
}
}
}
'오늘의 나는 어떤 문제를 겪었는지, 앞으로 어떻게 해결할 것인지' - 개선
설계 구문을 실제 코드로 작성하는 과정에서 예상치 못한 문제들을 마주하게 되는데,
주로 '여기서 저 객체의 저 멤버를 참조하려면, 선별하려면 어떻게 해야하지..?' 이다.
그리고 아직도 그렇게 복잡한 값을 선별하고 참조하는 방법이 어렵고 복잡해서 봐도 원리를 이해하는게 힘들다.
점차 익숙해지고 능숙해지기 위해 반복해서 사용하고 익히면서 코드를 이해하려고 노력해야겠다.