반응형

생명 게임(game of life)라고 불리는 인구 증가 게임을 구현하여 보자. John H. Conway에 의해 발명된 생명 게임은 출생과 생존, 죽음의 모델을 가정한다. 이 게임은 가로와 세로로 20개씩의 셀을 갖는 보드 위에서 게임을 한다. 각 셀은 비어 있거나, 생명체를 나타내는 0 값을 가질 수 있다. 각 셀은 8개의 이웃을 갖는다. 생명체의 다음 세대는 다음 규칙에 따라 결정된다.

(a)출생-3개의 이웃에 사람이 살면 현재의 위치에서 사람이 탄생한다.

(b)죽음-4개 이상의 이웃에 사람이 살면 과밀로 인해 죽게 된다. 둘 보다 적은 이웃에만 사람이 살면 외로움으로 죽게 된다.

(c)생존-둘 또는 셋의 이웃에 사람이 살면 현 위치의 사람은 다음 세대까지 생존하게 된다. 예를 들어서 다음 그림은 하나의 세대에서 다음 세대로 

진행되는 모습을 보여 준다.


나는 생존을 1, 죽음을 0으로 표현 하였고 죽음과 생존을 한가지 함수로 표현하였다. 그리고 순서대로 함수가 진행 되는데 전게 바뀌면 다음 값의 결과가 바뀌어 버리니까 또다른 크기의 빈 배열을 만들어 그곳에다가 값들을 넣고 마지막에 한꺼번에 복사하였다.


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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <stdio.h>
#define SIZE 20
void printing(int a[][SIZE]);
void copy1(int ori[][SIZE],int cpy[][SIZE]);
void birth(int ori[][SIZE],int cpy[][SIZE]);
void death(int ori[][SIZE],int cpy[][SIZE]);
int main(void)
{        int ori[SIZE][SIZE]={
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
        int copy[SIZE][SIZE]={0,};
    int check=0;
    while(1){check=0;
    printf("계속하려면 1 종료하려면 2\n");
    printing(ori);
    birth(ori,copy);
    death(ori,copy);
    copy1(ori,copy);
    scanf("%d"&check);
    if(check==2)
        break;}
    return 0;}
void birth(int ori[][SIZE],int cpy[][SIZE])
{    int count=0;
    int *p= &ori[0][0];
    int *endp= &ori[SIZE-1][SIZE-1];
    int *cp=&cpy[0][0];
    while(p<=endp){
    if(*(p-SIZE-1)==1)
        count++;
    if(*(p-SIZE)==1)
        count++;
    if(*(p-SIZE+1)==1)
        count++;
    if(*(p+1)==1)
        count++;
    if(*(p-1)==1)
        count++;
    if(*(p+SIZE-1)==1)
        count++;
    if(*(p+SIZE)==1)
        count++;
    if(*(p+SIZE+1)==1)
        count++;
    if(*p==0&&count==3)
        *cp=1;
    count=0;
    p++;cp++;
    }}
void printing(int a[][SIZE])
{    int i,j;
    for(i=0;i<SIZE;i++)
    {for(j=0;j<SIZE;j++)
    {printf("%d ", a[i][j]);}
    printf("\n");}}
void copy1(int ori[][SIZE],int cpy[][SIZE])
{    int *p= &ori[0][0];
    int *endp= &ori[SIZE-1][SIZE-1];
    int *cp=&cpy[0][0];
    while(p<=endp)
    {*p=*cp;
    p++;cp++;}}
void death(int ori[][SIZE],int cpy[][SIZE])
{    int count=0;
    int *p= &ori[0][0];
    int *endp= &ori[SIZE-1][SIZE-1];
    int *cp=&cpy[0][0];
    while(p<=endp){
    if(*(p-SIZE-1)==1)
        count++;
    if(*(p-SIZE)==1)
        count++;
    if(*(p-SIZE+1)==1)
        count++;
    if(*(p+1)==1)
        count++;
    if(*(p-1)==1)
        count++;
    if(*(p+SIZE-1)==1)
        count++;
    if(*(p+SIZE)==1)
        count++;
    if(*(p+SIZE+1)==1)
        count++;
    if(*p==1&&((count>=4)||(count<2)))
        *cp=0;
    else if(*p==1&&(count==2||count==3))
        *cp=1;
    count=0;
    p++;cp++;}}
cs



이 게임의 패턴은 아래 사이트에서 확인할 수 있다. 여러가지를 넣어서 확인하여 보자.


https://namu.wiki/w/%EC%BD%98%EC%9B%A8%EC%9D%B4%EC%9D%98%20%EC%83%9D%EB%AA%85%20%EA%B2%8C%EC%9E%84


하는데 4일이나 걸렸네요.. 또다른 배열에 복사한다는 것을 생각을 못해서.. 후련합니다.




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

3개 정수 비교  (0) 2017.01.14
소스에 대한 질문 답하기  (0) 2017.01.13
2차원 배열 복사  (0) 2017.01.06
디지털 영상  (0) 2017.01.06
학생 성적 평균 구하기  (0) 2017.01.06

+ Recent posts