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 |