본문 바로가기
회사 TIL

[TIL] 23.01.17 / 2차원 배열 -> 1차원 배열로 표현하기

by imagineer_jinny 2023. 1. 17.

TIL (Today I Learned)

 

오늘 해야할 것

  • 책 1차 마무리
  • 3 x 3 구현 코드와 내 코드 비교

 

오늘 한 것

  • 책 1차 작업 완료
  • 내 코드 vs  구현 잘 되는 코드 차이점
  • 3 x 3 왜 못했는지 생각하기

 

오늘 배운 것

  • 2차원 배열을 1차원 배열로 표현하기
for (int i = 0; i < 9; i++)
{
    int y = (i + 3) / 3;
    int x = i + 3 - y * 3;
}
i y x
0 1 0
1 1 1
2 1 2
3 2 0
4 2 1
5 2 2
6 3 0
7 3 1
8 3 2

 

(1,0) (1,1) (1,2)
(2,0) (2,1) (2,2)
(3,0) (3,1) (3,3)

2차원 배열을 1차원 배열로 변환하는 방법 · Parker (qkrrudtjr954.github.io)

 

  • 퍼즐 좌표와 그 좌표에 맞는 정보(block, empty, puzzle)을 같이 관리하고 싶은데 방법을 몰라서 따로 뒀었다.

ex. 내 코드

TArray<TArray<FVector>> _boardCenterPosInfo
    = {
        {FVector(-9.6, -15.3,0),FVector(0, -15.3,0),FVector(9.6, -15.3,0)},
        {FVector(-9.6, -5,0),FVector(0, -5,0),FVector(9.6, -5,0)},
        {FVector(-9.6, 4.6,0),FVector(0, 4.6,0),FVector(9.6, 4.6,0)},
        {FVector(-9.6, 14.3,0),FVector(0, 14.3,0),FVector(9.6, 14.3,0)}
      };

TArray<TArray<EBoardPathState>> _boardPathStateInfo
    = {
        {EBoardPathState::BLOCK,EBoardPathState::BLOCK,EBoardPathState::BLOCK},
        {EBoardPathState::BLOCK,EBoardPathState::BLOCK,EBoardPathState::BLOCK},
        {EBoardPathState::EMPTY,EBoardPathState::BLOCK,EBoardPathState::BLOCK},
        {EBoardPathState::BLOCK,EBoardPathState::BLOCK,EBoardPathState::BLOCK}
      };

 

ex. 바뀐 코드

TArray<TArray<FVector>> _boardCenterPosInfo
    = {
        {FVector(-9.6, -15.3,0),FVector(0, -15.3,0),FVector(9.6, -15.3,0)},
        {FVector(-9.6, -5,0),FVector(0, -5,0),FVector(9.6, -5,0)},
        {FVector(-9.6, 4.6,0),FVector(0, 4.6,0),FVector(9.6, 4.6,0)},
        {FVector(-9.6, 14.3,0),FVector(0, 14.3,0),FVector(9.6, 14.3,0)}
    };

TArray<TArray<int>> _boardPathStateInfo
    = {
        {-2,-2,2},
        {0,1,-1},
        {3,4,5},
        {6,7,8},
    };

 

따로 두긴 하는데 이걸 어떻게 연결시켜줄지 고민했는데 처음 BeginPlay에서 퍼즐상태를 받아와 인덱스에 저장 후 퍼즐을 위치시킬 때 위치를 넣어준다.

-> 이 생각은 왜 못해줬는가?

우선  _boardPathStateInfo를 상태로만 처리해줘서 숫자로 바꾼뒤 적용할 생각을 못했고,

위치랑 번호를 어떻게 연관하지? 하면서 for문 돌릴 생각까진 했던 것 같은데 예를 들어 

퍼즐 넘버 3인데 이 3이랑 실제 퍼즐이랑 어떻게 연관지어? 하니까 그 다음까지 사고가 못이어졌고,

SetRelativeLocation 안에 저 _boardCenterPosInfo[y][x]를 넣어줄 생각 자체를 못했다. 

_puzzles[puzzleIndex]->SetRelativeLocation(_boardCenterPosInfo[y][x]);

 

 

void AR1Level1SlidingPuzzle::BeginPlay()
{
	Super::BeginPlay();

	for (int y = 0; y < 4; y++)
	{
		for (int x = 0; x < 3; x++)
		{
			int puzzleIndex = _boardPathStateInfo[y][x];
			if (puzzleIndex < 0)
				continue;

			_puzzles[puzzleIndex]->SetRelativeLocation(_boardCenterPosInfo[y][x]);
		}
	}
	SetSlidingPuzzleState(ELevel1SlidingPuzzleState::Default);
}

 

 

 

 

내일 진행 할 것

  • 1차 작업한 것 글 교정 + 부족한 내용 끼워 넣기
  • 게임 프로그래밍 입문 편 - 게임 엔진 소개, 게임 프로그래머의 미래(AI관련) 내용 추가
  • 목차 수정하기
  • C# 유니티 Part3 진행하기

 

 

앞으로 진행할 것

  • 유데미 언리얼 강의 듣기
  • UE5 블루프린트 강의 듣기
  • Pico 빌드
  • 서랍, 문 등 다시 잡을 때 손잡이가 앞으로 확 오는 문제 처리하기
  • Gimmick 가이드 완성하기(for 인프런)
  • 언리얼 모듈화 연구 (코드 복붙 안하고 모듈화 할 수 있는 방안 생각하기)

댓글