TIL

2024/01/04 TIL

jhwoo1221 2024. 1. 4. 20:49

'오늘의 일에서 나는 어떤 것을 배웠는지' - 학습

오늘은 새로운 것을 학습하기보다는 배운 것을 복습하고 응용하는데 집중했다.


'오늘의 나는 무엇을 잘했는지' - 성취

 

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으로 변경.)
}
}
}




'오늘의 나는 어떤 문제를 겪었는지, 앞으로 어떻게 해결할 것인지' - 개선

설계 구문을 실제 코드로 작성하는 과정에서 예상치 못한 문제들을 마주하게 되는데,

주로 '여기서 저 객체의 저 멤버를 참조하려면, 선별하려면 어떻게 해야하지..?' 이다.

그리고 아직도 그렇게 복잡한 값을 선별하고 참조하는 방법이 어렵고 복잡해서 봐도 원리를 이해하는게 힘들다.

점차 익숙해지고 능숙해지기 위해 반복해서 사용하고 익히면서 코드를 이해하려고 노력해야겠다.

'TIL' 카테고리의 다른 글

2024/1/8 TIL  (1) 2024.01.08
2024/01/05 TIL  (0) 2024.01.05
2024/01/03 TIL  (0) 2024.01.03
2024/01/02 TIL  (1) 2024.01.02
2023/12/28 TIL  (0) 2023.12.28