c# 18

전략패턴

코드를 작성하다보면 같은 개념을 가지고 있는데 기능의 세부사항이 달라지는 경우가 있다. 이럴 땐 상속을 받으면 매번 오버라이딩을 해줘야 하고 기능이 추가되거나 수정될 때마다 다시 영향을 받아서 정말 번거롭다. 이럴 때 쓰는 것이 전략패턴이다. 전략패턴은 특정한 작업을 독립적으로 정의해서 원하는 작업으로 동적으로 교체할 수 있게 만드는 것이다. ● 전략 패턴은 어떻게 구현할까 특장한 작업을 정의하는 것은 인터페이스를 사용한다. 그리고 해당 작업을 구현하는 것은 그 작업을 가지고 있는 어떤 클래스에서 하는 것이 아니라 해당 작업만을 목적으로 하는 클래스를 따로 만들어서 구현한다. 예를 들어 총을 쏜다는 작업이 있다. 그러면 총을 쏘는 슈터라는 클래스에서 구현하는 것이 아니라 BB탄 총 클래스를 만들어서 BB..

부트캠프 2023.09.25

팀 콘솔RPG 프로젝트 마무리

이번 주에 진행한 콘솔 기반 팀 프로젝트가 마무리되었다. 이번 협업을 진행하면서는 팀원들과 기능 분담을 잘 하고 들어갔고 서로 어떤 작업이 진행중인지 실시간으로 소통을 많이 했기 때문에 작업도 수월했고 작업 결과물도 잘 나왔다는게 가장 만족스럽다. 코드는 더티한 부분이 꽤 있고 구조적으로 깔끔하진 않지만 이런 부분을 항상 고치고 수정할 수 만은 없다는 것도 경험하게 된 것 같다. 코드를 매번 수정하는데 들어가는 시간과 노력이 프로젝트의 진행도를 늦추기 때문이다. 그래서 소통이 되고 팀원들이 작업 진행을 보면서 내 작업을 맞춰갈 수 있다는게 더 긍정적으로 작용했다. 콘솔 RPG 구현은 큰 범주의 행동들은 매니저 클래스를 통해서 이뤄지도록 작업했다. 화면에 출력하고 UI적 요소를 만드는 것은 UIManage..

부트캠프 2023.09.01

팀 콘솔 RPG3

