배열로 타일맵 만들기
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; }
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 배열에 저장해준다. 반복문을 사용해서 맵의 인덱스를 순환하며 각 인덱스에 해당하는 숫자를 저장하고 그 숫자를 문자 배열의 인덱스로 사용해서 출력한다.
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() 함수를 사용하였다.
플레이