
이것이 진정한 콘솔게임이다!?
어떤 게임을 만들 수 있겠습니까?

트위터에서 본 이 썰 때문에 한 번 해 본건데요, (애시당초 조건이 너무 불특정함.. 책은 괜찮은지? 그래픽 라이브러리는 사용하는지? 그래픽 에셋은 주어지는지? <- 일단 다 없다고 가정하고, 그럼 텍스트 출력으로 로직 중심이네 라는 발상으로 접근)
음.. 그런데 개발자 선발 테스트로는 별로 좋아보이진 않네요.
거 있잖아요. 인터넷 검색 다 되는 오픈북 시험이 세상에서 제일 어려운 시험인거.
차라리 게임 프로그래밍 패턴 관련된 과제를 내는게 맞을 것 같은데.
하여튼 이 코드는 vc++로 만들어졌고, 키 입력 처리나 컬러 코드 지정 때문에 인터넷 검색했으니 조건은 위반..입니다.
- // ConsoleMan.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
- //
- #include <iostream>
- #include <Windows.h>
- using namespace std;
- int map[15][15];
- int quality;
- int enemies;
- int i, j, k;
- int score = 0;
- int x, y;
- int ex[5], ey[5];
- int enemybuff[5];
- int step;
- int stage;
- SHORT keybuff = 0;
- void gotoxy(int x, int y)
- {
- COORD pos = { x,y };
- SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
- }
- void setcolor(int color)
- {
- SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
- }
- void setcolor(int color, int bcolor)
- {
- SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color | bcolor << 4);
- }
- int SetStage(int stageNum)
- {
- int _quality = 0;
- switch (stageNum)
- {
- case 0:
- {
- int _map[15][15] = {
- {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
- {1,4,4,4,4,4,4,4,4,4,4,4,4,4,1},
- {1,4,1,1,1,1,4,4,4,1,1,1,1,4,1},
- {1,4,1,4,4,4,4,4,4,4,4,4,1,4,1},
- {1,4,1,4,4,4,4,4,4,4,4,4,1,4,1},
- {1,4,1,4,4,1,4,4,4,4,4,4,1,4,1},
- {1,4,4,4,4,1,4,4,4,4,4,4,4,4,1},
- {1,4,1,1,1,1,4,4,4,1,1,1,1,4,1},
- {1,4,4,4,4,4,4,4,4,1,4,4,4,4,1},
- {1,4,1,4,4,4,4,4,4,1,4,4,1,4,1},
- {1,4,1,4,4,4,4,4,4,4,4,4,1,4,1},
- {1,4,1,4,4,4,4,4,4,4,4,4,1,4,1},
- {1,4,1,1,1,1,4,4,4,1,1,1,1,4,1},
- {1,4,4,4,4,4,4,4,4,4,4,4,4,4,1},
- {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
- };
- for (int y = 0; y < 15; y++)
- {
- for (int x = 0; x < 15; x++)
- {
- map[y][x] = _map[y][x];
- if (_map[y][x] == 4)
- _quality++;
- }
- }
- }
- break;
- case 1:
- {
- int _map[15][15] = {
- {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
- {1,4,4,4,4,4,4,4,4,4,4,4,4,4,1},
- {1,4,1,1,1,1,1,4,1,1,1,1,1,4,1},
- {1,4,1,4,4,4,4,4,4,4,4,4,1,4,1},
- {1,4,1,4,1,4,1,1,1,1,1,4,1,4,1},
- {1,4,1,4,1,4,1,4,4,4,1,4,1,4,1},
- {1,4,1,4,1,4,4,4,4,4,1,4,1,4,1},
- {1,4,4,4,1,1,1,1,4,1,1,4,4,4,1},
- {1,4,1,4,4,4,1,4,4,4,1,4,1,4,1},
- {1,4,1,4,1,4,1,4,1,4,1,4,1,4,1},
- {1,4,1,4,1,4,1,4,1,1,1,4,1,4,1},
- {1,4,1,4,1,4,4,4,4,4,4,4,1,4,1},
- {1,4,1,1,1,1,1,4,1,1,1,1,1,4,1},
- {1,4,4,4,4,4,4,4,4,4,4,4,4,4,1},
- {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
- };
- for (int y = 0; y < 15; y++)
- {
- for (int x = 0; x < 15; x++)
- {
- map[y][x] = _map[y][x];
- if (_map[y][x] == 4)
- _quality++;
- }
- }
- }
- break;
- }
- return _quality;
- }
- int TraceX(int x, int ex, int ey)
- {
- if (x > ex && (map[ey][ex + 1] != 1 && map[ey][ex + 1] != 3))
- return 1;
- else
- if (x < ex && (map[ey][ex - 1] != 1 && map[ey][ex - 1] != 3))
- return -1;
- return 0;
- }
- int TraceY(int y, int ex, int ey)
- {
- if (y > ey && map[ey + 1][ex] != 1)
- return 1;
- else
- if (y < ey && map[ey - 1][ex] != 1)
- return -1;
- return 0;
- }
- void Refresh()
- {
- gotoxy(0, 1);
- for (j = 0; j < 15; j++)
- {
- for (k = 0; k < 15; k++)
- {
- switch (map[j][k])
- {
- case 0://space
- printf(" ");
- break;
- case 1://wall
- setcolor(7);
- printf("□");
- break;
- case 2://player
- setcolor(2);
- printf("♣");
- break;
- case 3://enemy
- setcolor(4);
- printf("◈");
- break;
- case 4://item
- setcolor(6);
- printf("*");
- break;
- }
- }
- printf("\n");
- }
- }
- void gameInit()
- {
- gotoxy(0, 0);
- setcolor(0, 7);
- printf(" ConsoleMan Game ");
- x = 6;
- y = 6;
- score = 0;
- quality = SetStage(stage);
- enemies = stage + 1;
- for (i = 0; i < enemies; i++)
- {
- switch (i)
- {
- case 0:
- ex[i] = 1;
- ey[i] = 1;
- break;
- case 1:
- ex[i] = 13;
- ey[i] = 13;
- break;
- }
- enemybuff[i] = map[ey[i]][ex[i]];
- }
- if (map[y][x] == 4)
- score++;
- i = 4;
- while (i > 0)
- {
- if (i % 2 == 1)
- {
- gotoxy(2, 7);
- setcolor(9);
- printf(" ");
- gotoxy(2, 8);
- printf(" STAGE %d ", stage + 1);
- gotoxy(2, 9);
- printf(" ");
- }
- else
- {
- Refresh();
- }
- i--;
- Sleep(1000);
- }
- }
- int Roof()
- {
- int ret = 0;
- while (true)
- {
- gotoxy(0, 0);
- setcolor(0, 7);
- printf(" ");
- gotoxy(1, 0);
- setcolor(1, 7);
- printf("Score %d", score);
- gotoxy(12, 0);
- setcolor(5, 7);
- printf("Qualitify %d", quality);
- //Screen refresh
- Refresh();
- //Player control
- keybuff = 0;
- if (GetAsyncKeyState(VK_LEFT) & 0x8000)
- keybuff = 75;
- if (GetAsyncKeyState(VK_RIGHT) & 0x8000)
- keybuff = 77;
- if (GetAsyncKeyState(VK_UP) & 0x8000)
- keybuff = 72;
- if (GetAsyncKeyState(VK_DOWN) & 0x8000)
- keybuff = 80;
- if (keybuff != 0)
- {
- map[y][x] = 0;
- switch (keybuff)
- {
- case 72://up
- if (y > 0 && map[y - 1][x] != 1)
- y--;
- break;
- case 80://down
- if (y < 14 && map[y + 1][x] != 1)
- y++;
- break;
- case 75://left
- if (x > 0 && map[y][x - 1] != 1)
- x--;
- break;
- case 77://right
- if (x < 14 && map[y][x + 1] != 1)
- x++;
- break;
- }
- if (map[y][x] == 4)
- score++;
- }
- map[y][x] = 2;
- //Enemy control
- for (j = 0; j < enemies; j++)
- {
- //좌표 변경
- if (step % 5 == j)
- {
- map[ey[j]][ex[j]] = enemybuff[j];
- if (j % 2 == 0)
- {
- if (TraceX(x, ex[j], ey[j]) != 0)
- ex[j] += TraceX(x, ex[j], ey[j]);
- else
- ey[j] += TraceY(y, ex[j], ey[j]);
- }
- else
- {
- if (TraceY(y, ex[j], ey[j]) != 0)
- ey[j] += TraceY(y, ex[j], ey[j]);
- else
- ex[j] += TraceX(x, ex[j], ey[j]);
- }
- enemybuff[j] = map[ey[j]][ex[j]];
- map[ey[j]][ex[j]] = 3;
- if (ey[j] == y && ex[j] == x)
- {
- return 0;
- }
- }
- }
- step++;
- gotoxy(0, 16);
- if (score == quality)
- {
- gotoxy(0, 0);
- setcolor(0, 7);
- gotoxy(2, 7);
- setcolor(12);
- printf(" ");
- gotoxy(2, 8);
- printf(" CLEAR!!! ");
- gotoxy(2, 9);
- printf(" ");
- Sleep(2000);
- return 1;
- break;
- }
- Sleep(125);
- }
- return ret;
- }
- int main()
- {
- stage = 0;
- step = 0;
- system("mode con cols=40 lines=40");
- //Sleep(3000);
- getchar();
- while (stage < 2)
- {
- gameInit();
- if (Roof() == 1)
- stage++;
- else
- {
- Refresh();
- gotoxy(2, 7);
- setcolor(12);
- printf(" ");
- gotoxy(2, 8);
- printf(" GAME OVER ");
- gotoxy(2, 9);
- printf(" ");
- gotoxy(20, 20);
- break;
- }
- }
- Sleep(1000);
- gotoxy(20, 20);
- return 1;
- }
at 2022/11/11 12:01
덧글
굳이 이런 환경에서 개발해야 할 사정이 있는 회사가 아니면 이런식의 기술면접은 회사도 지원자도 피하라고 하고 싶네요.
게임 그래픽 디자이너 뽑는데 CG 놔두고 굳이 유화를 그려 테스트하는 격이라.
man 외엔 어떤 reference도 없는 폐쇄 환경에서 근무했었는데 저런 식으로 테스팅했었습니다.
과제 역시 단순 알고리즘 해결이 아닌 소규모 비즈니스에 적용할 수 있을 수준의 솔루션 구현이었고요.
네트워크는 당연히 단절, 오직 vi, gcc, man 권한만 부여하고 작업 디렉터리 또한 격리했었죠.
지금에야 오히려 이런 테스트 환경이 흔하지만 당시엔 paas나 container 개념도 없었던 옛날이었으니 독특했죠.