오늘은 코드를 짜는 도중에 생성자와 관련되어서 한 번 에러가 났다. A라는 클래스의 생성자에서 B 클래스를 만들고, B클래스는 A클래스를 참조하는 경우였다. 이런 구조로 코드가 짜여있어서 생성자가 끝나지 않고 계속해서 순환해서 돌다가 스택이 넘쳐버리는 사태가 발생했다. 해당 구조를 적당히 재현해보면 다음과 같이 된다. class DataManager { public DataManager() { LoadMonsters(); } public void LoadMonsters() { new Monster(어쩌구 저쩌구); } } class Monster { public Monster() { SetDropTable() } public void SetDropTable() { DataManager.Instance.L..

부트캠프 2023.08.30

팀 콘솔 RPG2 (스킬 구현)

오늘 팀원들과 같이 개발하다가 Skill을 어떻게 구현할지 방식에 대한 논의가 있었다. Skill은 각 스킬마다 어떤 효과를 가질지 달라질 수 있기 때문에 스킬에 대한 처리를 스킬 클래스 하나만으로 처리하기는 어려워보였다. 그래서 처음에는 스킬에 공통적으로 들어갈 내용을 선언하고 스킬 클래스를 상속받아서 각각의 스킬을 만드려고 했는데 그렇게 하면 매 스킬마다 클래스를 만들어야 하니 스킬이 조금만 많아져도 관리하기가 힘들어졌다. 그래서 어떻게 할지 고민을 해봤을 때 스킬 클래스에서 모든 것을 처리하기보단 스킬은 스킬의 종류와 값만 가지고 있고 해당 스킬의 종류에 따라 값을 어떻게 다룰지는 Battle을 진행하는 BattleManager 클래스에서 정하고 실제로 값의 변동은 Player나 Monster같은 ..

부트캠프 2023.08.29

팀 콘솔RPG 프로젝트

이번엔 팀을 짜서 같이 콘솔로 RPG게임을 만들어보기로 했다. 혼자서 할 때와 다르게 다른 팀원들과 같이 서로 코드를 나눠보고 협업하면서 만들어볼 수 있기 때문에 내가 놓쳤거나 해보지 못한 시도들을 발견할 수 있을거라 생각한다. 이번에 짜여진 팀은 4명이고 팀원 중의 한 분이 만들었던 코드를 기반으로 발전시키려고 한다. 저번 팀 프로젝트의 실수를 발판삼아서 유사한 기능끼리 묶어서 기능을 배정하고 시작했고 덕분에 서로 신경써야할 부분이 훨씬 줄었다. Git을 통해서 환경설정하는 부분도 아주 간단히 처리할 수 있게 되었다. 내가 맡은 기능은 던전에서 나오게 되었을 때 결과에 따라서 적절한 보상과 안내 텍스트를 띄우는 기능이었고 어느정도 코드 베이스가 있었기 때문에 팀원분의 코드를 읽고 분석한 다음 적절한 곳..

부트캠프 2023.08.28

콜백함수를 왜 쓰는가?

인풋과 관련된 로직을 짜다가 문득 들었던 생각. 보통 인풋과 같은 이벤트를 처리할 때 콜백 함수를 사용해서 많이 구현하는데 꼭 그래야 하나? 실제로 저번 콘솔 RPG제작 때에도 ReadKey()를 통해서 키보드 입력을 받아올 때 ReadKey()를 받는 곳에서 Key값에 따라 필요한 로직을 처리하는 메소드를 호출하게 구현했었다. 콜백함수를 써볼까 했지만 콜백함수를 써서 구현하나 그냥 직접 호출하나 차이가 없을거라고 느껴졌기 때문이다. 그래서 어떤 경우에 콜백 함수를 쓰는지 직접 검색해보았다. http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_QnA_etc&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=..

부트캠프 2023.08.25

콘솔앱으로 TextRPG 만들기3

오늘을 마지막으로 콘솔로 RPG게임을 만드는 개인과제가 마무리됐다. 처음에는 원대한 꿈을 품고 시작했지만 내 능력을 너무 과신한것인지 생각한 기능들을 전부 구현하는데 실패했다. 아쉽긴 하지만 그래도 어느정도 UI 기틀을 잡아서 출력해볼 수 있어서 나름대로 만족하는 부분이 없는 것은 아니다. 콘솔에서 Text로 GUI를 구성해보는데에 집중했고 단순히 직접 문자열을 만들어서 출력하는 형식이 아니라 클래스 구조를 짜고 메소드들을 구현해서 최대한 게임 프레임워크처럼 구성해보려고 노력했다. 시작하면 GameManager, ScreenManager라고 이름지은 두 개의 클래스를 기반으로 GameManager는 플레이어 정보와 움직임등을 관리하고 ScreenManager는 맵과 UI를 관리한다. UI는 UIWindo..

부트캠프 2023.08.23

콘솔앱으로 TextRPG 만들기

콘솔앱을 통해서 Text기반 RPG를 만들어보려고 한다. 꿈은 거창하게 가지고 완전히 Text로만 진행되는게 아니라 아스키아트처럼 Text를 가지고 얼추 UI를 만들어보려고 기획했다. 클래스 구조를 생각하는데 UI 관리를 어떻게 해야될지가 너무 어렵다. 콘솔 앱에서 UI를 배치하고, 포커스를 주고, 키보드 입력을 받아 상호작용을 해야하는데 UI 배치는 그래도 index를 설정해서 리스트로 들고 있는다거나 어떻게 하면 될 것 같은데 포커스와 상호작용이 정말 난관이다. UI매니저 클래스를 만들어서 모든 UI컴포넌트를 들고 있게 만들까 하니 하나의 인터페이스를 어떻게 구분할지, 포커스를 옮길 때 여러개의 인터페이스가 열려 있다면 어떻게 옮길 것인지 등 하나하나 매니저 클래스에서 다 구현해야 하는데 좋아보이진 ..

부트캠프 2023.08.18

BlackJack 게임

이번엔 BlackJack 게임을 간단히 구현해봤다. 세세한 룰들은 적용하지 않고 가장 기본적인 룰만 구현했다. 이미 게임의 기틀이 잡혀있다보니까 대응하는 클래스와 메소드만 생성하고 구현하면 됐어서 프로그램 구조에 대한 고민이 훨씬 적었다. 구현하다보니 자연스럽게 메소드에서 메소드로 이어지는 반복실행 구조로 짜고 있었는데 생각해보니 그렇게 짜면 게임 횟수가 엄청 많아졌을 때 스택 오버플로우가 일어날 수 있을 것 같아서 중간에 bool값을 가지고 페이즈를 넘기듯이 진행하는 방식으로 바꾸었다. namespace BlackJack { using System; using System.Collections.Generic; using System.Numerics; using System.Runtime.InteropS..

부트캠프 2023.08.17

간단한 Snake게임 만들기2

게임을 만들다보니 Map 정보를 Snake나 Food가 모르면 어떤 위치에 생성되게 할지 결정할 수 없으니 Map이 필요한데 그러자니 클래스 계층 구조가 꼬여서 맘에 안들어지기 때문에 그냥 Map에서 Snake와 Food 둘 다 만드는 것으로 결정했다. 덕분에 Map코드가 바뀌어서 만들기1 게시물도 수정하게 되었다. Snake 클래스는 다음과 같이 구성했다. public class Snake { public List body = new List(); public Point? snakeHead; public string headSymbol = "◆"; public string bodySymbol = "≡"; public void MoveBody() { for (int i = body.Count - 1; i..

부트캠프 2023.08.17