코딩 테스트 3-4
시뮬레이션
개념을 명확히 이해하고 2차원 배열 형태의 행렬 구조와 특정 위치를 나타내는 좌표 정보를 활용하여 발생하는 다양한 시뮬레이션 문제들을 효과적으로 해결하는 방법을 익힐 수 있다.
좌표 연산 - 2차원 평면을 다루는 문제가 자주 출제된다.
dy, dx 배열로 현재 좌표에서 이동하기
현재 좌표에서 주변 좌표로 이동해야 하는 경우가 있다.(Ex 미로찾기)
오프셋 좌표를 활용하면 좋다
좌우 대칭 (X축을 기준으로 대칭일 때 Y축의 값은 바뀌지 않는다.)
(Y, X) -> (Y, (N-1) - X )
N 은 배열의 크기
N-1 -> 좌표 값은 0부터 시작하기 때문에 1을 빼줘야 함.
상하 대칭 (Y축을 기준으로 하므로 X값이 바뀌지 않는다.)
(Y, X) -> ((N-1) - Y, X)
위 와 대칭 구조를 이룬다.
90도 회전
(Y, X) -> ((N-1) - X, Y)
*180은 두 번 270은 세 번 하면 된다.
대각선 행렬
정방향
(Y, X) -> (Y+1, X+1)
(A, B) 가 (Y, X)와 같은 대각선 상에 있으려면 Y-A와 X-B가 동일한지 비교하면 된다.
-Y의 증가량과 X의 증가량이 같으면 같은 선상이다.
역방향
(Y, X) -> (Y+1, X-1)
(A, B) 가 (Y, X)와 같은 대각선 상에 있으려면 Y-A와 B-X가 동일한지 비교하면 된다.
-Y의 증가량과 X의 감소량이 같으면 같은 선상이다.
행렬 연산
덧셈
각 행렬에서 같은 위치에 있는 값끼리 더하거나 빼는 연산. 두 행렬의 크기가 같아야 시행할 수 있다.
곱셈
A항렬의 X행과 B항렬의 Y열의 원소를 각 곱한 후 더해서 C[x, y]로 완성하는 연산이다. A의 행(x)과 B의 열(y)의 개수가 같아야 한다는 특징이 있다.
달팽이 연산(문제)
vector<vector<int>> solution(int n) {
}
#include <vector>
using namespace std;
vector<vector<int>> solution(int n) {
// N*N 2차원 벡터를 선언하고 초깃값을 0으로 함
vector<vector<int>> snail_array(n, vector<int>(n, 0));
int num = 1;
// 행과 열의 시작과 끝 인덱스를 설정
int start_row = 0, end_row = n - 1;
int start_col = 0, end_col = n - 1;
// 제일 외각부터 달팽이 수열 규칙대로 채움
while (start_row <= end_row && start_col <= end_col) {
// 가장 왼쪽 윗부분 에서 가장 아래 바로 직전 까지 채우기
for (int i = start_col; i <= end_col; ++i) {
snail_array[start_row][i] = num++;
}
++start_row;
// 가장 왼쪽 아래부분 에서 가장 오른쪽 바로 직전 까지 채우기
for (int i = start_row; i <= end_row; ++i) {
snail_array[i][end_col] = num++;
}
--end_col;
// 가장 오른쪽 아래부분 에서 가장 위 바로 직전 까지 채우기
if (start_row <= end_row) {
for (int i = end_col; i >= start_col; --i) {
snail_array[end_row][i] = num++;
}
--end_row;
}
// 가장 윗부분 에서 가장 왼쪽 바로 직전 까지 채우기
if (start_col <= end_col) {
for (int i = end_row; i >= start_row; --i) {
snail_array[i][start_col] = num++;
}
++start_col;
}
}
return snail_array;
}
이진 변환
bit단위(0과1로 구성된 과제)일때 bitset 을 사용하는 것이 좋다.
bitset<x> A; A는 x크기인 비트셋이다 라는 선언.
비트는 역순으로 수가 오른다. [N, N-1, N-2, N-3, , , ,1, 0]
A.set(x) = x번째 값을 1로 바꿔라 - A.set() = 모든 값을 1로 바꿔라
A.reset(x) = x번째 값을 0으로 바꿔라 - A.reset() = 모든 값을 0으로 바꿔라
transforms++; = 변환 횟수
find를 사용해서 앞에 오는 0을 무시하는 결과를 반환할 수 있다.
캐릭터의 좌표
(X, Y) 를 이동시키는 문제.
&&
=================================================
언리얼 2-4
랜드스케이프, 폴리지
배경과 환경을 조성하는데 사용되는 툴.
랜드 스케이프 모드
지형 조각, 텍스쳐 페인팅, 대규모 환경 구성(지형 조각과 유사)
전체(컨텐츠 브라우저) - 검색 skeletal mash = 사람 크기를 비교하는데 사용할 수 있음.
단일 채우기를 통해 큰 건물을 배치할 수 있고 배치 - 노멀에 정렬을 해제하는 것으로 평평하게 배치를 할 수 있다.
컨텐츠 브라우저의 팹 탭을 통해 컨텐츠를 엔진에서 바로 저장할 수 있다!
==================================================
미니 팀 프로젝트
선배 기수 Unreal 엔진 게임 분석
게임 이름
Abyss Diver : Underworld
게임의 장르
잠수, 생존, 탐험 게임
어떤 시스템에 집중하였나?
몬스터
인상 깊거나 불편했던 상호작용 -

