배열로는 이미 만들어 봐서 비트연산 방식으로 만들어 보고 있었음
방법은 다음과 같음
:
2bit씩 18bit를 할당할 수 있으므로
배열 말고도 그냥 int 하나만 있어도 된다.
2비트 중 첫 번째 비트는 칸이 놓여졌는지의 여부 기록,
두 번째 비트는 O, X의 구분 기록
그러면,
한 쪽의 승리 조건은
&= 11 11 11
00 00 00
00 00 00
&= 00 00 00
11 11 11
00 00 00
&= 00 00 00
00 00 00
11 11 11
&= 11 00 00
11 00 00
11 00 00
&= 00 11 00
00 11 00
00 11 00
&= 00 00 11
00 00 11
00 00 11
&= 11 00 00
00 11 00
00 00 11
&= 00 00 11
00 11 00
11 00 00
다른 한 쪽의 승리 조건은
&= 01 01 01
00 00 00
00 00 00
&= 00 00 00
01 01 01
00 00 00
&= 00 00 00
00 00 00
01 01 01
&= 01 00 00
01 00 00
01 00 00
&= 00 01 00
00 01 00
00 01 00
&= 00 00 01
00 00 01
00 00 01
&= 01 00 00
00 01 00
00 00 01
&= 00 00 01
00 01 00
01 00 00
이므로 각각
X의 경우
0x3F000
0x03FC0
0x0003F
0x30C30
0x0C30C
0x030C3
0x30303
0x03330
O의 경우
0x15000
0x00540
0x00015
0x10410
0x04104
0x01041
0x10101
0x01110
로 매칭된다.
따라서
int x = 0; if ((0x3F000 & x) == 0x3F000 || (0x03FC0 & x) == 0x03FC0 || (0x0003F & x) == 0x0003F || (0x30C30 & x) == 0x30C30 || (0x0C30C & x) == 0x0C30C || (0x030C3 & x) == 0x030C3 || (0x30303 & x) == 0x30303 || (0x03330 & x) == 0x03330 ) { std::cout << "X win"; } else if ((0x15000 & x) == 0x15000 || (0x00540 & x) == 0x00540 || (0x00015 & x) == 0x00015 || (0x10410 & x) == 0x10410 || (0x04104 & x) == 0x04104 || (0x01041 & x) == 0x01041 || (0x10101 & x) == 0x10101 || (0x01110 & x) == 0x01110 ) { std::cout << "O win"; }
승리 조건 판별하는데 너무 긴것 같은데 최적화안될까요?
제가 봤을 땐 이 방법은 답이 없는 것 같은데
어찌하면 좋을까요?
ㅁㅊㄷㅁㅊㅇ