Connect 4를 플레이하십시오!


20

Connect 4 게임을하는 프로그램을 작성 하십시오 . 보드 상태를 입력으로 받으면 4 열을 가로 (세로, 세로 또는 대각선)로 만들거나 상대가 같은 것을 수행하지 못하도록 조각을 놓을 열을 결정해야합니다.

보드는 6x7 배열이며 각 셀은 비어 있거나 ( '') 조각 ( 'X') 또는 상대방 조각 ( 'O')을 포함 할 수 있습니다. 보드 예 :

O      
XX    X
XOX  OO
XOO OXO
OXXOXXO
XOXOXOX

대각선 승리를 위해 3 열 (열은 0-6, 왼쪽부터 번호가 매겨 짐)에서 재생하려고합니다. 그래서 당신은 출력 :

3

코드는 열 번호를 출력해야하며 다음 기준을 충족해야합니다.

  1. 이미 6 개 조각이있는 칼럼에서는 재생할 수 없습니다.
  2. 적어도 한 번의이기는 움직임이 있다면 그 중 하나를 플레이해야합니다.
  3. 상대방이 다음 움직임에서 이기지 못하게 막을 수 있다면 그렇게해야합니다.

최적의 플레이는 필요하지 않으며, 즉시 승리를 거두거나 상대방의 즉시 승리를 막을 수 있습니다. 상대방이 이길 수있는 방법이 두 가지 이상이면 그 중 하나를 막을 필요가 없습니다.

표준 입력에 보드가 제공되며 표준 출력에서 ​​재생할 열 번호를 인쇄해야합니다. 보드는 잘 구성되어 있고 (구멍이없고, 최소한 한 번은 움직일 수 있음), 두 선수 모두에게 아직 승리하지 않았습니다.

가장 짧은 코드가 승리합니다.

실시 예 1

      X
      O
      X
      O
 OOO  X
 XXX  O

승리를 위해서는 0 번 또는 4 번 열을 플레이해야합니다.

실시 예 2

      X
X     X
O     O
XOX  XO
XXO XOX
XXO XXO

상대방의 즉시 승리를 막으려면 3 열을 플레이해야합니다.

실시 예 3

X      
XO     
OX    O
XO   XX
XXO OOO
OOO XXO

상대방이이기거나 이기지 못하게 할 수 없으므로 1-6 열 (0이 꽉 참)을 재생할 수 있습니다.

실시 예 4

X      
O      
X      
OOO    
XOX    
OXOX   

상대방이 즉시 이길 수 있기 때문에 3 열에서는 플레이 할 수 없습니다. 1-2 열 또는 4-6 열에서 연주 할 수 있습니다.

답변:


9

C, 234 개 286 256 문자

시도 할 때마다 적의 승리를 확인하여 문제를 올바르게 해결하도록 수정했습니다.

이 코드는 입력 파일 형식에 매우 민감합니다. 각 줄은 7 자 + 개행 문자를 포함해야합니다.
보드는 7x6이 아닌 8x8 매트릭스로 취급됩니다. 8 번째 열은 개행을 포함하고 2 개의 추가 행은 0을 포함하므로 솔루션을 방해하지 않습니다. 그들은 실제로 도움이됩니다-가장 오른쪽 열에서 오른쪽으로 이동할 때 경계 검사 역할을하는 줄 바꿈 열을 누르십시오.

w이기거나 막을 기회가 있는지 한 위치를 확인합니다. q확인할 셀이어야합니다. 그것은 reursion을 사용하여 4 방향을 반복합니다 (9,8,7로 시작한 다음 몇 번 1). 방향
C에서 시작하여 앞뒤로 동일한 문자 시퀀스를 확인 합니다. 시작 위치를 세지 않고 두 시퀀스의 합계를 반환하므로 3을 반환하면 4의 행이 있습니다.qd

char B[99],q;
C(i,d){
    return B[d*i+++q]-B[q]?d>0?C(1,-d):0:1+C(i,d);
}
w(x){
    return x&&C(1,x>6?x:1)>2|w(x-1);
}
t(l,c,r,v){
    for(;c--;)B[q=c]&32&B[c+8]-32?r=w(9,B[c]=l)?v=c:v||r*t(79,l,0,1)?r:c,B[c]=32:0;
    return r;
}
main(){
    putchar(48+t(88,16+read(0,B+16,48),0,0)%8);
}

5

파이썬 2.x- 594 559576557 523 459 458 433 바이트

이것이 내가 지금까지 달성 한 최고입니다. 나는 C를이기는 것이 어렵다고 생각한다. 굉장한 도전이다.

r=range
f=[]
exec'f+=list(raw_input());'*6
def n(p):
 o,b,a,k=[],1,'O',lambda q:any([o[i:i+4]==list(q)*4for o in(f[x-x%7:],f[x%7::7])for i in r(3)]+[all(q==f[7*(y+u*i)+z+i]for i in r(4))for u,z,v,c in((1,0,3,4),(-1,3,6,3))for y in r(z,v)for z in r(c)])
 for x in r(42):
    if x>34<a>f[x]or x<35and f[x+7]>'0'>f[x]:f[x]=p;z=k(p)*b;o=z*[x]+o+[x]*(a==p or n(a)[1]);b-=z;f[x]=' '
 return o[0]%7,b
a,b,c,d=n('X')+n('O')
print(a,(c,a)[d])[b]

if-line (7 행)에는 탭 하나가 들여 쓰기되어 있습니다. SE는 탭을 좋아하지 않습니다.


2
나는 이것을 정제하는데 너무 많은 시간을 소비한다. 또한 458 바이트 버전은 예를 들어 # 4에서 올바르게 작동하지 않았습니다. 25 바이트를 가져 가십시오. 마법.
seequ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.