25.06.20 개발일지(다중포인터, 다차원배열,콘솔게임)

2025. 11. 7. 14:33·6월 개발일지

 

25.06.20 개발일지

다중포인터(이중포인터)

 

주소값에 포인터를 사용할 때는 ** 애스터리스크를 2개 사용한다.(삼중 사중~~ 가능)

 

주소값에도 값이 저장된 주소값이 있다.

-> 이걸 불러올 때 이중포인터 ** 사용

 

ex)

int cNum = 97

int* p_cNum = &cNum

int** ptr = &p_cNum

-> 이중포인터, 변수 ptr은 p_cNum이라는 주소값이 저장된 주소값이다.

 

이중역참조

*ptr = p_cNum

**ptr = cNum

 

다차원 배열

 

2차원 배열 : 1차원 배열이 여러개 들어가 있는 것

**(다중포인터)를 사용해야한다.

 

1차원 배열과 2차원 배열의 연속된 형태의 메모리 저장 방식은 똑같다.

콘솔 게임 만들기 이해하기

 

 

: 포탈을 타면 맵이 바뀌는 것까지 구현해봤다.

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <termios.h>

int getch();

int main(void)
{
    char map1[16][64] = {
    "1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ",
    "1 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ",
    "1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ",
    "1 0 0 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 0 0 0 0 0 0 1 ",
    "1 0 0 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 1 ",
    "1 0 0 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 1 ",
    "1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ",
    "1 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ",
    "1 0 4 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 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 1 ",
    "1 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 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ",
    "1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 2 0 0 0 0 0 0 1 ",
    "1 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 5 1 ",
    "1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 "};
    
    char map2[16][64] = {
    "1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ",
    "1 5 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 1 ",
    "1 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 8 8 8 8 8 8 8 8 8 8 8 8 1 ",
    "1 8 8 8 2 2 2 2 2 2 2 2 8 8 9 9 9 9 9 8 8 8 8 8 8 8 8 8 8 8 8 1 ",
    "1 8 8 8 2 2 2 2 2 2 2 2 8 8 9 9 9 9 9 8 8 8 8 8 8 8 8 8 8 8 8 1 ",
    "1 8 8 8 2 2 2 2 2 2 2 2 8 8 9 9 9 9 9 8 8 8 2 2 2 2 8 8 8 8 8 1 ",
    "1 8 8 8 2 2 2 2 2 2 2 2 8 8 8 8 8 8 8 8 8 8 2 2 2 2 8 8 8 8 8 1 ",
    "1 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 2 2 2 2 8 8 8 8 8 1 ",
    "1 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 a 8 8 8 8 2 2 2 2 8 8 8 8 8 1 ",
    "1 8 8 8 8 8 2 2 2 2 2 2 2 8 8 8 8 8 8 8 8 8 2 2 2 2 8 8 8 8 8 1 ",
    "1 8 8 8 8 8 2 2 2 2 2 2 2 8 8 8 8 8 8 8 8 8 2 2 2 2 8 8 8 8 8 1 ",
    "1 8 8 8 8 8 2 2 2 2 2 2 2 8 9 9 9 9 9 8 8 8 2 2 2 2 8 8 8 8 8 1 ",
    "1 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 8 8 8 8 8 8 8 8 8 8 8 8 1 ",
    "1 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 8 8 8 8 8 8 8 8 8 8 8 8 1 ",
    "1 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5 1 ",
    "1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 "};

    
    char map3[16][64] = {
    "1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ",
    "1 5 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 1 ",
    "1 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 1 ",
    "1 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 3 3 3 3 3 7 7 7 7 7 7 7 1 ",
    "1 7 7 7 3 3 3 3 3 3 7 7 7 7 7 7 7 7 7 3 3 3 3 3 7 7 7 7 7 7 7 1 ",
    "1 7 7 7 3 3 3 3 3 3 7 7 7 7 7 7 7 7 7 3 3 3 3 3 7 7 7 7 7 7 7 1 ",
    "1 7 7 7 3 3 3 3 3 3 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 1 ",
    "1 7 7 7 3 3 3 3 3 3 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 1 ",
    "1 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 1 ",
    "1 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 3 3 3 7 7 7 1 ",
    "1 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 3 3 3 7 7 7 1 ",
    "1 7 7 7 3 3 3 3 3 3 7 7 7 7 7 7 7 3 3 3 7 7 7 7 7 3 3 3 7 7 7 1 ",
    "1 7 7 7 3 3 3 3 3 3 7 7 7 7 7 7 7 3 3 3 7 7 7 7 7 7 7 7 7 7 7 1 ",
    "1 7 7 7 3 3 3 3 3 3 7 7 7 7 7 7 7 3 3 3 7 7 7 7 7 7 7 7 7 7 7 1 ",
    "1 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 1 ",
    "1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 "};

    char map4[16][64] = {
    "1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ",
    "1 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 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 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 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 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 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 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 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 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 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 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 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 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 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 5 1 ",
    "1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 "};

    // 🟥🟧🟨🟩🟦🟫🟪⬛⬜🛡⚔🗡🔪🚬🧪🪓💍💰🔫💎⛲🦺♻🔰
    // 🗻🌁 🚢🏄🐳🌊⛵🌌🎇🎆🌠🌴🌱🌿🍀🎍🎋🍃🐉🐲🦕🟩🌿🍀🐍🚧🌳🌲🦴🟨🦑
 
char emoji[11][5] = {"🟥", "🟧", "🟨", "🟩", "🟦", "🟫", "🟪", "⬛", "⬜", "🌑", "🗻"};
    char emoji_items[15][5] = {"🔪", "🚬", "🧪", "🪓", "💍", "💰", "🔫", "💎", "🎴", "🦺", "🏹"};

    char four[5] = "\0";

    char level[5][5] = {"🤺", "🏇", "♖ ", "♕ ", "♔ "};

    char (*current_map)[64] = map1;       // 맵 변경 로직

    // player start point
    int x = 4;
    int y = 10;

    char move = 0;
    char arrow_list[8][5] = {"↖", "↟", "↗", "↞", "↠", "↙", "↡", "↘"};
    char arrow = 0;

    char temp_char[5] = "\0";
    int emoji_num = 0;

    // int map_width = strlen(current_map[0]); // 가로 계산
    // int map_height = sizeof(current_map) / sizeof(current_map[0]); // 세로 계산
    int map_height = 16;
    int map_width = 64;

    for (;;)
    {
        printf("\x1b[H"); // 커서를 화면 맨 위로 이동 (터미널 실행 깜빡임 최소화)
        
        // 맵 출력
        for (int i = 0; i < map_height; i++)
        {
            for (int j = 0; j < map_width; j++)
            {
                if (i == y && j == x)
                {
                    printf("🧑"); // 플레이어
                    // j++;         // 이모지 2칸 차지하므로 한 칸 추가로 넘김
                    continue;
                }

                char tile = current_map[i][j];
                if (tile == '1')
                    printf("⬛");
                else if (tile == '0')
                    printf("⬜");
                else if (tile == '2')
                    printf("🌲");
                else if (tile == '3')
                    printf("🌊");
                else if (tile == '4')
                    printf("🏠");
                else if (tile == '5')
                    printf("🌀");
                else if (tile == '6')
                    printf("🏥");
                else if (tile == '7')
                    printf("🟦");
                else if (tile == '8')
                    printf("🟩");
                else if (tile == '9')
                    printf("🌱");
                else if (tile == 'a')
                    printf("🐉");
                else
                    printf(" "); // 공백 또는 기타 문자
            }
            printf("\n");
        }
 
printf(" ");

        printf("\n");

        printf("\n");
        printf("q  w  e  \n");
        printf(" ↖ ↟↗   \n");
        printf("a↞  ↠ d  플레이어(x,y) %d,%d\n", (x / 4), y);
        printf(" ↙ ↡↘    이동방향: %s %s\n", arrow_list[arrow], emoji[atoi(temp_char)]);
        printf("z  x  c ");
        printf(" 종료(p)");


        printf(" 입력 키값 >> ");


        printf("%c\n", move);

        move = getch();

        if (move == 'a' || move == 'A') // ↞a
        {
            if (x > 2)
                x = x - 2;
        }
        else if (move == 'd' || move == 'D') // d↠
        {
            if (x < map_width - 4)
                x = x + 2;
        }
        else if (move == 'x' || move == 'X' || move == 's' || move == 'S') // x↡
        {
            if (y < map_height - 2)
                y = y + 1;
        }
        else if (move == 'w' || move == 'W') // w↟
        {
            if (y > 1)
                y = y - 1;
        }
        else if (move == 'q' || move == 'Q') // ↖q
        {
            if (x > 2 && y > 1)
            {
                x = x - 2;
                y = y - 1;
            }
        }
        else if (move == 'e' || move == 'E') // e↗
        {
            if (x < map_width - 4 && y > 1)
            {
                x = x + 2;
                y = y - 1;
            }
        }
        else if (move == 'z' || move == 'Z') // ↙z
        {
            if (x > 2 && y < map_height - 2)
            {
                x = x - 2;
                y = y + 1;
            }
        }
        else if (move == 'c' || move == 'C') // c↘
        {
            if (x < map_width - 4 && y < map_height - 2)
            {
                x = x + 2;
                y = y + 1;
            }
        }
        else if (move == 'p' || move == 'P')
        {
            break;
        }
        // else if
        // {
        //     printf("이동할 수 없는 지역입니다.\n다시 입력해주세요");
        //     break;
        // }

        // 맵 전환: map1 → map2
        if (current_map == map1 && x == 60 && y == 14)
        {
            current_map = map2;
            x = 4;
            y = 1;
            continue;
        }
        // map2 → map1
        if (current_map == map2 && x == 2 && y == 1)
        {
            current_map = map1;
            x = 58;
            y = 14;
            continue;
        }
        // map2 → map3
        if (current_map == map2 && x == 60 && y == 14)
        {
            current_map = map3;
            x = 4;
            y = 1;
            continue;
        }
        // map3 → map2
        if (current_map == map3 && x == 2 && y == 1)
        {
            current_map = map2;
            x = 58;
            y = 14;
            continue;
        }
        // map2 → map4
        if (current_map == map2 && x == 34 && y == 8)
        {
            current_map = map4;
            x = 4;
            y = 1;
            continue;
        }
        // printf("\x1b[2J"); // 화면 전체 지우기
    }
    printf("\n게임을 종료합니다.\n");
    return 0;
}

int getch()
{
    int c;
    struct termios oldattr, newattr;

    tcgetattr(STDIN_FILENO, &oldattr); // 현재 터미널 설정 읽음
    newattr = oldattr;
    newattr.c_lflag &= ~(ICANON | ECHO);        // CANONICAL과 ECHO 끔
    newattr.c_cc[VMIN] = 1;                     // 최소 입력 문자 수를 1로 설정
    newattr.c_cc[VTIME] = 0;                    // 최소 읽기 대기 시간을 0으로 설정
    tcsetattr(STDIN_FILENO, TCSANOW, &newattr); // 터미널에 설정 입력
    c = getchar();                              // 키보드 입력 읽음
    tcsetattr(STDIN_FILENO, TCSANOW, &oldattr); // 원래의 설정으로 복구
    return c;
}
 

 

'6월 개발일지' 카테고리의 다른 글

25.06.24 개발일지(C언어 콘솔게임 만들기)  (0) 2025.11.07
25.06.23 개발일지(C언어 콘솔게임 만들기)  (0) 2025.11.07
25.06.19 개발일지(배열, 함수, 포인터 응용)  (0) 2025.11.07
25.06.18 개발일지 (C언어 간단한 프로그램 만들기)  (1) 2025.11.07
25.06.17 개발일지(C언어 간단한 프로그램 만들기 2)  (0) 2025.11.07
'6월 개발일지' 카테고리의 다른 글
  • 25.06.24 개발일지(C언어 콘솔게임 만들기)
  • 25.06.23 개발일지(C언어 콘솔게임 만들기)
  • 25.06.19 개발일지(배열, 함수, 포인터 응용)
  • 25.06.18 개발일지 (C언어 간단한 프로그램 만들기)
dldmstj4378
dldmstj4378
dldmstj4378 님의 블로그 입니다.
  • dldmstj4378
    dldmstj4378 님의 블로그
    dldmstj4378
  • 전체
    오늘
    어제
    • 분류 전체보기 (136)
      • 비전 검사 (0)
      • 11월 개발일지 (6)
      • 10월 개발일지 (15)
      • 9월 개발일지 (26)
      • 8월 개발일지 (20)
      • 7월 개발일지 (26)
      • 6월 개발일지 (27)
      • 5월 개발일지 (16)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
dldmstj4378
25.06.20 개발일지(다중포인터, 다차원배열,콘솔게임)
상단으로

티스토리툴바