kangsecu's B1og

[네퓨즈 - 게임 프로젝트 알고리즘 보고서] 본문

포트폴리오/동아리 활동

[네퓨즈 - 게임 프로젝트 알고리즘 보고서]

Kangsecu 2017. 5. 24. 10:55

이번에는 게임 프로그래밍 보고서 에 이어서 실제 게임을 구현하며 작성한 코드의 알고리즘을 설명하는 알고리즘 보고서를 작성해 보도록 하겠습니다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

우선 작성한 함수는 총 N개로 MoveBlock() , Clear() , BlockSpawn() 이 있습니다. 각각 함수에 대하여 소개 하겠습니다.

1. Clear() 함수

1
2
3
4
5
6
7
8
void Clear() {//맵 전체를 뒤져서 전체에 공백 출력
   for (int x = 0; x < 200; x++) {
      for (int y = 0; y < 50; y++) {
         gotoxy(x, y);
         printf(" ");
      }
   }
}
cs

이 함수가 Clear()함수 입니다.이 앞에 이미 맵의 크기를 가로 200 세로 50 으로 설정을 하였습니다. 그럼 이제 위에 주석과 같이 맵 전체를 반복문을 통해 훑어서 맵 전체에 공백을 출력하는 함수라는 것을 알 수 있습니다. 


