Advertisement
liiit

proj 150 : 140601 (D-127)

Jun 1st, 2014
539
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 18.29 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <string.h>
  5.  
  6. int mapid, maxa, maxb, a, b;
  7. int pa, pb, paa, pbb;
  8. int over = 0;
  9. int map[35][21][20];
  10. int wall_list[21][20];
  11. int road_list[210];
  12. int enemy_list[35][150];
  13. int road_count = 0;
  14.  
  15. int designed_map[8][21][20] =
  16. {
  17.     {
  18.         {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  19.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  20.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  21.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  22.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  23.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  24.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  25.         {1,0,0,0,0,0,0,0,0,0,0,0,1200,0,0,0,0,0,0,1},
  26.         {1,0,0,0,0,0,0,0,0,0,0,0,1200,0,0,0,0,0,0,1},
  27.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  28.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  29.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  30.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  31.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  32.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  33.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  34.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  35.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  36.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  37.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  38.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
  39.     },
  40.     {
  41.         {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  42.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  43.         {1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1},
  44.         {1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1},
  45.         {1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1},
  46.         {1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1},
  47.         {1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1},
  48.         {1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1},
  49.         {1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1},
  50.         {1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1},
  51.         {1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1},
  52.         {1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1},
  53.         {1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1},
  54.         {1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1},
  55.         {1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1},
  56.         {1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1},
  57.         {1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1},
  58.         {1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1},
  59.         {1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},
  60.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  61.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
  62.     },
  63.     {
  64.         {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  65.         {1,1,1,1,1,1,1,1,1,4,4,1,1,1,1,1,1,1,1,1},
  66.         {1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},
  67.         {1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},
  68.         {1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1},
  69.         {1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},
  70.         {1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
  71.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  72.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  73.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  74.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  75.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  76.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  77.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  78.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  79.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  80.         {1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
  81.         {1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},
  82.         {1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},
  83.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  84.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
  85.     },
  86.     {
  87.         {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  88.         {1,1,1,1,1,1,1,1,1,4,4,1,1,1,1,1,1,1,1,1},
  89.         {1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},
  90.         {1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},
  91.         {1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1},
  92.         {1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},
  93.         {1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
  94.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  95.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  96.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  97.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  98.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  99.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  100.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  101.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  102.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  103.         {1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
  104.         {1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},
  105.         {1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},
  106.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  107.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
  108.     },
  109.     {
  110.         {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  111.         {1,1,1,1,1,1,1,1,1,4,4,1,1,1,1,1,1,1,1,1},
  112.         {1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},
  113.         {1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},
  114.         {1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1},
  115.         {1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},
  116.         {1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
  117.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  118.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  119.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  120.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  121.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  122.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  123.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  124.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  125.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  126.         {1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
  127.         {1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},
  128.         {1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},
  129.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  130.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
  131.     },
  132.     {
  133.         {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  134.         {1,1,1,1,1,1,1,1,1,4,4,1,1,1,1,1,1,1,1,1},
  135.         {1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},
  136.         {1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},
  137.         {1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1},
  138.         {1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},
  139.         {1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
  140.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  141.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  142.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  143.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  144.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  145.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  146.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  147.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  148.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  149.         {1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
  150.         {1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},
  151.         {1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},
  152.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  153.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
  154.     },
  155.     {
  156.         {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  157.         {1,1,1,1,1,1,1,1,1,4,4,1,1,1,1,1,1,1,1,1},
  158.         {1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},
  159.         {1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},
  160.         {1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1},
  161.         {1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},
  162.         {1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
  163.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  164.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  165.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  166.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  167.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  168.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  169.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  170.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  171.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  172.         {1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
  173.         {1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},
  174.         {1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},
  175.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  176.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
  177.     },
  178.     {
  179.         {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  180.         {1,1,1,1,1,1,1,1,1,4,4,1,1,1,1,1,1,1,1,1},
  181.         {1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},
  182.         {1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},
  183.         {1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1},
  184.         {1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},
  185.         {1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
  186.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  187.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  188.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  189.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  190.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  191.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  192.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  193.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  194.         {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  195.         {1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
  196.         {1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},
  197.         {1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},
  198.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  199.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
  200.     }
  201. };
  202. // 미로 생성 관련 함수 :
  203. // int mapprnt(), int mapprnt_p(), int wall_check(int a, int b, int type)
  204. // int outer_check(int a, int b), int road(int a, int b), int mazegen(int ma, int mb)
  205. int mapprnt(int id)
  206. // map[mapid][a][b] 에 대한 전체 맵 출력.
  207. {
  208.     int a,b;
  209.     for (a = 1 ; a < sizeof(map[0]) / sizeof(map[0][0]) ; a++)
  210.     { // 헤더 부분을 출력하지 않도록 a = 1 로 설정
  211.         for (b = 0; b < sizeof(map[0][0]) / sizeof(map[0][0][0]) ; b++)
  212.         {
  213.             switch (map[id][a][b])
  214.             {
  215.                 case 0 : printf ("  "); break;
  216.                 case 1 : printf ("[]"); break;
  217.                 case 2 : printf ("M "); break;
  218.                 case 3 : printf ("UP"); break;
  219.                 case 4 : printf ("DN"); break;
  220.                 case 8 : printf ("# "); break;
  221.                 default :
  222.                 if (map[id][a][b] >= 100 && map[id][a][b] < 200)
  223.                 {
  224.                     printf ("@ ");
  225.                 }
  226.                 if (map[id][a][b] >= 1000)
  227.                 {
  228.                     printf ("%% ");
  229.                 }
  230.                 break;
  231.             }
  232.         }
  233.         printf ("\n");
  234.     }
  235.     printf ("\n");
  236.     return 0;
  237. }
  238. int mapprnt_p(int id)
  239. // map[mapid][a][b] 에 대한 전체 맵 출력. 플레이어 4방향 3칸까지만 보이게 출력.
  240. // 나머지 보이지 않는 영역은 || 로 표시한다.
  241. {
  242.     int a,b;
  243.     for (a = 1 ; a < sizeof(map[0]) / sizeof(map[0][0]) ; a++)
  244.     { // 헤더 부분을 출력하지 않도록 a = 1 로 설정
  245.         for (b = 0; b < sizeof(map[0][0]) / sizeof(map[0][0][0]) ; b++)
  246.         {
  247.             if (a >= pa-3 && a <= pa+3 && b >= pb-3 && b <= pb+3)
  248.             {
  249.                 switch (map[id][a][b])
  250.                 {
  251.                     case 0 : printf ("  "); break;
  252.                     case 1 : printf ("[]"); break;
  253.                     case 2 : printf ("M "); break;
  254.                     case 3 : printf ("UP"); break;
  255.                     case 4 : printf ("DN"); break;
  256.                     case 8 : printf ("# "); break;
  257.                     default :
  258.                     if (map[id][a][b] >= 100 && map[id][a][b] < 200)
  259.                     {
  260.                         printf ("@ ");
  261.                     }
  262.                     if (map[id][a][b] >= 1000)
  263.                     {
  264.                         printf ("%% ");
  265.                     }
  266.                     break;
  267.                 }
  268.             }
  269.             else
  270.             {
  271.                 printf ("||");
  272.             }
  273.         }
  274.         printf ("\n");
  275.     }
  276.     printf ("\n");
  277.     return 0;
  278. }
  279.  
  280. int mapprnt_s(int id, int a, int b, int sight)
  281. // map[mapid][a][b] 에 대해 (a,b) 좌표 주변 4방향 7칸까지만 보이게 출력.
  282. // 배열에 포함되지 않는 부분은 안보임 표시로 출력함.
  283. // 시야 시스템 추가. (원형 : sight가 반지름)
  284. {
  285.     int i,j;
  286.     for (i = a-6 ; i <= a+8 ; i++)
  287.     { // 헤더 부분을 출력하지 않도록 a = 1 로 설정
  288.         for (j = b-7; j <= b+7 ; j++)
  289.         {
  290.             if (i >= 1 && i < sizeof(map[0]) / sizeof(map[0][0]) && j >= 0 && j < sizeof(map[0][0]) / sizeof(map[0][0][0]))
  291.             {
  292.                 if (((i-a) * (i-a)) + ((j-b) * (j-b)) <= (sight * sight))
  293.                 {
  294.                     switch (map[id][i][j])
  295.                     {
  296.                         case 0 : printf ("::"); break;
  297.                         case 1 : printf ("[]"); break;
  298.                         case 2 : printf ("M "); break;
  299.                         case 3 : printf ("UP"); break;
  300.                         case 4 : printf ("DN"); break;
  301.                         case 8 : printf ("# "); break;
  302.                         default :
  303.                         if (map[id][i][j] >= 100 && map[id][i][j] < 200)
  304.                         {
  305.                             printf ("@ ");
  306.                         }
  307.                         if (map[id][i][j] >= 1000)
  308.                         {
  309.                             printf ("%% ");
  310.                         }
  311.                         break;
  312.                     }
  313.                 }
  314.                 else
  315.                 {
  316.                     printf ("##");
  317.                 }
  318.             }
  319.             else
  320.             {
  321.                 printf ("##");
  322.             }
  323.         }
  324.         printf ("\n");
  325.     }
  326.     printf ("\n");
  327.     return 0;
  328. }
  329.  
  330. int mapp (int id, int sight)
  331. {
  332.     switch (sight)
  333.     {
  334.         case 0 : mapprnt_p(id); break;
  335.         case 1 : mapprnt(id); break;
  336.     }
  337.     return 0;
  338. }
  339. int wall_check(int id, int a, int b, int type)
  340. // 선택된 좌표 a,b 의 주변 벽이 몇 개인지 세어 그 수를 반환함.
  341. // type = 1이면 주변 벽들을 벽 리스트에 저장함.
  342. // type = 2이면 외곽 벽의 개수를 반환함.
  343. {
  344.     if (type != 2)
  345.     {
  346.         int count = 0;
  347.         if (map[id][a][b+1] == 1)
  348.         {
  349.             count++;
  350.             if (type == 1 && wall_list[a][b+1] != 2)
  351.             {
  352.                 wall_list[a][b+1] = 1;
  353.             }
  354.         }
  355.         if (map[id][a][b-1] == 1)
  356.         {
  357.             count++;
  358.             if (type == 1 && wall_list[a][b-1] != 2)
  359.             {
  360.                 wall_list[a][b-1] = 1;
  361.             }
  362.         }
  363.         if (map[id][a+1][b] == 1)
  364.         {
  365.             count++;
  366.             if (type == 1 && wall_list[a+1][b] != 2)
  367.             {
  368.                 wall_list[a+1][b] = 1;
  369.             }
  370.         }
  371.         if (map[id][a-1][b] == 1)
  372.         {
  373.             count++;
  374.             if (type == 1 && wall_list[a-1][b] != 2)
  375.             {
  376.                 wall_list[a-1][b] = 1;
  377.             }
  378.         }
  379.         return count;
  380.     }
  381.     else if (type == 2)
  382.     {
  383.         int outer_count = 0;
  384.         if (wall_list[a][b+1] == 2)
  385.         {
  386.             outer_count++;
  387.         }
  388.         if (wall_list[a][b-1] == 2)
  389.         {
  390.             outer_count++;
  391.         }
  392.         if (wall_list[a+1][b] == 2)
  393.         {
  394.             outer_count++;
  395.         }
  396.         if (wall_list[a-1][b] == 2)
  397.         {
  398.             outer_count++;
  399.         }
  400.     return outer_count;
  401.     }
  402. }
  403.  
  404. int road(int id, int a, int b)
  405. // 현 좌표가 길이면 길 리스트에 저장함.
  406. // (a, b) 를 a*100 + b 형태로 저장한다. [(2,3) 의 경우 203으로 저장됨]
  407. {
  408.     if (map[id][a][b] == 0)
  409.     {
  410.         road_list[road_count] = a*100 + b;
  411.     }
  412.     road_count++;
  413. }
  414.  
  415. int mazegen(int id, int ma, int mb)
  416. // 미로 생성 함수. Prim's Algorithm 에 의해 미로를 랜덤으로 생성한다.
  417. {
  418.     int temp_a, temp_b, done, s_i, s_j, s_k, s_l;
  419.     map[id][0][0] = 1; // 맵 헤더의 랜덤 생성 여부에 체크
  420.     do
  421.     {
  422.         done = 0;
  423.         switch (rand() % 4)
  424.         {
  425.             case 0 : temp_a = ma-1; temp_b = mb; s_i = 1; break;
  426.             case 1 : temp_a = ma; temp_b = mb+1; s_l = 1; break;
  427.             case 2 : temp_a = ma+1; temp_b = mb; s_k = 1; break;
  428.             case 3 : temp_a = ma; temp_b = mb-1; s_j = 1; break;
  429.         }
  430.         if (map[id][temp_a][temp_b] == 1 && wall_list[temp_a][temp_b] != 2)
  431.         {
  432.             if (wall_check(id, temp_a, temp_b, 0) == 3)
  433.             {
  434.                 map[id][temp_a][temp_b] = 0;
  435.                 wall_list[temp_a][temp_b] = 0;
  436.                 ma = temp_a; mb = temp_b;
  437.                 wall_check(id,ma,mb,1);
  438.                 road (id,ma,mb);
  439.                 s_i = 0; s_l = 0; s_k = 0; s_j = 0;
  440.             }
  441.         }
  442.         else if (temp_a != ma && temp_b != mb)
  443.         {
  444.             temp_a = ma; temp_b = mb;
  445.         }
  446.         else
  447.         {
  448.         }
  449.         if (s_i == 1 && s_j == 1 && s_k == 1 && s_l == 1)
  450.         {
  451.             done = 1;
  452.         }
  453.         if (wall_check(id, temp_a, temp_b, 2) != 0)
  454.         {
  455.             done = 1;
  456.         }
  457.        
  458.     } while (done == 0);
  459.     return 0;
  460. }
  461.  
  462. int move()
  463. // 플레이어 캐릭터 (@) 의 이동 관련 함수.
  464. // i : UP, j : LEFT, k : DOWN, l : RIGHT, Q : QUIT 에 대응.
  465. // 여기선 getch() 를 쓸 수 없으니 scanf("%c", &key); 로 대신한다.
  466. {
  467.     char key;
  468.     scanf("%c", &key);
  469.     switch ((int)key)
  470.     {
  471.         case 105 :
  472.             paa = pa-1; pbb = pb; break;
  473.         case 106 :
  474.             paa = pa; pbb = pb-1; break;
  475.         case 107 :
  476.             paa = pa+1; pbb = pb; break;
  477.         case 108 :
  478.             paa = pa; pbb = pb+1; break;
  479.         case 81 :
  480.             printf ("Quit\n"); over = 1; break;
  481.     }
  482.     if (map[mapid][paa][pbb] != 1 && paa >= 1 && paa < sizeof(map[0]) / sizeof(map[0][0]) && pbb >= 0 && pbb < sizeof(map[0][0]) / sizeof(map[0][0][0]))
  483.     {
  484.         if (pa != paa || pb != pbb)
  485.         {
  486.             map[mapid][paa][pbb] += 100;
  487.             map[mapid][pa][pb] = map[mapid][pa][pb] % 100;
  488.         }
  489.         pa = paa; pb = pbb;
  490.     }
  491.     else
  492.     {
  493.         printf ("* : can't move\n");
  494.         paa = pa; pbb = pb;
  495.     }
  496.     mapprnt(mapid);
  497.     return 0;
  498. }
  499.  
  500.  
  501. int enemygen(int id)
  502. {
  503.     int i, e_pos;
  504.     for (i = 1 ; i < (id + rand() % 4) / 2 ; i++)
  505.     {
  506.         e_pos = road_list[rand() % road_count];
  507.         enemy_list[id][i * 3 - 2] = 1000 + ((id / 2) + (rand() % 3)) * 100; // enemy level
  508.         enemy_list[id][i * 3 - 1] = e_pos / 100;
  509.         enemy_list[id][i * 3 - 0] = e_pos % 100;
  510.         map[id][enemy_list[id][i * 3 - 1]][enemy_list[id][i * 3 - 0]] = enemy_list[id][i * 3 - 2];
  511.         enemy_list[id][0]++;
  512.     }
  513.     return 0;
  514. }
  515.  
  516.  
  517. int mapgen()
  518. { // 전체 맵에 대한 생성함수
  519.     int i,j,k;
  520.     int w_i, w_k;
  521.     int m,n;
  522.     int ra, rb;
  523.     int up, dn;
  524.     int up_a, up_b, dn_a, dn_b;
  525.     int mazegen_count;
  526.     int rndmap;
  527.     int totalgen = 0;
  528.     int dmap_id;
  529.    
  530.     for (i = 0 ; i < sizeof(map) / sizeof(map[0]) ; i++)
  531.     { // 한 개의 맵
  532.         dmap_id = rand() % 8;
  533.         rndmap = rand() % 100;
  534.         for (m = 0 ; m < sizeof(wall_list) / sizeof(wall_list[0]) ; m++)
  535.         {
  536.             for (n = 0 ; n < sizeof(wall_list[0]) / sizeof(wall_list[0][0]) ; n++)
  537.             {
  538.                 wall_list[m][n] = 0;
  539.             }
  540.         }
  541.         mazegen_count = 0;
  542.         road_count = 0;
  543.         memset(road_list, 0, sizeof(road_list) / sizeof(road_list[0]));
  544.        
  545.         if (rndmap < 70)
  546.         {
  547.             for (j = 0 ; j < sizeof(map[0]) / sizeof(map[0][0]) ; j++)
  548.             {
  549.                 for (k = 0 ; k < sizeof(map[0][0]) / sizeof(map[0][0][0]) ; k++)
  550.                 {
  551.                     if (j == 0)
  552.                     {
  553.                         map[i][j][k] = 0;
  554.                     }
  555.                     else
  556.                     {
  557.                         map[i][j][k] = 1;
  558.                     }
  559.                 }
  560.             }
  561.             maxa = (sizeof(map[0]) / sizeof(map[0][0])) - 1;
  562.             maxb = sizeof(map[0][0]) / sizeof(map[0][0][0]);
  563.             int wmaxa = (sizeof(wall_list) / sizeof(wall_list[0]));
  564.             int wmaxb = sizeof(wall_list[0]) / sizeof(wall_list[0][0]);
  565.             // outer wall을 2로 하여 wall_list에 저장 {
  566.             for (w_k=0 ; w_k<wmaxb ; w_k++)
  567.             {
  568.                 wall_list[1][w_k] = 2;
  569.             }
  570.             for (w_i=0 ; w_i<wmaxa ; w_i++)
  571.             {
  572.                 wall_list[w_i][0] = 2;
  573.             }
  574.             for (w_k=0 ; w_k<wmaxb ; w_k++)
  575.             {
  576.                 wall_list[wmaxa-1][w_k] = 2;
  577.             }
  578.             for (w_i=0 ; w_i<wmaxa ; w_i++)
  579.             {
  580.                 wall_list[w_i][wmaxb-1] = 2;
  581.             }
  582.             //}
  583.             ra = rand() % (maxa - 4); rb = rand() % (maxb - 4);
  584.             map[i][ra+2][rb+2] = 0;
  585.             a = ra+2; b = rb+2;
  586.             wall_check(i,a,b,1);
  587.             road(i,a,b);
  588.             mazegen(i,a,b);
  589.             while (road_count < ((maxa-2) * (maxb-2) + 4) / 2 || mazegen_count < (maxa-2 * maxb-2) / 2)
  590.             {
  591.                 mazegen(i, road_list[rand() % road_count] / 100, road_list[rand() % road_count] % 100);
  592.                 mazegen_count++;
  593.             }
  594.             up = road_list[rand() % road_count];
  595.             dn = road_list[rand() % road_count];
  596.             up_a = up / 100;
  597.             up_b = up % 100;
  598.             dn_a = dn / 100;
  599.             dn_b = dn % 100;
  600.             map[i][up_a][up_b] = 3;
  601.             map[i][dn_a][dn_b] = 4;
  602.             map[i][0][0] = 0;
  603.             map[i][0][1] = dn_a;
  604.             map[i][0][2] = dn_b;
  605.             map[i][0][3] = up_a;
  606.             map[i][0][4] = up_b;
  607.             enemygen(i);
  608.         }
  609.         else if (rndmap >= 70)
  610.         {
  611.             for (j = 0 ; j < sizeof(map[0]) / sizeof(map[0][0]) ; j++)
  612.             {
  613.                 for (k = 0 ; k < sizeof(map[0][0]) / sizeof(map[0][0][0]) ; k++)
  614.                 {
  615.                     map[i][j][k] = designed_map[dmap_id][j][k];
  616.                 }
  617.             }
  618.             map[i][0][0] = dmap_id + 1;
  619.         }
  620.         /*printf ("mapid : %d\n", i);
  621.         printf ("road_count : %d\n", road_count);
  622.         totalgen += mazegen_count;
  623.         printf ("totalgen : %d\n", totalgen);
  624.         printf("%d %d %d %d %d\n", map[i][0][0], map[i][0][1], map[i][0][2], map[i][0][3], map[i][0][4]);
  625.         mapp(i,1);*/
  626.     }
  627.    
  628.     return 0;
  629. }
  630.  
  631. int main(void) {
  632.     srand(time(NULL));
  633.     printf ("== generating map.. == \n");
  634.     mapgen();
  635.     printf ("== complete! == \n");
  636.     mapprnt_s(33,7,7,8);
  637.     mapprnt_s(33,7,7,7);
  638.     mapprnt_s(33,7,9,7);
  639.     mapprnt_s(33,7,13,7);
  640.     mapprnt_s(33,7,16,7);
  641.     mapprnt_s(33,7,18,7);
  642.     mapprnt_s(33,7,18,4);
  643.     mapprnt_s(33,7,18,2);
  644.    
  645.    
  646.    
  647.     return 0;
  648. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement