본문 바로가기

C

[C언어] 실습: Magic Matrix (마방진) 게임 만들기

반응형

Magic Matrix (마방진) 게임 만들기


<규칙>

1. 숫자는 1부터 1씩 증가해서 채워진다.

2. 숫자 1의 위치

   행 = 시작행, 열 = (int)(열 크기/2)

3. 다음 채워지는 숫자의 위치

   다음행 = 현재행 - 1

   다음열 = 현재열 +1

   이때, 행이 처음 행일 경우 다음행은 마지막 행으로, 열이 마지막 열일 경우 다음열은 시작열로 지정한다.

4. 다음에 채워질 위치에 이미 숫자가 존재할 경우,

   다음행 = 현재행 + 1

   다음열 = 현재열

   또는

   5의 배수(5, 10, 15 ...) 다음 숫자의 위치는

   다음행 = 현재행 + 1

   다음열 = 현재열

<출력>

17   24   1   8   15

23   5    7   14  16

4    6   13   20  22

10  12  19   21  3

11  18  25   2    9


#include<stdio.h>
#define SIZE 5

int main(){

   int m[SIZE][SIZE] = {0};
   int i, j, k = 0;

   printf("처음 시작 행 : ");
   scanf("%d", &i);

   j = (int)(SIZE / 2);

   m[i][j] = ++k;   // k에 '+1'을 해준 후 m[i][j]에 k값을 저장한다.

   for(++k; k <= SIZE * SIZE; k++){   // 초기값을 2로 주고 25까지 for문을 반복한다.
      if(i == 0) i += SIZE;           // 만약 i가 '0'이면, 다음 행은 i = 4가 되어야 한다.
      if(j == 4) j -= SIZE;

      if(m[i - 1][j + 1] != 0 || k % 5 == 1){   // 다음 칸에 이미 숫자가 존재하고, k가 5의 배수인 다음 칸은 (행 + 1, 열)이다.
         if(i == (0 + SIZE)) i -= SIZE;
         if(j == (4 - SIZE)) j += SIZE;
         if(i == 4) i -= SIZE;
         m[++i][j] = k;
      }
      else
         m[--i][++j] = k;
   }

   for(int i1 = 0; i1 < SIZE; i1++){
      for(int j1 = 0; j1 < SIZE; j1++)
         printf("%5d", m[i1][j1]);
      printf("\n");
   }

   return 0;
}

 

반응형