2.BlockSpawn()함수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//블럭 생성
void BlockSpawn() {//벽 생성을 위한 함수
   srand((unsigned int)time(NULL)); //현재 시간을 unsigned int형 seed로 함
 
   int sP = rand() % 4;      // 0 = 왼쪽 , 1 = 위 , 2 = 오른쪽 , 3 = 아래
   for (int i = 0; i < 4; i++) { // 벽 네개 생성
      if (sP % 2 == 0) {          // 움직이는 방향이 가로일 때
         Map[SPL[sP][0]][SPL[sP][1+ i] = WALL;
         continue;
      }
      Map[SPL[sP][0+ 2 * i][SPL[sP][1]] = WALL;
      Map[SPL[sP][0+ 2 * i + 1][SPL[sP][1]] = WALL;
   }
}

 

cs

이번에는 벽(블록)이 생기는 함수 입니다. rand 함수를 통해서 랜덤으로 값을 sP에 넣어줌. 가로에서는 반복문을 4번 돌려서 벽을 4개 생성

그 후, 이차원 배열인 Map을 통해 해당 위치에 벽을 생성한다. 세로에서는,벽을 8칸으로 홀수칸, 짝수칸을 나눠서 생성


3.Initialize() 함수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//게임 초기화
void Initialize() {
   Clear();
 
   memset(Map, 0sizeof(int* 200 * 50); // Map 변수 초기화
 
   MovePlayer(INITIALIZING);
 
   // 사각형 그리기 8*4 사각형
   for (int x = 0; x < 8; x++) {   // 가운데 가로 8칸
      for (int y = 0; y < 4; y++) { // 가운데 세로 4칸 
         Map[96 + x][23 + y] = RECT;// 해당 범위 내에 들어가면 사각형 영역 지정
         gotoxy(96 + x, 23 + y);// 해당 좌표로 이동
 
         if (x == 0 || x == 7) {// 만약 가로 첫번째나 마지막자리면 세로 기호 출력
            printf("|");
            continue;
         }
 
         if (y == 0 || y == 3)// 만약 세로 맨 위나 맨 아래에 있으면 가로 기호 출력
            printf("-");
      }
   }
}
cs

처음에 Clear() 함수를 선언후, memset 함수 를 사용하여 Map변수를 초기화 해주고 사용한다. 주석에 설명되어 있듯이, 해당 범위 내에 들어가면 사각형 영역 지정 함

4.Moveplayer() 함수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//플레이어 이동
void MovePlayer(char a) {
 
   static int p = 0//static 변수 p의 값 유지됨(함수 종료되도 유지)
 
   Map[position[p][0]][position[p][1]] = SPACE; // 현재 플레이어 좌표를 빈공간으로 바꿈
   gotoxy(position[p][0], position[p][1]);
   printf(" ");
 
   if (a != INITIALIZING) { // 초기화 중이 아닐때 실행 (평상시)
      if (a == LEFT) {//입력되는 키보드 값을 아스키 값으로 받아서 왼쪽 방향키면 p--;
         p--;
      }
      else if (a == RIGHT) {//위와 반대로 실행
         p++;
      }
 
      if (p == 4) {//p가 4가 되면 0으로 교환
         p = 0;
      }
      else if (p == -1) {
         p = 3;
      }
   }
   else // 초기화 중일때만 실행
      p = rand() % 4;
 
   Map[position[p][0]][position[p][1]] = PLAYER;// 새로 플레이어의 위치를 저장
   gotoxy(position[p][0], position[p][1]);// 새 좌표로 이동
   printf("0");
 
   return;
}
cs

함수 설명

5.MoveBlock() 함수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
void MoveBlock() {//벽을 움직이는 함수
 
 
   for (int y = 23; y <= 26; y++) {
      //left 
      for (int x = 95; x >= 5; x--) {//사용자의 위치인 98 부터 블럭이 생성되는 위치인 5 까지 돌림 ( 오른쪽에서 왼쪽으로 훑음)
         if (Map[x][y] == 1) { //맵 상에 벽이 있는 위치를 찾음
            gotoxy(x, y);    //원래 위치에 공백을 출력해서 벽을 지움
            printf(" ");
            Map[x][y] = 0;     //원래 벽이 있었던 위치에 0(공백) 을 출력
 
            if (x == 95)      // 플레이어가 다니는 범위에서는 벽이 더이상 전진 불가능
               continue;
 
            Map[x + 1][y] = 1//벽이 이동해서 출력될 위치를 저장
            gotoxy(x + 1, y);//현재위치에서 이동해서 다음 위치에 벽을 출력
            printf("@");
         }
      }
      //right
      for (int x = 104; x <= 195; x++) {
         if (Map[x][y] == 1) {
            gotoxy(x, y);
            printf(" ");
            Map[x][y] = 0;
 
            if (x == 104)
               continue;
 
            Map[x - 1][y] = 1;
            gotoxy(x - 1, y);
            printf("@");
         }
      }
   }
 
 
   for (int x = 95; x <= 104; x++) {
      //up
      for (int y = 22; y >= 1; y--) {
         if (Map[x][y] == 1) {
            Map[x][y] = 0;
            gotoxy(x, y);
            printf(" ");
 
            if (y == 22)
               continue;
 
            Map[x][y + 1= 1;
            gotoxy(x, y + 1);
            printf("@");
         }
      }
      //down
      for (int y = 27; y <= 48; y++) {
         if (Map[x][y] == 1) {
            Map[x][y] = 0;
            gotoxy(x, y);
            printf(" ");
 
            if (y == 27)
               continue;
 
            Map[x][y - 1= 1;
            gotoxy(x, y - 1);
            printf("@");
         }
      }
   }
   return;
}
cs

이번 함수는 BlockSpawn() 함수를 통해 랜덤으로 생성된 벽이 사용자의 캐릭터가 있는 가운데 사각형을 통해 이동하도록 하기 위해 만든 함수 입니다. 이차원 배열 Map에 현재 맵에 벽이 있는 위치를 조사한후, 원래 벽에 위치에 공백을 출력해서 벽을 지워주고 그 다음 좌표값에 벽을 생성한다. 조건문 if를 이용하여 이동하는 벽의 최대 이동 범위를 플레이어의 위치 까지로 설정함으로써 중앙의 사각형과의 충돌을 방지한다.이것을 네방향에서 반복해서 수행하여 준다.

6.CheckGameOver() 함수

1
2
3
4
5
6
7
8
// 게임오버 판정
int CheckGameOver() {
   for (int i = 0; i < 4; i++) {
      if (Map[position[i][0]][position[i][1]] == PLAYER) // 플레이어가 존재하지 않으면 게임 오버
         return 0;
   }
   return 1;
}
cs

이렇게 총4번 반복문을 통해서 해당위치에 플레이어가 존재하지 않으면 게임이 오버가 되게 하는 함수 입니다.

7.bgm  재생 코드

1
PlaySound(TEXT("Focus"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);//bgm재생
cs

Playsound 함수를 이용하여 Focus 라는 노래를 무한루프를 돌려 재생한다.