상어 형태의 몬스터는 인식 범위가 제대로 설정이 되어있지 않았는지 정면으로 이동해도 공격하지 않았다.

갈고리 모습의 몬스터는 인식하는 범위는 넓으나 공격판정의 범위가 좁아 접근해도 반응만 하고 공격받지 않는 영역이 꽤 넓었다.

원거리 공격을 하는 것으로 추정되는 몬스터, 공격의 가시성이 부족했고 인식범위가 꽤나 긴 것으로 보인다. 공격과 관련된 장비를 구할 수 있는 방법이 없어 플레이어의 공격과 관련된 상호작용은 확인할 수 없었다.
상호작용 분석
| 상호작용 사례 | 시스템 반응 | 의도/효과 분석 | 개선 포인트 |
| 레이더 | 상호작용 키(Q)를 통해 화면에 표시 | 주변의 몬스터 상황을 플레이어가 인지 할 수 있는 정보 제공 | 미니맵과 유사하게 작은 별도의 레이더가 제공되는 것이 좋아 보임 |
소리 발생 |
몬스터의 상황에 따라 몬스터의 위치에서 소리 생성 | 보이지 않더라도 몬스터가 존재함을 플레이어에게 인지시켜주거나 공격해 오고 있다는 것을 알림 | 추가적인 개선이 필요해 보이는 부분은 없었다. |
| 인식 | 몬스터의 인지 범위 내에 플레이어가 진입 시 공격 | 몬스터가 공격하는 당위성을 제공 | 상어와 갈고리형 몬스터의 인식범위 조정 필요 |
| 추적 및 공격 | 플레이어를 인식한 몬스터가 추적과 공격을 한다 | 몬스터가 플레이어를 인식함을 체험적으로 할 수 있고 이것이 플레이에 해를 준다는 것을 알 수있다 | 갈고리형 몬스터의 공격범위와 원거리 몬스터의 공격이 가시적이어야 함 |
게임의 핵심 시스템이 동작하는 구조의 시작부터 과정을 최대한 자세하게 분석, 나열해주세요!
1 형태에 맞게 자리를 지키거나 주변을 무작위적으로 배회한다.
2 플레이어를 인식할 수 있는 영역에 플레이어가 진입하면 플레이어의 방향으로 이동하고(추적, 이동이 불가능한 경우는 제외) 공격 범위에 도달하면 공격을 시도한다.
3 플레이어가 인식범위를 벗어나는 경우 1번의 행동으로 돌아간다.
직접 분석해본 내용 중 가장 핵심이 되는 구성 요소는 무엇이라 생각하나요?
핵심은 자연스러운 배회, 합리적인 인식과 공격 범위가 필요하다고 생각한다.
개인 플레이 및 분석
게임 이름
Dunstaurant
게임의 장르
로그라이크, 타이쿤
어떤 시스템에 집중하였나?
인상 깊거나 불편했던 상호작용
상호작용 분석
핵심 시스템이 동작하는 구조의 시작부터 과정을 분석,나열
분석 내용 중 가장 핵심이 되는 구성 요소
'TIL' 카테고리의 다른 글
| 25.11.17일자 - TIL (0) | 2025.11.17 |
|---|---|
| 25.11.14일자 - TIL (0) | 2025.11.14 |
| 25.11.12일자 - TIL (0) | 2025.11.12 |
| 25.11.11일자 - TIL (0) | 2025.11.11 |
| 25.11.10일자 - TIL (0) | 2025.11.10 |