All is well

[YYBASIC0203/얌얌코딩] Direct 기법, 2중 포인터, 2차원 배열 본문

C++/YYBASIC

[YYBASIC0203/얌얌코딩] Direct 기법, 2중 포인터, 2차원 배열

D0YUN 2025. 2. 5. 08:16

Direct 기법

Direct 기법은 방향을 표현하기 위해 2차원 배열을 사용하는 기법으로, 각 좌표의 변화량을 인덱스를 통해 지정합니다.

  • 이중 포인터와 배열을 이용하면
    • 효율적으로 방향을 저장할 수 있고
    • 반복문을 통해 각 방향에 맞는 새로운 좌표를 쉽게 계산할 수 있습니다.
  • ex01) 좌표 (1, 1)을 기준으로 상하좌우 네 방향의 좌표를 반복문을 통해 구할 수 있음
  • ex02) 여덟 방향을 사용하여 2D 게임에서 캐릭터의 움직임을 효과적으로 처리할 수 있음
  • 게임에서 예외 처리를 통해 캐릭터의 위치가 벗어나지 않도록 하는 로직을 포함시킬 수 있습니다

게임에서 캐릭터의 움직임

  • 3D 게임에서 캐릭터의 움직임은 2차원 배열을 기반으로 하여 방향을 체크해 결정됩니다.
  • 캐릭터가 움직이는 부분은 바닥에 한정되어 있어서 2차원 구조로 이해할 수 있습니다.
    • 따라서 2D와 유사한 방식으로 몬스터가 플레이어를 인식하고, 장애물을 회피하는 방식으로 동작할 수 있는 구조가 적용됩니다.

이중 포인터

  • 포인터 변수란 주소값을 저장하는 변수 타입입니다.
  • 이중 포인터란 주소를 저장할 수 있는 포인터 변수로, 이를 통해 포인터 변수의 주소를 저장할 수 있습니다.
// YYBASIC02_03
#include <iostream>
using namespace std;

int map[5][5] =
{
    1,3,5,1,5,
    3,7,9,5,8,
    4,5,3,9,7,
    2,7,6,1,9,
    1,6,2,3,8
};

int pattern[2][2] = 
{
    3, 5,
    7, 9
};

int isPattern(int dY, int dX)
{
    for (size_t y = 0; y < 2; y++)
    {
        for(size_t x = 0; x < 2; x++)
            if(map[dY + y][dX + x] != pattern[y][x])
                return 0;
    }
    return 1;
}

void main()
{
    /* 방향을 표현하기 위한 코딩 방법 */
    // 타일맵 게임에서 많이 사용 - 스타듀밸리
    // 3D 게임에서 방향을 찾는 것도 이와 같음
    // └ 위에서 보았을 때 방향을 체크하여 갈 수 있는 부분, 없는 부분 확인
    // └ 이 기술이 바로 navMesh
    #pragma region DirectionArray
    int arr[3][3] = 
    {
        1,2,3,
        4,5,6,
        7,8,9
    };

    // 기준으로부터 얼만큼 떨어져 있는지(=방향)을 나타내는 배열
    int dir[4][2] = 
    {
        -1, 0,
        1, 0,
        0, -1,
        0, 1
    };

    // 기준 좌표 - (1,1)이라 가정
    int x = 1, y = 1;

    int sum = 0;
    for (size_t i = 0; i < 4; i++)
    {
        int newX = x + dir[i][1];
        int newY = y + dir[i][0];

        // newX, newY가 범위를 넘어가는지 체크 - isValid
        if( ( newX >= 0 && newX <= 2 ) && (newY >= 0 && newY <= 2 ) )
            sum += arr[newX][newY];
    }
    #pragma endregion


    /* 이중 포인터 */
    // 포인터 변수 : 변수의 주소값을 저장하는 변수 타입
    // 이중 포인터 : 포인터의 주소값을 저장하는 변수 타입
    #pragma region DoublePointer
    int a = 100;
    int* p = &a;
    int** pp = &p;

    *(*pp) = 200;       // a의 값이 200이 됨
    #pragma endregion


    /* 구조체, 클래스를 이용한 배열 */
    // 구조체, 클래스를 원소로 갖는 배열도 선언이 가능하다
    #pragma region StructArray
    struct ABC
    {
        int a, b;
    };
    
    ABC ttt[3];
    ttt[0].a = 100;
    #pragma endregion


    /* 2중 for문에서 패턴 찾기 */
    #pragma region Find Pattern in a Nested for loop
    int result = 0;
    for (size_t y = 0; y < 4; y++)
        for (size_t x = 0; x < 4; x++)
            result += isPattern(y, x);

    cout << "\n< Find Pattern in Nested for loop > " << endl;
    if(result != 0)
        cout << "found pattern : " << result << endl;
    else
        cout << "didn't found pattern" << endl;
    #pragma endregion
}

LV04 Direct기법, 2중 포인터, 2차원 배열 패턴찾기