본문 바로가기

TIL

[TIL]2024-1-11 / 14일차 - C# 상점 판매 구현, 장비 장착 개선, 상태 출력

 

오늘은 팀 과제 기능 구현 작업 2일차이다.

 

     대략적인 오늘 한 일 :

  1. 알고리즘 코드카타 1문제
  2. 상점 판매 기능 구현
  3. 장비 장착 기능 개선
  4. 캐릭터 상태창 개선
  5. 다양한 UI 개선
  6. 버그 수정

 


 

1. 코드카타 1문제 

 

      사실 코드카타를 이전에 아직 기간이 아닌 것을 모르고 이전에 8문제를 풀어두어 중간부터 시작하였다.

코드카타 답안 깃허브 주소 : https://github.com/Orknology/DailyAlgorithmCodeKata

 

GitHub - Orknology/DailyAlgorithmCodeKata: This is a auto push repository for Baekjoon Online Judge created with [BaekjoonHub](h

This is a auto push repository for Baekjoon Online Judge created with [BaekjoonHub](https://github.com/BaekjoonHub/BaekjoonHub). - GitHub - Orknology/DailyAlgorithmCodeKata: This is a auto push rep...

github.com

 

이번에 푼 문제는 '짝수의 합' 문제이다.

 

문제 설명 :

 

제출 답안 : 

using System;

public class Solution {
    public int solution(int n) {
        int answer = 0;
        if(n > 0 && n <= 1000)
        {
            for(int i = 2; i <= n; i++)
            {
                if(i % 2 == 0)
                {
                    answer += i;
                } 
            }
        }
        return answer;
    }
}

 

 

 


 

2. 상점 판매 기능 구현

 

      베이스 코드에 상점은 있으나 상점 판매 기능은 없는 상태이다. 이전에 구현해본 기능이 있는 기능이기에 내가 맡기로 하였다. 하지만 진작 살펴보니 상점 구현 방법이 내가 이전에 구현한 방법과는 차이가 좀 많아서 생각보다 오래 걸렸다.

 

     우선적으로 베이스 코드는 item리스트를 오직 하나로 하고 이를 상점과 인벤토리에 띄우는 방법이었다. 이렇게 하려면 오히려 복잡하고 확장성이 매우 떨어지게 된다. 그렇기 때문에 item리스트를 상점 아이템 shopItemList와 인벤토리 아이템 inventoryList로 나누었다.

 

     기존에 isbuy(아이템이 구매 되었는지 체크하는 값)만을 조절하여 구매와 인벤토리 추가를 하던 방식에서 새로 이분화 한 리스트를 이용해 구매 선택 시에 shopItemList에 저장되있던 Item을 inventoryList로 Add하는 방법과 Remove하는 방식으로 상점 이용 방식을 바꾸었다.

    

    또한 이전에 입력된 값을 체크하던 메소드인 checkInput에서 장비 관리와 아이템 구매 등에서 고정된 값을 받는 것으로 되어있던 방법(int min과 int max를 체크하는 방법인데 이전엔 아이템이 4개라 (0, 4)로 되어있었다)에서 새로 만든 리스트를 이용 리스트.Count를 max에 넣어 자동으로 리스트에 추가되는 갯수 만큼 받을 수 있는 입력값이 늘어나도록 바꾸었다.

 

   아이템을 판매할 때에는 85%의 가격으로 팔아야 하는데 0.85를 아이템 가치에 곱하여 처리하려 했으나 그러려면 int값을 float으로 바꾸어야 하는데 그럴 바에 아이템 가격이 100골드 미만으로 떨어지지 않기 때문에 *85/100을 가격에 계산하도록 하여 정수로 값을 받았다.

 

   결과적으로 판매 기능은 구매 기능에서 상점 판매 창 대신 인벤토리 리스트를 띄워 선택된 아이템을 판매하는 방식이다.

(여기서 //판매 전에 장비 상태 해체 부분은 버그 해결 부분에서 다루도록 하겠다.)

 


    

3. 장비 장착 기능 개선

 

     원래 장비 장착은 제대로 된 구분이 없기 때문에 무기를 여러개, 갑옷을 여러개 착용하는 데에 아무 제약이 없었다. 이전 개인 과제 추가 조건 기능 중에 이를 제약하는 조건이 있었다. 이전에 이 구현을 해보았기에 이번 코드에 맞춰 바꿔보고자 했다.

 

    이를 위해서는 "1.장비를 장착 중이지 않을 때 / 2. 장비를 장착 중일 때 / 3. 장비를 해제할 때" 세가지를 생각해야 한다.

이를 지금은 if 조건문을 이용해 단순하게 구성하고 베이스 코드에 있던 EquipedArmor와 EquipedWeapon 메소드를 이용해 주었다.

 

장비를 장착 중일 때는 이전 장착 중이던 장비를 장착 해제 한 뒤 장착 코드를 실행하는 방법이다.

 

(CalcAddedStat() 메소드는 캐릭터 상태창 개선 때 설명하도록 하겠다.)

 


 

4. 캐릭터 상태창 개선

 

    베이스 코드에서 캐릭터 상태창은 있으나 장비를 장착하면서 생기는 스탯 변화가 적용되지 않았다. 이를 적용하기 위해서는 여러가지 추가를 해주어야 했다.

 

    편하게 하기 위해 캐릭터 클래스에 AddedOffense와 AddedDefence 값을 추가하여 아이템의 공격력과 방어력을 받도록 하였다. 이를 스탯 창에서 캐릭터 공격력과 방어력에 각각 더하고 옆에 추가되는 수치를 띄워주었다.

구동화면

 

 

스탯 출력문, 너무 긴것 같아 이를 짧게 나중에 다듬을 시간이 있으면 한다

 

그리고 이 추가 스탯 값을 계산할 수 있는 메소드를 만들었다. 이것이 CalcAddedStat()으로 메소드가 호출되면 추가 스탯값을 초기화 하고 인벤토리 리스트를 foreach문으로 한번 검사하여 isEquiped //베이스 코드의 Equipped 오타다... 하지만 고치기엔 현재 작업이 진행되는 부분이라 그대로 사용중  값이 true가 되어 있는 아이템(장착 중인 아이템)의 장비 수치를 받아오는 메소드를 만들었다. 이는 만드는데 친구의 도움이 있었다.

 

 

해당 메소드를 장비 관리 선택 후, 아이템 판매 후 (장비 중인 아이템을 팔 때 다시 체크할 일이 있기 때문)에 사용토록 하였다.

 


 

5. 다양한 UI 개선

 

    아직 급하지 않은 일들이지만 보기에 불편한 부분이나 기능상 필요한 부분을 추가하였다.(ex= 없던 Console.Clear()로 쌓이는 텍스트) 우선 아이템 구매와 판매, 장비 관리 등은 모두 아이템의 인덱스 번호를 입력하여 하게 되는데 이 번호를 띄워주지 않던 것. 이 번호를 띄울 수 있도록 

 

int i = 0;을 만든 뒤 foreach에서 계속 i++로 카운트 해주어 그 값을 써주는 방식으로 해결 했다.

 


 

6. 버그 수정

 

    우선 판매할 때 장착 중인 아이템을 판매하는 상황을 처음엔 상정하지 않았었다. 그렇기 때문에 아이템을 판매 했음에도 내부적으로는 계속 그 아이템을 장착 중인 것으로 인식하는 일이 발생하였다. 문제 해결 자체는 

 

 

    판매 전에 장비를 해체하는 조건문을 넣어서 해결하였다. 하지만 여기서 직접 null로 만드는 방법 보다는 객체 지향적으로는 이를 상점에선 장착 해제만 실행하고 캐릭터에서 이를 해결 할 수 있는 방법이 더 좋을 것 같다. 아직 나도 부족한 실력이기에 이런 점들은 기능 구현이 끝난 뒤 고민해 보고자 한다.

 


 

    오늘 전반적으로 기능 추가는 많이 하였다. 조원들 질문도 많이 받아주었다. 하지만 작성한 코드가 기능 추가에 급했기에 깔끔하지 못하다. 특히 기존 하던 방법대로 .cs를 다 구분한 것이 아닌 program.cs에서만 작업되는 상황이기에 내용이 길어질 수록 불리한데 이 부분을 메소드나 함수로 최대한 줄이더라도 한계가 있을 것으로 보인다.

 

    내가 해야 되는 부분 중 다른 분들의 작업이 끝나야 진행되는 부분을 제외하면 회복 아이템을 제작하기만 하면 된다. 이 부분은 이 회복 아이템이 언제 사용될지 토의도 필요할 것 같다. 전투 부분이 완성되지 않았고 진행상황을 잘 모르기에 이부분을 주요 논제로 내일 오전 회의를 해야할 듯 하다.

 

   다른 분들의 작업 속도에 맞추어 일하는 것도 많이 요령이 필요한 부분인 것 같다. 우리 조는 상대적으로 이에 불리하기에(초보자 조) 더욱 어려운 부분인 것 같다.