Juega Connect 4!

20

Escribe un programa para jugar el juego de Connect 4 . Se le da el estado del tablero como entrada y debe decidir en qué columna colocar su pieza para obtener 4 en fila (horizontal, vertical o diagonal) o bloquear a su oponente para que no haga lo mismo.

El tablero es una matriz de 6x7, donde cada celda puede estar vacía (''), contener su pieza ('X') o la pieza de su oponente ('O'). Un ejemplo de tablero:

O      
XX    X
XOX  OO
XOO OXO
OXXOXXO
XOXOXOX

Te gustaría jugar en la columna 3 (las columnas son 0-6, numeradas desde la izquierda) para la victoria diagonal. Entonces tu salida:

3

Su código debe generar un número de columna y debe cumplir los siguientes criterios:

  1. No puedes jugar en una columna que ya tiene 6 piezas.
  2. Si hay al menos un movimiento ganador, debes jugar uno de ellos.
  3. Si puedes evitar que tu oponente gane en su próximo movimiento, debes hacerlo.

Tenga en cuenta que el juego óptimo no es necesario, solo que obtiene una victoria inmediata o evita la victoria inmediata de su oponente. Si tu oponente tiene más de una forma de ganar, no necesitas bloquear ninguna de ellas.

Se le da el tablero en la entrada estándar y debe imprimir un número de columna en el que desea jugar en la salida estándar. Se garantiza que el tablero esté bien formado (sin agujeros, al menos un movimiento posible) y que no tenga una victoria para ninguno de los jugadores.

El código más corto gana.

Ejemplo 1

      X
      O
      X
      O
 OOO  X
 XXX  O

Debes jugar en la columna 0 o 4 para ganar.

Ejemplo 2

      X
X     X
O     O
XOX  XO
XXO XOX
XXO XXO

Debes jugar la columna 3 para bloquear la victoria inmediata de tu oponente.

Ejemplo 3

X      
XO     
OX    O
XO   XX
XXO OOO
OOO XXO

No puedes ganar o evitar que tu oponente gane, así que puedes jugar cualquier columna 1-6 (0 está lleno).

Ejemplo 4

X      
O      
X      
OOO    
XOX    
OXOX   

No puedes jugar en la columna 3, ya que permite que tu oponente gane de inmediato. Puedes jugar en las columnas 1-2 o 4-6.

Keith Randall
fuente

Respuestas:

9

C, 234 286 256 caracteres

Se corrigió para resolver correctamente el problema, al verificar los movimientos ganadores del oponente después de cada movimiento intentado.

Este código es muy sensible al formato del archivo de entrada: cada línea debe contener 7 caracteres + nueva línea.
El tablero se trata como una matriz de 8x8, en lugar de 7x6. La octava columna contiene las nuevas líneas y las 2 filas adicionales contienen ceros, por lo que no interfieren con la solución. Realmente ayudan: cuando se mueve hacia la derecha desde la columna más a la derecha, toca la columna de nueva línea, que sirve como una verificación de límites.

wcomprueba una posición para tener la oportunidad de ganar o bloquear. qdebería ser la celda para revisar. Utiliza la regresión para recorrer 4 direcciones (comienza con 9,8,7, luego varias veces 1).
Ccomprueba una secuencia de caracteres idénticos que comienzan qen la dirección d, tanto hacia adelante como hacia atrás. Devuelve la suma de ambas secuencias (sin contar la posición inicial), por lo que si devuelve 3, hay una fila de 4.

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);
}
Ugoren
fuente
5

Python 2.x - 594 591 576 557 523 459 458 433 bytes

Esto es lo mejor que he logrado hasta ahora. Supongo que es difícil vencer a C. Impresionante desafío, debo decir.

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]

La línea if (línea 7) tiene una sangría de una pestaña. A SE no le gustan las pestañas.

seequ
fuente
2
Paso demasiado tiempo refinando estos. Además, la versión de 458 bytes no funcionó correctamente, por ejemplo, # 4. Tomar 25 bytes de distancia y lo hace. Magia.
seequ