BFS 알고리즘 장기 문제 (정올)


첫 BFS문제이다. 확실히 DFS보다는 쉽게 느껴진다.

하지만 90점.. 그래도 첫 문제니 원리를 알았다는 거에

만족하며 이 문제는 여기서 마무리..







01. 구조체를 선언하고 초기화 한다.

또한 BFS 알고리즘은 큐가 핵심 원리이기 때문에

큐에 저장하는 함수 큐에서 빼내는 함수를 정의




02. 장기 말이 장기판 밖으로 나갔는지

혹은 지나왔던 곳을 또 밟았는지를 체크




03. BFS 알고리즘의 핵심 원리인 큐를 이용하여

노드를 큐에 넣고 빼고를 반복하며 답을 찾는다.




DFS를 할 때는 구정물에 발을 담그는 느낌이었는데

BFS 알고리즘은 그보단 훨씬 깔끔한 느낌이다.



유니티 C# 싱글턴 오브젝트


게임 내에서 클래스 인스턴스들은 여러개 생성된다.

몬스터, 아이템만 봐도 하나의 씬에 여러개 존재 할 수 있다.


하지만 게임 매니저, 스코어, 오디오, 저장 등을

관리하는 몇몇 클래스들은 유일한 독립체로 존재해야 한다.




하나의 클래스 인스턴스만 존재하게 되며 그보다

많은 인스턴스를 만들지 않는다. 하나보다 많은

인스턴스를 가지는 것은 모순적인 부분이 발생하거나

오브젝트의 역할을 망가뜨리고 쓸모없어질 수도 있다.

이런 종류의 오브젝트를 싱글턴이라 부른다.


싱글턴은 대게 여러 씬에 걸쳐 지속적으로 유지되는 오브젝트이다.




싱글턴 기본 요소

항상 메모리에 클래스 인스턴스가 하나만 존재해야 한다.


tip!

이처럼 씬 간 유지되는 오브젝트는 자식 없는 빈 게임오브젝트처럼

동작에 필요한 기본 컴포넌트로만 구성해 가볍게 만들어진다.

씬을 전환할 때 중요한 필수 데이터만 살아남도록 하는 전략이다.







위 클래스 인스턴스는 이제 씬이 전환되어도 사라지지 않는다.

하지만 게임의 씬이 순차적으로 진행되리라 보장되진 않는다.

따라서 이 매니저클래스가 생성된 씬으로 다시 오게 된다면

매니저 클래스 인스턴스가 두개가 생기게 되고, 문제가 발생한다.


싱글턴으로 만들어주자.







유일한 인스턴스(싱글턴)일 뿐만 아니라 모든 인스턴스에

공유가되는 변수가 되었다. 이 변수는 get 멤버만을

가지고 있는 읽기 전용 프로퍼티를 통해 외부에서 접근 가능하다.




tip!

Awake()와 Start()

Awake()는 항상 오브젝트 생성 시에 호출된다.

Start()는 게임오브젝트가 활성화되는 첫번째 프레임에

호출된다. 만약 게임오브젝트가 비활성화된 씬에서

시작되었다면 오브젝트가 활성화되어 있더라도

Start()는 호출되지 않는다.

호출 순서 Awake() -> Start()




트랜스폼 컴포넌트를 변수에 캐싱하려면

Start()보다는 Awake()를 쓰는 것이 좋다.

일반적으로 Start() 이벤트가 일어날 때엔

오브젝트에 대한 모든 지역 참조들이

이미 할당되어 유효하다고 가정된다.




C++ 디자인 패턴 : Strategy 패턴 (전략 패턴)


게임 캐릭터의 체력 구현 알고리즘을 만들고 있다고 가정하자.

기본 플레이어는 기본 체력 구현 알고리즘을 가지고 있을 것이다.

이 플레이어가 전직을 하여 전사가 되면 방어력이 더욱 강해질 것이고,

마법사로 전직을 하게 되면 방어력이 더욱 약해질 것이다.







위의 방법은 너무나 일반적인 설계이다. 하지만 여기서 캐릭터의 

알고리즘의 변경과 알고리즘 자체를 개조할 수 있는 방법이 없을까.


예를 들어 캐릭터가 너프 마법이나 버프 마법을 받게된다면

체력 구현 알고리즘이 달라져야 할 것이다. 전략 패턴을 써보자.







알고리즘을 클래스로 만들어 가상함수를 선언했다.

따라서 이를 상속하는 모든 클래스들은 이 함수를

재정의 할 수 있다. (알고리즘의 조정/개조가 가능해짐)







또한 이 알고리즘의 포인터를 가진 Player클래스는

언제든 체력 알고리즘을 바꿀 수 있는 융통성이 생기게 된다.




이 패턴의 핵심은 한쪽 클래스 계통에 속해 있는

가상 함수를 다른 쪽 계통에 속해 있는 가상 함수로 대체한다는 것이다.


+ Recent posts