콘솔 게임 맵
이모지 링크
https://kr.piliapp.com/twitter-symbols/
https://www.unicode.org/emoji/charts/full-emoji-list.html
https://kr.piliapp.com/symbol/#graphic
1)
#include <stdio.h>
#define icon_Size sizeof "🔚" // icon size == 5byte
#define movable 8
#define x_Blocks (movable + 2) // 이동 블럭 수 + 양쪽 벽 2개
#define x_Total (icon_Size * x_Blocks) // x 축 전제 크기
int main(void)
{
char map[x_Total] = {"⬛🔚🔙🔚🔙🔚🔙🔚🔙⬛"};
printf("icon size: %ldByte\n", sizeof "🔚");
printf("x axis cnt: %d\n", x_Blocks);
printf("array size: %ldByte\n", sizeof map);
printf("%s\n\n", map);
}
// icon size: 5Byte
// x axis cnt: 10
// array size: 50Byte
// ⬛🔚🔙🔚🔙🔚🔙🔚🔙⬛
2)
#include <stdio.h>
int main(void)
{
// 1차원 배열
char map1[10] = {"1 2 3 4 5"};
printf("%s\n", map1);
printf("%ld Byte\n\n", sizeof map1); // 9+1
// 2차원 배열
char map2[2][10] = {
"0 1 2 3 4",
"5 6 7 8 9"};
printf("%s\n", map2[0]);
printf("%s\n", map2[1]);
printf("%ld Byte\n\n", sizeof map2); // (9+1)*2
// 좌표 평면상의 x축, y축과 인덱스 값 간의 차이점 확인
printf("%c %c %c %c %c\n", map2[0][0], map2[0][2], map2[0][4], map2[0][6], map2[0][8]);
printf("%c %c %c %c %c\n", map2[1][0], map2[1][2], map2[1][4], map2[1][6], map2[1][8]);
}
// 1 2 3 4 5
// 10 Byte
// 0 1 2 3 4
// 5 6 7 8 9
// 20 Byte
// 0 1 2 3 4
// 5 6 7 8 9
3)
#include <stdio.h>
int main(void)
{
/* Case 1. [↖방향] 좌표 0,0 시작 2차원 배열 계산이 편한경우 */
\
char map1[5][10] = {
"0 1 2 3 4",
"1 a b c d",
"2 e f g h",
"3 i j k l",
"4 m n o p"};
int maxRow = sizeof map1 / sizeof map1[0]; // [1 시작 정수 계산 사용]
int y_MaxIdx = maxRow - 1; // [0 시작 index 계산 사용] 행 마지막 인덱스
int block_sz = 2; // 열의 블록 한칸 사이즈(띄어쓰기 고려)
printf("2차원 맵 사이즈: %ld, 행 사이즈: %ld\n\n", sizeof map1, sizeof map1[0]);
// [step1] 키 입력
int x_Input = 4; // x 축으로 4칸
int y_Input = 3; // y 축으로 3칸
// [step2] 키 입력값이 유효하면, 계산후 할당
int _x = 0;
int _y = 0;
// [step3] 아이콘 사이즈 반영을 위한 공백 반영
_x = x_Input * block_sz; // block * 2
_y = y_Input;
printf("map1[%d][%d], 값: %c\n", _y, _x / block_sz, map1[_y][_x]);
/* Case 12. [↙방향] 좌표 0,4 시작 좌표 계산이 편한경우 */
char map2[5][10] = {
"4 m n o p",
"3 i j k l",
"2 e f g h",
"1 a b c d",
"* 1 2 3 4"};
_x = 0;
_y = 4;
_x = x_Input * block_sz; // block * 2
_y = y_MaxIdx - y_Input; //
printf("map2[%d][%d], 값: %c\n", _y, _x / block_sz, map2[_y][_x]);
}
4) 출력
#include <stdio.h>
int main(void)
{
/* Case 1. [↖방향] 좌표 0,0 시작 2차원 배열 계산이 편한경우 */
char map1[5][10] = {
"01234",
"1abcd",
"2efgh",
"3ijkl",
"4mnop"};
int rowSZ = sizeof map1[0];
int colSZ = sizeof map1 / rowSZ; // [1 시작 정수 계산 사용]
int y_MaxIdx = colSZ - 1; // [0 시작 index 계산 사용] 행 마지막 인덱스
int block_sz = 2; // 열의 블록 한칸 사이즈(띄어쓰기 고려)
printf("2차원 맵 사이즈: %ld, 행 사이즈: %d\n\n", sizeof map1, rowSZ);
// [1] 키 입력
int x_Input = 1; // x 축으로 x칸
int y_Input = 3; // y 축으로 y칸
// [2] 케릭터 위치 초기값
int _x = 0;
int _y = 0;
// [3] 키 입력값이 유효하면, 케릭터 좌표값 계산후 할당
_x = x_Input;
_y = y_Input;
// [4] 맵 출력 시, 배열에 공백이 없다면,
// 컬러 아이콘은 글자2.5~3개 정도로 표시되므로 중첩되어 깨짐. 3+양쪽 공백 1칸 출력시 추가해야 함
char level[5][5] = {"🤺", "🏇", "♖ ", "♕ ", "♔ "};
for (size_t i = 0; i < colSZ; i++)
{
for (size_t j = 0; j < rowSZ; j++)
{
if(i == _y && j == _x)
printf("%5s", level[1]);
else
printf("%3c", map1[i][j]);
}
printf("\n");
}
}