자작 게임도 잘 부탁드려요~

adsense



당신에게 c(c++) 컴파일러만 주어졌다면

이것이 진정한 콘솔게임이다!?



어떤 게임을 만들 수 있겠습니까?

트위터에서 본 이 썰 때문에 한 번 해 본건데요, (애시당초 조건이 너무 불특정함.. 책은 괜찮은지? 그래픽 라이브러리는 사용하는지? 그래픽 에셋은 주어지는지? <- 일단 다 없다고 가정하고, 그럼 텍스트 출력으로 로직 중심이네 라는 발상으로 접근)

음.. 그런데 개발자 선발 테스트로는 별로 좋아보이진 않네요.
거 있잖아요. 인터넷 검색 다 되는 오픈북 시험이 세상에서 제일 어려운 시험인거.

차라리 게임 프로그래밍 패턴 관련된 과제를 내는게 맞을 것 같은데.

하여튼 이 코드는 vc++로 만들어졌고, 키 입력 처리나 컬러 코드 지정 때문에 인터넷 검색했으니 조건은 위반..입니다.


  1. // ConsoleMan.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
  2. //
  3. #include <iostream>
  4. #include <Windows.h>
  5.  
  6. using namespace std;
  7.  
  8. int map[15][15];
  9. int quality;
  10. int enemies;
  11. int i, j, k;
  12. int score = 0;
  13. int x, y;
  14. int ex[5], ey[5];
  15. int enemybuff[5];
  16. int step;
  17. int stage;
  18. SHORT keybuff = 0;
  19.  
  20. void gotoxy(int x, int y)
  21. {
  22.     COORD pos = { x,y };
  23.     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
  24. }
  25. void setcolor(int color)
  26. {
  27.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
  28. }
  29. void setcolor(int color, int bcolor)
  30. {
  31.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color | bcolor << 4);
  32. }
  33. int SetStage(int stageNum)
  34. {
  35.     int _quality = 0;
  36.     switch (stageNum)
  37.     {
  38.     case 0:
  39.     {
  40.         int _map[15][15] = {
  41.             {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  42.             {1,4,4,4,4,4,4,4,4,4,4,4,4,4,1},
  43.             {1,4,1,1,1,1,4,4,4,1,1,1,1,4,1},
  44.             {1,4,1,4,4,4,4,4,4,4,4,4,1,4,1},
  45.             {1,4,1,4,4,4,4,4,4,4,4,4,1,4,1},
  46.             {1,4,1,4,4,1,4,4,4,4,4,4,1,4,1},
  47.             {1,4,4,4,4,1,4,4,4,4,4,4,4,4,1},
  48.             {1,4,1,1,1,1,4,4,4,1,1,1,1,4,1},
  49.             {1,4,4,4,4,4,4,4,4,1,4,4,4,4,1},
  50.             {1,4,1,4,4,4,4,4,4,1,4,4,1,4,1},
  51.             {1,4,1,4,4,4,4,4,4,4,4,4,1,4,1},
  52.             {1,4,1,4,4,4,4,4,4,4,4,4,1,4,1},
  53.             {1,4,1,1,1,1,4,4,4,1,1,1,1,4,1},
  54.             {1,4,4,4,4,4,4,4,4,4,4,4,4,4,1},
  55.             {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  56.         };
  57.         for (int y = 0; y < 15; y++)
  58.         {
  59.             for (int x = 0; x < 15; x++)
  60.             {
  61.                 map[y][x] = _map[y][x];
  62.                 if (_map[y][x] == 4)
  63.                     _quality++;
  64.             }
  65.         }
  66.     }
  67.     break;
  68.     case 1:
  69.     {
  70.         int _map[15][15] = {
  71.             {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  72.             {1,4,4,4,4,4,4,4,4,4,4,4,4,4,1},
  73.             {1,4,1,1,1,1,1,4,1,1,1,1,1,4,1},
  74.             {1,4,1,4,4,4,4,4,4,4,4,4,1,4,1},
  75.             {1,4,1,4,1,4,1,1,1,1,1,4,1,4,1},
  76.             {1,4,1,4,1,4,1,4,4,4,1,4,1,4,1},
  77.             {1,4,1,4,1,4,4,4,4,4,1,4,1,4,1},
  78.             {1,4,4,4,1,1,1,1,4,1,1,4,4,4,1},
  79.             {1,4,1,4,4,4,1,4,4,4,1,4,1,4,1},
  80.             {1,4,1,4,1,4,1,4,1,4,1,4,1,4,1},
  81.             {1,4,1,4,1,4,1,4,1,1,1,4,1,4,1},
  82.             {1,4,1,4,1,4,4,4,4,4,4,4,1,4,1},
  83.             {1,4,1,1,1,1,1,4,1,1,1,1,1,4,1},
  84.             {1,4,4,4,4,4,4,4,4,4,4,4,4,4,1},
  85.             {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  86.         };
  87.         for (int y = 0; y < 15; y++)
  88.         {
  89.             for (int x = 0; x < 15; x++)
  90.             {
  91.                 map[y][x] = _map[y][x];
  92.                 if (_map[y][x] == 4)
  93.                     _quality++;
  94.             }
  95.         }
  96.     }
  97.     break;
  98.     }
  99.  
  100.     return _quality;
  101. }
  102. int TraceX(int x, int ex, int ey)
  103. {
  104.     if (> ex && (map[ey][ex + 1] != 1 && map[ey][ex + 1] != 3))
  105.         return 1;
  106.     else
  107.         if (< ex && (map[ey][ex - 1] != 1 && map[ey][ex - 1] != 3))
  108.             return -1;
  109.  
  110.     return 0;
  111. }
  112. int TraceY(int y, int ex, int ey)
  113. {
  114.     if (> ey && map[ey + 1][ex] != 1)
  115.         return 1;
  116.     else
  117.         if (< ey && map[ey - 1][ex] != 1)
  118.             return -1;
  119.  
  120.     return 0;
  121. }
  122. void Refresh()
  123. {
  124.     gotoxy(01);
  125.     for (= 0; j < 15; j++)
  126.     {
  127.         for (= 0; k < 15; k++)
  128.         {
  129.             switch (map[j][k])
  130.             {
  131.             case 0://space
  132.                 printf("  ");
  133.                 break;
  134.             case 1://wall
  135.                 setcolor(7);
  136.                 printf("□");
  137.                 break;
  138.             case 2://player
  139.                 setcolor(2);
  140.                 printf("♣");
  141.                 break;
  142.             case 3://enemy
  143.                 setcolor(4);
  144.                 printf("◈");
  145.                 break;
  146.             case 4://item
  147.                 setcolor(6);
  148.                 printf("*");
  149.                 break;
  150.             }
  151.         }
  152.         printf("\n");
  153.     }
  154. }
  155. void gameInit()
  156. {
  157.     gotoxy(00);
  158.     setcolor(07);
  159.     printf("       ConsoleMan Game        ");
  160.  
  161.     x = 6;
  162.     y = 6;
  163.     score = 0;
  164.     quality = SetStage(stage);
  165.  
  166.     enemies = stage + 1;
  167.     for (= 0; i < enemies; i++)
  168.     {
  169.         switch (i)
  170.         {
  171.         case 0:
  172.             ex[i] = 1;
  173.             ey[i] = 1;
  174.             break;
  175.         case 1:
  176.             ex[i] = 13;
  177.             ey[i] = 13;
  178.             break;
  179.         }
  180.         enemybuff[i] = map[ey[i]][ex[i]];
  181.     }
  182.  
  183.     if (map[y][x] == 4)
  184.         score++;
  185.  
  186.     i = 4;
  187.     while (> 0)
  188.     {
  189.         if (% 2 == 1)
  190.         {
  191.             gotoxy(27);
  192.             setcolor(9);
  193.             printf("                          ");
  194.             gotoxy(28);
  195.             printf("        STAGE %d          ", stage + 1);
  196.             gotoxy(29);
  197.             printf("                          ");
  198.         }
  199.  
  200.         else
  201.         {
  202.             Refresh();
  203.         }
  204.         i--;
  205.         Sleep(1000);
  206.     }
  207. }
  208. int Roof()
  209. {
  210.     int ret = 0;
  211.  
  212.     while (true)
  213.     {
  214.         gotoxy(00);
  215.         setcolor(07);
  216.         printf("                              ");
  217.  
  218.         gotoxy(10);
  219.         setcolor(17);
  220.         printf("Score %d", score);
  221.         gotoxy(120);
  222.         setcolor(57);
  223.         printf("Qualitify %d", quality);
  224.  
  225.         //Screen refresh
  226.         Refresh();
  227.  
  228.         //Player control
  229.         keybuff = 0;
  230.         if (GetAsyncKeyState(VK_LEFT) & 0x8000)
  231.             keybuff = 75;
  232.         if (GetAsyncKeyState(VK_RIGHT) & 0x8000)
  233.             keybuff = 77;
  234.         if (GetAsyncKeyState(VK_UP) & 0x8000)
  235.             keybuff = 72;
  236.         if (GetAsyncKeyState(VK_DOWN) & 0x8000)
  237.             keybuff = 80;
  238.  
  239.         if (keybuff != 0)
  240.         {
  241.             map[y][x] = 0;
  242.  
  243.  
  244.             switch (keybuff)
  245.             {
  246.             case 72://up
  247.                 if (> 0 && map[- 1][x] != 1)
  248.                     y--;
  249.                 break;
  250.             case 80://down
  251.                 if (< 14 && map[+ 1][x] != 1)
  252.                     y++;
  253.                 break;
  254.             case 75://left
  255.                 if (> 0 && map[y][- 1] != 1)
  256.                     x--;
  257.                 break;
  258.             case 77://right
  259.                 if (< 14 && map[y][+ 1] != 1)
  260.                     x++;
  261.                 break;
  262.             }
  263.             if (map[y][x] == 4)
  264.                 score++;
  265.         }
  266.         map[y][x] = 2;
  267.  
  268.         //Enemy control
  269.         for (= 0; j < enemies; j++)
  270.         {
  271.             //좌표 변경
  272.             if (step % 5 == j)
  273.             {
  274.                 map[ey[j]][ex[j]] = enemybuff[j];
  275.                 if (% 2 == 0)
  276.                 {
  277.                     if (TraceX(x, ex[j], ey[j]) != 0)
  278.                         ex[j] += TraceX(x, ex[j], ey[j]);
  279.                     else
  280.                         ey[j] += TraceY(y, ex[j], ey[j]);
  281.                 }
  282.                 else
  283.                 {
  284.                     if (TraceY(y, ex[j], ey[j]) != 0)
  285.                         ey[j] += TraceY(y, ex[j], ey[j]);
  286.                     else
  287.                         ex[j] += TraceX(x, ex[j], ey[j]);
  288.                 }
  289.                 enemybuff[j] = map[ey[j]][ex[j]];
  290.                 map[ey[j]][ex[j]] = 3;
  291.                 if (ey[j] == y && ex[j] == x)
  292.                 {
  293.                     return 0;
  294.                 }
  295.             }
  296.         }
  297.         step++;
  298.  
  299.         gotoxy(016);
  300.  
  301.         if (score == quality)
  302.         {
  303.             gotoxy(00);
  304.             setcolor(07);
  305.             gotoxy(27);
  306.             setcolor(12);
  307.             printf("                          ");
  308.             gotoxy(28);
  309.             printf("         CLEAR!!!         ");
  310.             gotoxy(29);
  311.             printf("                          ");
  312.             Sleep(2000);
  313.             return 1;
  314.             break;
  315.         }
  316.  
  317.         Sleep(125);
  318.     }
  319.  
  320.     return ret;
  321. }
  322. int main()
  323. {
  324.     stage = 0;
  325.     step = 0;
  326.  
  327.     system("mode con cols=40 lines=40");
  328.  
  329.     //Sleep(3000);
  330.     getchar();
  331.  
  332.     while (stage < 2)
  333.     {
  334.         gameInit();
  335.         if (Roof() == 1)
  336.             stage++;
  337.         else
  338.         {
  339.             Refresh();
  340.             gotoxy(27);
  341.             setcolor(12);
  342.             printf("                          ");
  343.             gotoxy(28);
  344.             printf("        GAME OVER         ");
  345.             gotoxy(29);
  346.             printf("                          ");
  347.             gotoxy(2020);
  348.             break;
  349.         }
  350.     }
  351.     Sleep(1000);
  352.     gotoxy(2020);
  353.  
  354.     return 1;
  355. }
  356.  



덧글

  • 포스21 2022/11/16 10:36 # 답글

    쩝.. 이거 참 실제 이런문제를 만나면 대비를 안한 사람은 당혹스럽겠네요.
  • 펭귄대왕 2022/11/16 16:16 #

    옛날 생각도 나고 해서 심심풀이로 해 본거긴 한데,
    굳이 이런 환경에서 개발해야 할 사정이 있는 회사가 아니면 이런식의 기술면접은 회사도 지원자도 피하라고 하고 싶네요.
    게임 그래픽 디자이너 뽑는데 CG 놔두고 굳이 유화를 그려 테스트하는 격이라.
  • 나그네 2022/11/21 11:32 # 삭제 답글

    옛날 생각 나네요.
    man 외엔 어떤 reference도 없는 폐쇄 환경에서 근무했었는데 저런 식으로 테스팅했었습니다.
    과제 역시 단순 알고리즘 해결이 아닌 소규모 비즈니스에 적용할 수 있을 수준의 솔루션 구현이었고요.
    네트워크는 당연히 단절, 오직 vi, gcc, man 권한만 부여하고 작업 디렉터리 또한 격리했었죠.
    지금에야 오히려 이런 테스트 환경이 흔하지만 당시엔 paas나 container 개념도 없었던 옛날이었으니 독특했죠.
  • 펭귄대왕 2022/11/22 22:37 #

    모비일 기준으론 피쳐폰 시절까지만 해도 사실 저 조건이랑 크게 다르지 않은 환경이었던 것 같네요..
댓글 입력 영역


Books

Geek라이프

기초부터 시작하는 모형 전자공작
박성윤 저

사이토 나오키의 일러스트 첨삭 레슨 Before & After
사이토 나오키 저/박수현 역

MSX&재믹스 퍼펙트 카탈로그
마에다 히로유키 저/조기현 역

핵심강좌! Cocos2d-x
이재환 저
예스24 | 애드온2
일본서적 전문사이트 NEPIC