-
2023.12.29 - 주석 단축키, 조건문, 배열, 컬렉션TIL 2023. 12. 29. 21:12
오늘은 새로운 팀원들을 만나는 날입니다. 두근두근
분위기 메이커도 아니고 새로운 환경에 익숙해지는 것도 느린 편이라서 벌써부터 팀원이 바뀐다는게 아쉬운데요.(드디어 전 팀원분들과 좀 편해진 느낌이 들고 있었는데!!)
그래도 이번에 개인과제가 먼저 있어서 그 사이에 익숙해지지 않을까 기대하는 중입니다.
개인과제는 간단한 텍스트 게임 만드는 건데요. 강의를 다 듣고 난 후에 만들어도 되고 만들다가 모르는게 생기면 중간에 강의를 들어도 된다고 하셨습니다.
저는 강의를 다 듣고 난 후에 만들까 싶기도 한데요. 아니면 강의 듣다가 중간에 만들지도 모르겠습니다.
코드 짜는 아이디어가 생각나면 그때 그때 만드는게 잊지 않고 빠르게 만들 수 있을거같네요.
우선 기초 지식은 있다보니깐 만들어야하는 게임 내용을 보고 좀 생각난 것들을 정리해보고 강의를 들으면서 내용 정리를 해볼까합니다.
개인과제
필수사항
1. 게임 시작 화면 : WriteLine과 ReadLine으로 제작. 지정된 숫자 외 숫자 또는 글자 입력은 if문으로 처리
Menu2(Menu()); int Menu() { return Number(); } int Number() { int number = check ? n : -1; return number; } void Menu2(int n) { switch (n) }
메뉴 화면을 두개로 만들었습니다.
Menu()는 반복적으로 나올 첫 화면입니다. 여기서 선택한 값이 Menu2로 들어가서 switch를 통해 알맞는 화면을 보여주게 됩니다.
Number의 경우 플레이어가 입력하는 값이 int형인지 아닌지 확인하여 맞으면 그대로, 아니라면 -1로 return하게 만들어주었습니다. 메뉴뿐만 아니라 다른 함수들에서도 계속 사용될 예정입니다.
2. 상태보기 : WriteLine을 기본으로 제작. 장착한 아이템에 의한 수치 변경은 변수를 이용해서 처리
void State(int number) { outMenu(number); }
상태창입니다. Console.WriteLine을 이용해서 다 적어주었습니다.
아이템 장착 시 추가 되는 부분은 아직 만들지 못했습니다.
outMenu의 경우 선택지가 0. 나가기 밖에 없을 때 사용하기 위해 만들었습니다.
Menu2에서 얻은 n 값을 number로 받게 되어서 잘못된 입력을 할 시에 다시 원래 화면에 돌아갈 수 있게 만들어주었습니다.
예를 들어 Menu2에서 1을 입력하면 State 화면이 나타나게 됩니다. 이때 number = 1이 됩니다.
선택화면에서 부적절한 입력이 시도되었다면 outMenu가 실행이되는데, 처음 받았던 1이 그래도 outMenu(number)에 들어가게 되고, Menu2(number)을 이용하면 Menu2에서 1이 들어가기 때문에 원래 State 화면이 나오게 됩니다.
3. 인벤토리 : 아이템이 있으면 목록 보여주기. 아이템은 배열을 이용해서 처리. 아이템이 없으면 나가기만 보여주기
void Inventory(int number) { int n = Number(); if (n == 0); else if (n == 1) { if (itemName == null); else; } else; }
이중 if문을 이용해서 처음 선택했을 때에 맞는 화면으로 이동하도록 했습니다.
1. 장착관리를 선택하게 되었을 때 구매한 아이템이 없으면 다시 인벤토리 화면을 볼 수 있도록 했으며, 인벤토리에 아이템이 있으면 장착관리 화면으로 갈 수 있도록 설정했습니다.
아이템이 없으면 나가기만 보여주기는 아직 하지 않았습니다. 나중에도 할 수 있을지는 모르겠습니다.
그리고 itemName이 리스트로 만들었는데, null을 받지 않아가지고 조건은 다시 설정해야합니다.
3-1. 장착 관리 : 착용 시 [E] 추가. /r 이용하면 쉽게 추가 가능. [E] 제거는 좀 더 고민해봐야함. 번호를 입력하면 미착용 아이템은 착용으로 착용 아이템은 미착용으로 바꿈. 장착한 아이템에 의한 상태 변화도 신경써야함. 전역변수 사용.
void InventoryItem(int n) { switch (n) { case 0: if (itemName == null) { break; } else { for (int i = 0; i < itemName.Count; i++) } break; case 1: case 2: } }
switch와 if문을 이용해서 가지고 있는 아이템을 보여주려고 했습니다.
아직 Inventory함수가 완성되지 않았기 때문에 여기도 미완입니다.
list에도 인덱스가 있기 때문에 foreach를 이용하지 않을거라면 for문의 [ i ]를 이용해서 출력이 가능합니다.
4. 상점 : 보유 중이 골드가 구매 시 변경되야하며 아이템 목록에 구매된 아이템은 제거 또는 다시 구매 못하게 막고 구매되었음을 안내. 보유 골드가 아이템 가격보다 낮을 경우 구매 못하게 막아야함. 구매되면 인벤토리에 아이템 추가.
void Store(int number) { if (n == 0); else if (n == 1) { StoreBuy(); } else; } void StoreBuy() { int selectGold = 0; if (selectItem < 0 || selectItem > 6) { Console.WriteLine("잘못된 입력입니다.\n"); StoreBuy(); } else if (selectItem == 0) { Store(3); } else { selectGold = int.Parse(storeItemGold[selectItem - 1]); if (storeItemGold[selectItem - 1] == "구매완료"); else if (selectGold > Gold); else if (selectGold <= Gold); } } void StoreItemCreate() { string[] Name = new string[6]; string[] Stats = new string[6]; string[] Gold = new string[6]; for (int i = 0; i < Name.Length; i++); for (int i = 0; i < Stats.Length; i++) { Stats[i] = random.Next(1 + Lv, 5 + Lv).ToString("N0"); } for (int i = 0; i < storeItemGold.Length; i++) foreach (string n in Name) { storeItemName = Name; } foreach(string i in Gold) foreach (string i in Stats) } void StoreItem() { for (int i = 0; i < storeItemStats.Length; i++) { if (storeItemName[i] == "창" || storeItemName[i] == "검") } }
가장 많은 시간을 드린 상점입니다. 아직 미완입니다. 상점 리세가 가능합니다...
원래는 StoreItem함수만 이용해서 아이템을 만들려고 했는데, random.Next 때문에 상점화면에서 물건을 나열하고, 구매하기 위한 페이지로 넘어가면 다시 바뀌게 되어서 StoreItemCreate함수를 새로 만들게 되었습니다.
상점에서 나오는 아이템의 갯수는 6개로 고정시킬 것이기 때문에 배열로 만들어주었습니다.
foreach를 이용해서 class 안에 지역 변수에 넣어주어서 다른 함수들도 사용할 수 있도록 했습니다.
현재 item이름은 창, 검, 갑옷밖에 없습니다만 앞에 수식어를 추가해줄 예정입니다. 추가해줌에 따라서 아이템 설명도 추가될 예정입니다.
Gold와 스탯은 string으로 설정해주었습니다. 먼저 int로 설정했었는데 상점에서 구매한 뒤에 "구매완료" 문구를 넣을 때 불편하더라구요. 그래서 둘 다 string으로 설정해주었습니다. 생각해보면 스탯은 int로 냅두는게 좋았을 것 같습니다.
가지고 있는 골드와 string 타입 storeItemGold를 비교하기 위해서는 string 타입을 int로 바꾸는 일이 필요했습니다. 어찌되었던 int 형식의 string이기 때문에 Parse를 이용해서 쉽게 바꾸게 되었습니다.
나가기를 하면 store로 이동하게 되는데 store함수가 실행될 때마다 아이템이 바뀌기 때문에 store에서 나가기를 하거나 구매 후 나가기를 했을 때 store로 이동하기 때문에 상점 물품이 계속 바껴서 새롭게 구매할 수 있습니다.
구매 완료 후 다시 구매할 때는 바뀌지 않지만 구매 다하고 나갈 때 바뀌기 때문에 이건 수정할 필요가 있습니다.
중복되는 부분이 많아서 함수로 처리한 경우가 많고 if 함수는 생각보다 사용 안했음.
선택사항
1. 아이템 정보를 클래스 / 구조체로 활용해보기 : 강의를 듣고 생각.
2. 아이템 정보를 배열로 관리하기 : 생각했던 방법이지만 강의를 듣고 작성
3. 아이템 추가하기 : 배열로 관리하게 되면 추가는 쉽다고 생각됨. 나만의 새로운 아이템을 추가한다는 것은 플레이어가 따로 추가가 가능하게 만든다는 것인지 잘 모르겠음.
4. 아이템 판매하기 : 배열로 관리하게 되면 제거는 쉽다고 생각됨. 단, 판매금액은 원가격의 85%이며, 착용하고 있는 아이템은 판매 불가로 지정. 착용 해제 시 판매 가능으로 바꿈. 이 더 좋을 것 같음. 판매되면 보유 골드 증가.
5. 장착 개선 : 방어구와 무기는 한개씩만 장착가능. 그러므로 새로운 아이템을 장착하기 위해 선택했을 때 자동으로 장착하고 있던 아이템은 장착해제되게 만들기. null활용이 중요하다고 생각됨
6. 던전입장 기능 추가 : 3가지 난이도 던전으로 방어력으로 던전 수행 가능성 판단 및 안내. 방어력이 낮아도 클리어는 가능하지만 확률에 따라 실패도 넣어두기. 방어력 높으면 클리어 확률 증가. 공격력도 기준으로 넣어서 공격력도 높으면 클리어 확실하게 가능. 방어력 낮고 공격력 높으면 실패확률 감소. 등 기준을 넣어두기.
6-1. 클리어 시 : 클리어 보상 추가. 난이도에 따른 골드와 아이템 증정. 체력은 감소.
6-2. 실패 시 : 체력 감소 비율이 큼. 남은 체력만큼 소지 아이템 또는 착용 아이템을 잃어버릴 확률 추가.
7. 휴식기능 추가 : 소정의 골드 사용으로 휴식 가능. 휴식 시 체력이 풀로 회복됨.
8. 레벨업 기능 추가 : 레벨이 높을 수록 많은 던전을 클리어해야지 레벨 업 가능. 레벨 업 시 기본 공격력과 방어력 증가. 기본 공격력과 방어력 증가에 따른 표시는 따로 하지 않음.
9. 게임 저장하기 추가 : 할 수 있을지 모르겟음
아이템 정보 배열로 관리하기는 우선 리스트나 딕셔너리로 관리.
강의 정리
주석
// : 한줄만 주석
/* */: 여러줄 주석
이미 적어놓은 코드를 주석 처리 : ctrl + K -> ctrl + C
주석 처리되어 있는 코드 해제 : ctrl + K -> ctrl + U
특수 문자
\' : ' 삽입
\" : " 삽입
\\ : \ 삽입
연산자 우선 순위
괄호() - 다항 연산자(++,--,!) - 산술 연산자(*,/,%,+,-) - 시프트 연산자(<<,>>) - 관계 연산자(<,>,==, != 등) - 논리 연산자(&&,||) - 할당 연산자(=,+=,-=,*=,/= 등)
함수
WriteLine() : 받은 인자를 나타나게 하고 커서를 다음 줄로 넘긴다.("\n" 사용 안해도 됨)
Write() : 받은 인자를 나타나게 하고 그 옆에 커서를 둔다.("\n" 사용해서 다음 줄로 넘길 수 있음)
ReadLine() : 콘솔에서 입력한 값을 받는다.(무조건 string)
WriteLine("{0} {1} {2}", 10, 20, 30) : {0} = 10, {1} = 20, {2} = 30 이 들어간다.
Split("A") : A를 기준으로 string을 나눠서 배열요소로 만들어준다.
변수.IndexOf() : 변수 안에 있는 문자열의 첫번째 인덱스를 찾아 새로운 변수에 저장해준다.
변수.Replace( , ) : 변수 안에 있는 첫번째 인자를 두번째 인자로 변경해서 새로운 변수에 저장해준다.
타입.Compare( , ) : 첫번째 인자와 두번째 인자의 대소를 비교해준다. 0이면 같고, 0보다 작으면 두번째 인자가 크고, 0보다 크면 첫번째 인자가 크다. string의 경우 아스키 코드를 이용해서 비교한다.
$" {변수명} " : 변수명에 있는 값을 바로 가져옴.
if문과 switch문
switch - case - break;
switch문으로 만든 코드는 if문으로 만들 순 있지만 간단하게 만들기 위해서 switch를 사용하는게 좋을 수도 있다.
예. ReadLine으로 받은 int 값에 맞춰서 맞는 case 내용을 출력하게 하는 것. if문은 변수 == 값으로 else if를 계속 사용해줘야하므로 간단하게 느껴지지 않음.
break switch문 밖으로 나가게 만듬.
삼항 연산자
(조건식) ? 참 : 거짓;
if - else문에서 참, 거짓에 들어갈 내용이 한줄정도로 간단하다면 쓸만한 연산자.
배열 []
값들이 옆으로 계속 나열되는 형식
타입[] 배열 변수명 = new 타입[크기(인덱스 갯수)];
인덱스 갯수를 지정하기 때문에 크기가 변하지 않음.
2차원 배열 [행(가로 갯수), 열(세로 갯수)]
행열을 배웠지만 놀랍게도 가로 세로인지 구분을 잘 못한다.
3차원 배열 [배열 판 갯수, 행, 열]
행열로 이루어진 2차원 배열이 배열 판 갯수만큼 존재.
.Length : 배열의 길이, 설정해둔 인덱스의 갯수이다.
컬렉션
배열이랑 비슷하지만 크기가 계속 바뀜
사용을 위해서는 System.Collections.Generic 추가 필요
나열되는 형식이 아니므로 .Length 대신 .Count 사용.
1. List
List<타입> 변수명 = new List<타입>();
2. Dictionary
Dictionary<string, 타입> 변수명 = new Dictionary<string, 타입>();
키 : string 와 값 : 타입 으로 이루어 데이터 저장.
3. Stack
Stack<타입> 변수명 = new Stack<타입>();
후입선출 .Push()로 값 입력
4. Queue
Queue<타입> 변수명 = new Queue<타입>();
선입선출 .Enqueue()로 값 입력
5.HashSet
HashSet<타입> 변수명 = new HashSet<타입>();
중복되지 않는 요소만 이루어져 있음
.Add()로 값 입력 가능.
타입은 서로 같아야함.
foreach (타입 변수명 in 컬렉션 변수명)
for을 사용하지 않고 컬렉션에 있는 값들을 차례로 다른 변수에 넣어줄 수 있다.
깃 사용법 때문에 전에 썼던 글 보러 갔는데 올리는 것 때문에 공개로 두었더니 한분이 댓글을 남겨주셨더라구요.
누구신지 모르겠지만 우선 감사합니다.
제 글이 도움이 되었는지는 모르겠지만 도움이 되었으면 좋겠네요!
그리고 제목에 날짜만 적어두니깐 이전에 적었던 글에서 찾기가 어렵더라구요. 날짜말고도 내용을 간단하게 적어볼까합니다.
원래는 모든 코드를 다 적어서 설명을 적었다면, 모든 코드를 보여주지 않는 것이 좋다고 하셨기에 함수 안에 있는 내용들 일부를 잘랐습니다. 나중에 제가 찾아봤을 때 이렇게 하는게 좋았지! 라고 생각이 들어야하기 때문에 어떻게 잘라야할지 모르겠지만 우선 이렇게 잘랐습니다.
내일은 수정해야할 부분 수정하면 추가적으로 더 만들어볼 것 같습니다.
굿굿
'TIL' 카테고리의 다른 글
2024.1.3 (1) 2024.01.03 2024.1.2-class (1) 2024.01.02 2023.12.28 (0) 2023.12.28 2023.12.27 (1) 2023.12.27 2023.12.26 (1) 2023.12.26