배열로 타일맵 만들기

3 minute read


2차원 배열활용한 타일맵

2차원 배열의 특징을 활용하여 5x5 타일맵을 만들어 본다.


1. 맵으로 사용할 공간선언

  • 2차원 배열로 맵공간을 할당한다.
      #include <stdio.h>
    
      int main()
      {
        int mapData[5][5] = {
          { 0, 0, 0, 0, 0},
          { 0, 0, 0, 0, 0},
          { 0, 0, 0, 0, 0},
          { 0, 0, 0, 0, 0},
          { 0, 0, 0, 0, 0}
        };
    
        for (int row = 0; row < 5; row++)
        {
          for (int col = 0; col < 5; col++)
          {
            printf("%d ", mapData[row][col]);
          }
          printf("\n");
        }
    
        return 0;
      }
    

    array_2d_map_1


2. 특수문자로 맵 느낌살리기

  • 좀 더 맵의 느낌이 날 수 있도록 특수문자로 대치 시켜본다.
  • char배열에 특수문자로 하나씩 배치하는 방법보다 int배열에 숫자로 배열한 다음 특수문자로 치환하는 방식을 사용해 본다.

    #include <stdio.h>
    
    int main()
    {
      int mapData[5][5] = {
        { 1, 1, 1, 0, 1},
        { 1, 0, 0, 0, 1},
        { 1, 0, 1, 1, 1},
        { 1, 0, 0, 0, 1},
        { 1, 1, 1, 2, 1}
      };
    
      char tileSet[4] = { ' ', '#', '*'};
    
      for (int row = 0; row < 5; row++)
      {
        for (int col = 0; col < 5; col++)
        {
          int idx = mapData[row][col];
          printf("%c", tileSet[idx]);
        }
        printf("\n");
      }
    
      return 0;
    }
    
  • 치환 해줄 문자를 char 배열에 저장해준다. 반복문을 사용해서 맵의 인덱스를 순환하며 각 인덱스에 해당하는 숫자를 저장하고 그 숫자를 문자 배열의 인덱스로 사용해서 출력한다.

    array_2d_map_1

    5 x 5 크기의 맵이 만들어졌다. #은 벽이고 공백은 길이다. *를 플레이어로 한다.


3. 간단한 게임으로 만들기

  • 조건문과 반복문 등을 추가해서 간단한 길찾기 게임을 만든다.

    #include <stdio.h>
    #include <windows.h>
    
    int main()
    {
      int mapData[5][5] = {
        { 1, 1, 1, 0, 1},
        { 1, 0, 0, 0, 1},
        { 1, 0, 1, 1, 1},
        { 1, 0, 0, 0, 1},
        { 1, 1, 1, 0, 1}
      };
      char tileSet[4] = { ' ', '#', '*' };
    
      int playerPosX = 3;
      int playerPosY = 4;
      bool clear = true;
    
      while (clear)
      {
        for (int row = 0; row < 5; row++)
        {
          for (int col = 0; col < 5; col++)
          {
            int idx = mapData[row][col];
    
            if (row == playerPosY && col == playerPosX)
            {
              printf("%c", tileSet[2]);
            }
            else
            {
              printf("%c", tileSet[idx]);
            }
          }
          printf("\n");
        }
        printf("\n");
        printf("왼쪽으로 이동)1, 오른쪽으로 이동)2, 위로 이동)3, 아래로 이동)4\n\n");
        int move = 0;
        scanf_s("%d", &move);
    
        if (move == 1)
        {
          if (mapData[playerPosY][playerPosX - 1] == 0)
          {
            playerPosX--;
          }
          else
          {
            printf("이동할 수 없습니다.\n");
            Sleep(1000);
          }
        }
        else if (move == 2)
        {
          if (mapData[playerPosY][playerPosX + 1] == 0)
          {
            playerPosX++;
          }
          else
          {
            printf("이동할 수 없습니다.\n");
            Sleep(1000);
          }
        }
        else if (move == 3)
        {
          if (mapData[playerPosY - 1][playerPosX] == 0)
          {
            playerPosY--;
          }
          else
          {
            printf("이동할 수 없습니다.\n");
            Sleep(1000);
          }
        }
        else if (move == 4)
        {
          if (mapData[playerPosY + 1][playerPosX] == 0)
          {
            playerPosY++;
          }
          else
          {
            printf("이동할 수 없습니다.\n");
            Sleep(1000);
          }
        }
    
        if (playerPosX == 3 && playerPosY == 0)
        {
          clear = false;
        }
        system("cls");
      }
    
      int gameClear[8][27] = {
        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        { 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0},
        { 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0},
        { 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0},
        { 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0},
        { 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0}
      };
      char clearSet[] = { ' ', '#', '=' };
    
      for (int row = 0; row < 8; row++)
      {
        for (int col = 0; col < 27; col++)
        {
          int idx = gameClear[row][col];
          printf("%c", clearSet[idx]);
        }
        printf("\n");
      }
      return 0;
    }
    
  • while문을 통해 플레이어가 탈출할 때 까지 프로그램이 실행되게 한다.
  • 플레이어 위치를 특정시키고, 입력을 받아 조건문을 거쳐 플레이어 위치를 옮긴다.
  • 플레이어가 골인지점에 도착하면 while 반복문이 종료되고 클리어 문구를 띄운다.
  • windows.h 헤더파일을 추가해서 콘솔화면을 갱신해주는 system(“cls”) 함수와 잠시 대기시키는 Sleep() 함수를 사용하였다.


    플레이

    array_2d_map_3